Partilhar via


Integrar o Azure Functions com o Azure Data Explorer usando associações de entrada e saída (visualização)

Importante

Esse conector pode ser usado no Real-Time Intelligence no Microsoft Fabric. Use as instruções neste artigo com as seguintes exceções:

O Azure Functions permite que você execute código sem servidor na nuvem em uma programação ou em resposta a um evento. Com as associações de entrada e saída do Azure Data Explorer para o Azure Functions, você pode integrar o Azure Data Explorer em seus fluxos de trabalho para ingerir dados e executar consultas em seu cluster.

Pré-requisitos

Experimente a integração com o nosso projeto de exemplo

Como usar associações do Azure Data Explorer para o Azure Functions

Para obter informações sobre como usar as associações do Azure Data Explorer para o Azure Functions, consulte os seguintes tópicos:

Cenários para usar associações do Azure Data Explorer para o Azure Functions

As seções a seguir descrevem alguns cenários comuns para usar associações do Azure Data Explorer para o Azure Functions.

Enlaces de entrada

As ligações de entrada executam uma consulta KQL (Kusto Query Language) ou função KQL, opcionalmente com parâmetros, e retornam a saída para a função.

As seções a seguir descrevem como usar associações de entrada em alguns cenários comuns.

Cenário 1: Um ponto de extremidade HTTP para consultar dados de um cluster

O uso de associações de entrada é aplicável em situações em que você precisa expor dados do Azure Data Explorer por meio de uma API REST. Nesse cenário, você usa um gatilho HTTP do Azure Functions para consultar dados em seu cluster. O cenário é particularmente útil em situações em que você precisa fornecer acesso programático aos dados do Azure Data Explorer para aplicativos ou serviços externos. Ao expor seus dados por meio de uma API REST, os aplicativos podem consumir prontamente os dados sem exigir que eles se conectem diretamente ao cluster.

O código define uma função com um gatilho HTTP e uma associação de entrada do Azure Data Explorer. A associação de entrada especifica a consulta a ser executada na tabela Products no banco de dados productsdb . A função usa a coluna productId como o predicado passado como um parâmetro.

{
    [FunctionName("GetProduct")]
    public static async Task<IActionResult> RunAsync(
        [HttpTrigger(AuthorizationLevel.User, "get", Route = "getproducts/{productId}")]
        HttpRequest req,
        [Kusto(Database:"productsdb" ,
        KqlCommand = "declare query_parameters (productId:long);Products | where ProductID == productId" ,
        KqlParameters = "@productId={productId}",
        Connection = "KustoConnectionString")]
        IAsyncEnumerable<Product> products)
    {
        IAsyncEnumerator<Product> enumerator = products.GetAsyncEnumerator();
        var productList = new List<Product>();
        while (await enumerator.MoveNextAsync())
        {
            productList.Add(enumerator.Current);
        }
        await enumerator.DisposeAsync();
        return new OkObjectResult(productList);
    }
}

A função pode então ser invocada, da seguinte forma:

curl https://myfunctionapp.azurewebsites.net/api/getproducts/1

Cenário 2: Um gatilho agendado para exportar dados de um cluster

O cenário a seguir é aplicável em situações em que os dados precisam ser exportados em um cronograma baseado em tempo.

O código define uma função com um gatilho de temporizador que exporta uma agregação de dados de vendas do banco de dados productsdb para um arquivo CSV no Armazenamento de Blobs do Azure.

public static async Task Run([TimerTrigger("0 0 1 * * *")] TimerInfo myTimer,
    [Kusto(ConnectionStringSetting = "KustoConnectionString",
            DatabaseName = "productsdb",
            Query = "ProductSales | where OrderDate >= ago(1d) | summarize Sales = sum(ProductSales) by ProductName | top 10 by Sales desc")] IEnumerable<dynamic> queryResults,
[Blob("salescontainer/productsblob.csv", FileAccess.Write, Connection = "BlobStorageConnection")] CloudBlockBlob outputBlob,
ILogger log)
{
    // Write the query results to a CSV file
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {
        csv.WriteRecords(queryResults);
        writer.Flush();
        stream.Position = 0;
        await outputBlob.UploadFromStreamAsync(stream);
    }
}

Enlaces de saída

As ligações de saída usam uma ou mais linhas e as inserem numa tabela do Azure Data Explorer.

As seções a seguir descrevem como usar associações de saída em alguns cenários comuns.

Cenário 1: Ponto de extremidade HTTP para ingerir dados num cluster

O cenário a seguir é aplicável em situações em que solicitações HTTP de entrada precisam ser processadas e ingeridas em seu cluster. Usando uma associação de saída, os dados de entrada da solicitação podem ser gravados em tabelas do Azure Data Explorer.

O código define uma função com um gatilho HTTP e uma ligação de saída do Azure Data Explorer. Essa função pega uma carga JSON no corpo da solicitação HTTP e a grava na tabela products no banco de dados productsdb .

public static IActionResult Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductuni")]
    HttpRequest req, ILogger log,
    [Kusto(Database:"productsdb" ,
    TableName ="products" ,
    Connection = "KustoConnectionString")] out Product product)
{
    log.LogInformation($"AddProduct function started");
    string body = new StreamReader(req.Body).ReadToEnd();
    product = JsonConvert.DeserializeObject<Product>(body);
    string productString = string.Format(CultureInfo.InvariantCulture, "(Name:{0} ID:{1} Cost:{2})",
                product.Name, product.ProductID, product.Cost);
    log.LogInformation("Ingested product {}", productString);
    return new CreatedResult($"/api/addproductuni", product);
}

A função pode então ser invocada, da seguinte forma:

curl -X POST https://myfunctionapp.azurewebsites.net/api/addproductuni -d '{"Name":"Product1","ProductID":1,"Cost":100,"ActivatedOn":"2023-01-02T00:00:00"}'

Cenário 2: Ingerir dados do RabbitMQ ou de outros sistemas de mensagens suportados no Azure

O cenário a seguir é aplicável em situações em que os dados de um sistema de mensagens precisam ser ingeridos em seu cluster. Usando uma associação de saída, os dados de entrada do sistema de mensagens podem ser ingeridos em tabelas do Azure Data Explorer.

O código define uma função com mensagens, dados em formato JSON, recebidos através de um gatilho RabbitMQ que são introduzidos na tabela products no banco de dados productsdb.

public class QueueTrigger
{
    [FunctionName("QueueTriggerBinding")]
    [return: Kusto(Database: "productsdb",
                TableName = "products",
                Connection = "KustoConnectionString")]
    public static Product Run(
        [RabbitMQTrigger(queueName: "bindings.products.queue", ConnectionStringSetting = "rabbitMQConnectionAppSetting")] Product product,
        ILogger log)
    {
        log.LogInformation($"Dequeued product {product.ProductID}");
        return product;
    }
}

Para obter mais informações sobre funções, consulte a documentação do Azure Functions. A extensão do Azure Data Explorer está disponível em: