Partilhar via


Integrar Funções do Azure com o Azure Data Explorer através de enlaces de entrada e saída (pré-visualização)

Importante

Este conector pode ser utilizado na Análise em Tempo Real no Microsoft Fabric. Utilize as instruções neste artigo com as seguintes exceções:

Funções do Azure permitem-lhe executar código sem servidor na cloud com base numa agenda ou em resposta a um evento. Com o Azure Data Explorer enlaces de entrada e saída para Funções do Azure, pode integrar o Azure Data Explorer nos fluxos de trabalho para ingerir dados e executar consultas no cluster.

Pré-requisitos

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

Como utilizar enlaces de Data Explorer do Azure para Funções do Azure

Para obter informações sobre como utilizar enlaces de Data Explorer do Azure para Funções do Azure, veja os seguintes tópicos:

Cenários para utilizar enlaces de Data Explorer do Azure para Funções do Azure

As secções seguintes descrevem alguns cenários comuns para utilizar enlaces de Data Explorer do Azure para Funções do Azure.

Enlaces de entrada

Os enlaces de entrada executam uma consulta Linguagem de Pesquisa Kusto (KQL) ou função KQL, opcionalmente com parâmetros, e devolvem o resultado à função.

As secções seguintes descrevem como utilizar enlaces de entrada em alguns cenários comuns.

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

A utilização de enlaces de entrada é aplicável em situações em que precisa de expor os dados do Azure Data Explorer através de uma API REST. Neste cenário, vai utilizar um Funções do Azure acionador HTTP para consultar dados no cluster. O cenário é particularmente útil em situações em que precisa de fornecer acesso programático aos dados Data Explorer do Azure para aplicações ou serviços externos. Ao expor os seus dados através de uma API REST, as aplicações podem consumir facilmente os dados sem que estes se liguem diretamente ao cluster.

O código define uma função com um acionador HTTP e um enlace de entrada do Azure Data Explorer. O enlace de entrada especifica a consulta a executar na tabela Produtos na base de dados productsdb . A função utiliza a coluna productId como o predicado transmitido 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);
    }
}

Em seguida, a função pode ser invocada, da seguinte forma:

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

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

O cenário seguinte é aplicável em situações em que os dados têm de ser exportados numa agenda baseada no tempo.

O código define uma função com um acionador de temporizador que exporta uma agregação de dados de vendas da base de dados productsdb para um ficheiro 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

Os enlaces de saída pegam numa ou mais linhas e inserem-nas numa tabela do Azure Data Explorer.

As secções seguintes descrevem como utilizar enlaces de saída em alguns cenários comuns.

Cenário 1: ponto final HTTP para ingerir dados num cluster

O cenário seguinte é aplicável em situações em que os pedidos HTTP recebidos têm de ser processados e ingeridos no cluster. Ao utilizar um enlace de saída, os dados recebidos do pedido podem ser escritos em tabelas de Data Explorer do Azure.

O código define uma função com um acionador HTTP e um enlace de saída do Azure Data Explorer. Esta função utiliza um payload JSON no corpo do pedido HTTP e escreve-o na tabela products na base 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);
}

Em seguida, a função pode 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 seguinte é aplicável em situações em que os dados de um sistema de mensagens têm de ser ingeridos no cluster. Ao utilizar um enlace de saída, os dados recebidos do sistema de mensagens podem ser ingeridos nas tabelas de Data Explorer do Azure.

O código define uma função com mensagens, dados no formato JSON, recebidos através de um acionador RabbitMQ que são ingeridos na tabela de produtos na base 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, veja Funções do Azure documentação. A extensão do Azure Data Explorer está disponível em: