Criar uma aplicação para executar comandos de gestão

Neste artigo, vai aprender a:

Pré-requisitos

Configure o seu ambiente de desenvolvimento para utilizar a biblioteca de cliente Kusto.

Executar um comando de gestão e processar os resultados

No seu IDE ou editor de texto preferido, crie um projeto ou ficheiro denominado comandos de gestão com a convenção adequada para o seu idioma preferido. Em seguida, adicione o seguinte código:

  1. Crie uma aplicação cliente que ligue o cluster. Substitua o <your_cluster_uri> marcador de posição pelo nome do cluster.

    Nota

    Para comandos de gestão, irá utilizar o método de fábrica de CreateCslAdminProvider cliente.

    using Kusto.Data;
    using Kusto.Data.Net.Client;
    
    namespace ManagementCommands {
      class ManagementCommands {
        static void Main(string[] args) {
          var clusterUri = "<your_cluster_uri>";
          var kcsb = new KustoConnectionStringBuilder(clusterUri)
              .WithAadUserPromptAuthentication();
    
          using (var kustoClient = KustoClientFactory.CreateCslAdminProvider(kcsb)) {
          }
        }
      }
    }
    
  2. Defina uma função que imprima o comando que está a ser executado e as respetivas tabelas resultantes. Esta função descompacta os nomes das colunas nas tabelas de resultados e imprime cada par nome-valor numa nova linha.

    static void PrintResultsAsValueList(string command, IDataReader response) {
      while (response.Read()) {
        Console.WriteLine("\n{0}\n", new String('-', 20));
        Console.WriteLine("Command: {0}", command);
        Console.WriteLine("Result:");
        for (int i = 0; i < response.FieldCount; i++) {
          Console.WriteLine("\t{0} - {1}", response.GetName(i), response.IsDBNull(i) ? "None" : response.GetString(i));
        }
      }
    }
    
  3. Defina o comando a executar. O comando cria uma tabela denominada MyStormEvents e define o esquema da tabela como uma lista de nomes e tipos de coluna. Substitua o <your_database> marcador de posição pelo nome da base de dados.

    string database = "<your_database>";
    string table = "MyStormEvents";
    
    // Create a table named MyStormEvents
    // The brackets contain a list of column Name:Type pairs that defines the table schema
    string command = @$".create table {table}
                      (StartTime:datetime,
                       EndTime:datetime,
                       State:string,
                       DamageProperty:int,
                       DamageCrops:int,
                       Source:string,
                       StormSummary:dynamic)";
    
  4. Execute o comando e imprima o resultado com a função definida anteriormente.

    Nota

    Irá utilizar o ExecuteControlCommand método para executar o comando .

    using (var response = kustoClient.ExecuteControlCommand(database, command, null)) {
      PrintResultsAsValueList(command, response);
    }
    

O código completo deve ter o seguinte aspeto:

using Kusto.Data;
using Kusto.Data.Net.Client;

namespace ManagementCommands {
  class ManagementCommands {
    static void Main(string[] args) {
      string clusterUri = "https://<your_cluster_uri>";
      var kcsb = new KustoConnectionStringBuilder(clusterUri)
          .WithAadUserPromptAuthentication();

      using (var kustoClient = KustoClientFactory.CreateCslAdminProvider(kcsb)) {
        string database = "<your_database>";
        string table = "MyStormEvents";

        // Create a table named MyStormEvents
        // The brackets contain a list of column Name:Type pairs that defines the table schema
        string command = @$".create table {table} 
                          (StartTime:datetime,
                           EndTime:datetime,
                           State:string,
                           DamageProperty:int,
                           DamageCrops:int,
                           Source:string,
                           StormSummary:dynamic)";

        using (var response = kustoClient.ExecuteControlCommand(database, command, null)) {
          PrintResultsAsValueList(command, response);
        }
      }
    }

    static void PrintResultsAsValueList(string command, IDataReader response) {
      while (response.Read()) {
        Console.WriteLine("\n{0}\n", new String('-', 20));
        Console.WriteLine("Command: {0}", command);
        Console.WriteLine("Result:");
        for (int i = 0; i < response.FieldCount; i++) {
          Console.WriteLine("\t{0} - {1}", response.GetName(i), response.IsDBNull(i) ? "None" : response.GetString(i));
        }
      }
    }
  }
}

Executar a aplicação

Numa shell de comandos, utilize o seguinte comando para executar a sua aplicação:

# Change directory to the folder that contains the management commands project
dotnet run .

Deverá ver um resultado semelhante ao seguinte:

--------------------

Command: .create table MyStormEvents 
                 (StartTime:datetime,
                  EndTime:datetime,
                  State:string,
                  DamageProperty:int,
                  Source:string,
                  StormSummary:dynamic)
Result:
   TableName - MyStormEvents
   Schema - {"Name":"MyStormEvents","OrderedColumns":[{"Name":"StartTime","Type":"System.DateTime","CslType":"datetime"},{"Name":"EndTime","Type":"System.DateTime","CslType":"datetime"},{"Name":"State","Type":"System.String","CslType":"string"},{"Name":"DamageProperty","Type":"System.Int32","CslType":"int"},{"Name":"Source","Type":"System.String","CslType":"string"},{"Name":"StormSummary","Type":"System.Object","CslType":"dynamic"}]}
   DatabaseName - MyDatabaseName
   Folder - None
   DocString - None

Alterar a política de criação de batches de ingestão ao nível da tabela

Pode personalizar o comportamento de criação de batches de ingestão para tabelas ao alterar a política de tabela correspondente. Para obter mais informações, veja IngestionBatching policy (Política IngestionBatching).

Nota

Se não especificar todos os parâmetros de um PolicyObject, os parâmetros não especificados serão definidos como valores predefinidos. Por exemplo, especificar apenas "MaximumBatchingTimeSpan" resultará na predefinição "MaximumNumberOfItems" e "MaximumRawDataSizeMB".

Por exemplo, pode modificar a aplicação para alterar o valor de tempo limite da política de criação de batches de ingestão para 30 segundos ao alterar a ingestionBatching política para a MyStormEvents tabela com o seguinte comando:

// Reduce the default batching timeout to 30 seconds
command = @$".alter-merge table {table} policy ingestionbatching '{{ ""MaximumBatchingTimeSpan"":""00:00:30"" }}'";

using (var response = kustoClient.ExecuteControlCommand(database, command, null))
{
  PrintResultsAsValueList(command, response);
}

Quando adicionar o código à sua aplicação e executá-lo, deverá ver um resultado semelhante ao seguinte:

--------------------

Command: .alter-merge table MyStormEvents policy ingestionbatching '{ "MaximumBatchingTimeSpan":"00:00:30" }'
Result:
   PolicyName - IngestionBatchingPolicy
   EntityName - [YourDatabase].[MyStormEvents]
   Policy - {
  "MaximumBatchingTimeSpan": "00:00:30",
  "MaximumNumberOfItems": 500,
  "MaximumRawDataSizeMB": 1024
}
   ChildEntities - None
   EntityType - Table

Mostrar a política de retenção ao nível da base de dados

Pode utilizar comandos de gestão para apresentar a política de retenção de uma base de dados.

Por exemplo, pode modificar a aplicação para apresentar a política de retenção da base de dados com o seguinte código. O resultado é organizado para projetar duas colunas do resultado:

// Show the database retention policy (drop some columns from the result)
command = @$".show database {database} policy retention | project-away ChildEntities, EntityType";

using (var response = kustoClient.ExecuteControlCommand(database, command, null)) {
  PrintResultsAsValueList(command, response);
}

Quando adicionar o código à sua aplicação e executá-lo, deverá ver um resultado semelhante ao seguinte:

--------------------

Command: .show database YourDatabase policy retention | project-away ChildEntities, EntityType
Result:
   PolicyName - RetentionPolicy
   EntityName - [YourDatabase]
   Policy - {
  "SoftDeletePeriod": "365.00:00:00",
  "Recoverability": "Enabled"
}

Passo seguinte