Бөлісу құралы:


Выходные привязки Azure Data Explorer для Функции Azure (предварительная версия)

При выполнении функции выходная привязка Azure Data Explorer отправляет данные в Azure Data Explorer.

Сведения об установке и настройке см. в обзорной статье.

Примеры

Функцию C# можно создать с помощью одного из следующих режимов C#:

  • Изолированная рабочая модель: скомпилированная функция C#, которая выполняется в рабочем процессе, изолированном от среды выполнения. Изолированный рабочий процесс необходим для поддержки функций C#, работающих в LTS и не LTS-версиях .NET и платформа .NET Framework.
  • Модель внутрипроцессного процесса: скомпилированная функция C#, которая выполняется в том же процессе, что и среда выполнения Функций.
  • Скрипт C#: используется в основном при создании функций C# в портал Azure.

Дополнительные примеры выходной привязки Azure Data Explorer доступны в репозитории GitHub.

Этот раздел содержит следующие примеры.

Примеры относятся к классу Product и соответствующей таблице базы данных:

public class Product
{
    [JsonProperty(nameof(ProductID))]
    public long ProductID { get; set; }

    [JsonProperty(nameof(Name))]
    public string Name { get; set; }

    [JsonProperty(nameof(Cost))]
    public double Cost { get; set; }
}
.create-merge table Products (ProductID:long, Name:string, Cost:double)

Триггер HTTP, одна запись

В следующем примере показана функция C#, которая добавляет запись в базу данных. Функция использует данные, предоставленные в HTTP-запросе POST в виде текста JSON.

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;

namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
    public static class AddProduct
    {
        [Function("AddProduct")]
        [KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products")]
        public static async Task<Product> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductuni")]
            HttpRequestData req)
        {
            Product? prod = await req.ReadFromJsonAsync<Product>();
            return prod ?? new Product { };
        }
    }
}

Триггер HTTP, запись записей с сопоставлением

В следующем примере показана функция C#, которая добавляет коллекцию записей в базу данных. Функция использует сопоставление, которое преобразует в Product Item.

Для преобразования данных из Product Itemнее функция использует ссылку на сопоставление:

.create-merge table Item (ItemID:long, ItemName:string, ItemCost:float)


-- Create a mapping that transforms an Item to a Product

.create-or-alter table Product ingestion json mapping "item_to_product_json" '[{"column":"ProductID","path":"$.ItemID"},{"column":"Name","path":"$.ItemName"},{"column":"Cost","path":"$.ItemCost"}]'
namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common
{
    public class Item
    {
        public long ItemID { get; set; }

        public string? ItemName { get; set; }

        public double ItemCost { get; set; }
    }
}
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;

namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
    public static class AddProductsWithMapping
    {
        [Function("AddProductsWithMapping")]
        [KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products", MappingRef = "item_to_product_json")]
        public static async Task<Item> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductswithmapping")]
            HttpRequestData req)
        {
            Item? item = await req.ReadFromJsonAsync<Item>();
            return item ?? new Item { };
        }
    }
}

Дополнительные примеры входной привязки Java Azure Data Explorer доступны в репозитории GitHub.

Этот раздел содержит следующие примеры.

Примеры относятся к классу Products (в отдельном файле Product.java) и соответствующей таблице Products базы данных (определенной ранее):

package com.microsoft.azure.kusto.common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {
    @JsonProperty("ProductID")
    public long ProductID;
    @JsonProperty("Name")
    public String Name;
    @JsonProperty("Cost")
    public double Cost;

    public Product() {
    }

    public Product(long ProductID, String name, double Cost) {
        this.ProductID = ProductID;
        this.Name = name;
        this.Cost = Cost;
    }
}

Триггер HTTP, запись записывается в таблицу

В следующем примере показана выходная привязка Azure Data Explorer в функции Java, которая добавляет запись продукта в таблицу. Функция использует данные, предоставленные в HTTP-запросе POST в виде текста JSON. Функция принимает другую зависимость от библиотеки com.fasterxml.jackson.core для анализа текста JSON.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.1</version>
</dependency>
package com.microsoft.azure.kusto.outputbindings;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;

import java.io.IOException;
import java.util.Optional;

import static com.microsoft.azure.kusto.common.Constants.*;

public class AddProduct {
    @FunctionName("AddProduct")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
            HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addproductuni") HttpRequestMessage<Optional<String>> request,
            @KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product)
            throws IOException {

        if (request.getBody().isPresent()) {
            String json = request.getBody().get();
            ObjectMapper mapper = new ObjectMapper();
            Product p = mapper.readValue(json, Product.class);
            product.setValue(p);
            return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
                    .build();
        } else {
            return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
                    .build();
        }
    }
}

Триггер HTTP, запись в две таблицы

В следующем примере показана выходная привязка Azure Data Explorer в функции Java, которая добавляет записи в базу данных в двух разных таблицах (Product и ProductChangeLog). Функция использует данные, предоставленные в HTTP-запросе POST в качестве текста JSON и нескольких выходных привязок. Функция принимает другую зависимость от библиотеки com.fasterxml.jackson.core для анализа текста JSON.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.1</version>
</dependency>

Вторая таблица ProductsChangeLog соответствует следующему определению:

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

и класс Java в ProductsChangeLog.java:

package com.microsoft.azure.kusto.common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class ProductsChangeLog {
    @JsonProperty("ProductID")
    public long ProductID;
    @JsonProperty("CreatedAt")
    public String CreatedAt;

    public ProductsChangeLog() {
    }

    public ProductsChangeLog(long ProductID, String CreatedAt) {
        this.ProductID = ProductID;
        this.CreatedAt = CreatedAt;
    }
}
package com.microsoft.azure.kusto.outputbindings;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;
import com.microsoft.azure.kusto.common.ProductsChangeLog;

import static com.microsoft.azure.kusto.common.Constants.*;

import java.io.IOException;
import java.time.Clock;
import java.time.Instant;
import java.util.Optional;

public class AddMultiTable {
    @FunctionName("AddMultiTable")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
            HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addmultitable") HttpRequestMessage<Optional<String>> request,
            @KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product,
            @KustoOutput(name = "productChangeLog", database = "productsdb", tableName = "ProductsChangeLog",
                    connection = KUSTOCONNSTR) OutputBinding<ProductsChangeLog> productChangeLog)
            throws IOException {

        if (request.getBody().isPresent()) {
            String json = request.getBody().get();
            ObjectMapper mapper = new ObjectMapper();
            Product p = mapper.readValue(json, Product.class);
            product.setValue(p);
            productChangeLog.setValue(new ProductsChangeLog(p.ProductID, Instant.now(Clock.systemUTC()).toString()));
            return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
                    .build();
        } else {
            return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
                    .build();
        }
    }
}

Дополнительные примеры выходной привязки Azure Data Explorer доступны в репозитории GitHub.

Этот раздел содержит следующие примеры.

Примеры ссылаются на таблицу базы данных.

Примеры ссылаются на таблицы Products и ProductsChangeLog (определенные ранее).

Триггер HTTP, запись записей в таблицу

В следующем примере показана выходная привязка Azure Data Explorer в файле function.json и функция JavaScript, которая добавляет записи в таблицу. Функция использует данные, предоставленные в HTTP-запросе POST в виде текста JSON.

В следующем примере приведены данные привязки в файле function.json :

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "methods": [
        "post"
      ],
      "route": "addproduct"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    }
  ],
  "disabled": false
}

В разделе Конфигурация описываются эти свойства.

Следующий фрагмент кода JavaScript является примером кода JavaScript:

// Insert the product, which will insert it into the Products table.
module.exports = async function (context, req) {
    // Note that this expects the body to be a JSON object or array of objects which have a property
    // matching each of the columns in the table to insert to.
    context.bindings.product = req.body;
    return {
        status: 201,
        body: req.body
    };
}

Триггер HTTP, запись в две таблицы

В следующем примере показана выходная привязка Azure Data Explorer в файле function.json и функция JavaScript, которая добавляет записи в базу данных в двух разных таблицах (ProductsиProductsChangeLog). Функция использует данные, предоставленные в HTTP-запросе POST в качестве текста JSON и нескольких выходных привязок.

Вторая таблица ProductsChangeLog соответствует следующему определению:

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

Следующий фрагмент кода — привязка данных в файле function.json :

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "methods": [
        "post"
      ],
      "route": "addmultitable"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    },
    {
      "name": "productchangelog",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "ProductsChangeLog",
      "connection": "KustoConnectionString"
    }
  ],
  "disabled": false
}

В разделе Конфигурация описываются эти свойства.

Следующий фрагмент кода JavaScript является примером кода JavaScript:

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger and Kusto output binding function processed a request.');
    context.log(req.body);

    if (req.body) {
        var changeLog = {ProductID:req.body.ProductID, CreatedAt: new Date().toISOString()};
        context.bindings.product = req.body;
        context.bindings.productchangelog = changeLog;
        context.res = {
            body: req.body,
            mimetype: "application/json",
            status: 201
        }
    } else {
        context.res = {
            status: 400,
            body: "Error reading request body"
        }
    }
}

Дополнительные примеры выходной привязки Azure Data Explorer доступны в репозитории GitHub.

Этот раздел содержит следующие примеры.

Примеры ссылаются на таблицы Products и ProductsChangeLog (определенные ранее).

Триггер HTTP, запись записей в таблицу

В следующем примере показана выходная привязка Azure Data Explorer в файле function.json и функция Python, которая добавляет записи в таблицу. Функция использует данные, предоставленные в HTTP-запросе POST в виде текста JSON.

Следующий фрагмент кода — привязка данных в файле function.json :

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "Anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "route": "addproductuni"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    }
  ]
}

В разделе Конфигурация описываются эти свойства.

Ниже приведен пример кода Python:

import azure.functions as func
from Common.product import Product


def main(req: func.HttpRequest, product: func.Out[str]) -> func.HttpResponse:
    body = str(req.get_body(),'UTF-8')
    product.set(body)
    return func.HttpResponse(
        body=body,
        status_code=201,
        mimetype="application/json"
    )

Триггер HTTP, запись в две таблицы

В следующем примере показана выходная привязка Azure Data Explorer в файле function.json и функция JavaScript, которая добавляет записи в базу данных в двух разных таблицах (ProductsиProductsChangeLog). Функция использует данные, предоставленные в HTTP-запросе POST в качестве текста JSON и нескольких выходных привязок. Вторая таблица ProductsChangeLog соответствует следующему определению:

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

Следующий фрагмент кода — привязка данных в файле function.json :

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "Anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "route": "addmultitable"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    },
    {
      "name": "productchangelog",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "ProductsChangeLog",
      "connection": "KustoConnectionString"
    }
  ]
}

В разделе Конфигурация описываются эти свойства.

Ниже приведен пример кода Python:

import json
from datetime import datetime

import azure.functions as func
from Common.product import Product


def main(req: func.HttpRequest, product: func.Out[str],productchangelog: func.Out[str]) -> func.HttpResponse:
    body = str(req.get_body(),'UTF-8')
    # parse x:
    product.set(body)
    id = json.loads(body)["ProductID"]

    changelog = {
        "ProductID": id,
        "CreatedAt": datetime.now().isoformat(),
    }
    productchangelog.set(json.dumps(changelog))
    return func.HttpResponse(
        body=body,
        status_code=201,
        mimetype="application/json"
    )

Атрибуты

Библиотека C# использует атрибут KustoAttribute для объявления привязок Azure Data Explorer к функции, которая имеет следующие свойства.

Свойство атрибута Description
База данных Обязательный. База данных, в которой должен выполняться запрос.
Connection Обязательный. Имя переменной, содержащей строка подключения, которая разрешается с помощью переменных среды или параметров приложения-функции. По умолчанию для поиска переменной KustoConnectionString. Во время выполнения эта переменная просматривается в среде. Документация по строка подключения находится в строка подключения Kusto. Например: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId.
TableName Обязательный. Таблица для приема данных.
СопоставлениеRef Необязательно. Атрибут для передачи ссылок сопоставления, который уже определен в кластере.
Управляемое удостоверение службы Необязательно. Управляемое удостоверение можно использовать для подключения к Azure Data Explorer. Чтобы использовать управляемое удостоверение системы, используйте "system". Любые другие имена удостоверений интерпретируются как управляемое удостоверение пользователя.
DataFormat Необязательно. Формат данных по умолчанию .multijson/json Его можно задать в текстовых форматах, поддерживаемых datasource в перечислении формата. Примеры проверяются и предоставляются для форматов CSV и JSON.

Заметки

Библиотека среды выполнения функций Java использует заметку @KustoInput (com.microsoft.azure.functions.kusto.annotation.KustoOutput).

Элемент Description
name Необходимые. Имя переменной, представляющей результаты запроса в коде функции.
database Обязательный. База данных, в которой должен выполняться запрос.
подключение Обязательный. Имя переменной, содержащей строка подключения, которая разрешается с помощью переменных среды или параметров приложения-функции. По умолчанию для поиска переменной KustoConnectionString. Во время выполнения эта переменная просматривается в среде. Документация по строка подключения находится в строка подключения Kusto. Например: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId.
tableName Обязательный. Таблица для приема данных.
mappingRef Необязательно. Атрибут для передачи ссылок сопоставления, который уже определен в кластере.
dataFormat Необязательно. Формат данных по умолчанию .multijson/json Его можно задать в текстовых форматах, поддерживаемых datasource в перечислении формата. Примеры проверяются и предоставляются для форматов CSV и JSON.
managedServiceIdentity Управляемое удостоверение можно использовать для подключения к Azure Data Explorer. Чтобы использовать управляемое удостоверение системы, используйте "system". Любые другие имена удостоверений интерпретируются как управляемое удостоверение пользователя.

Настройка

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство в function.json Описание
type Необходимые. Должен иметь значениеkusto.
direction Обязательный. Должен иметь значениеout.
name Необходимые. Имя переменной, представляющей результаты запроса в коде функции.
database Обязательный. База данных, в которой должен выполняться запрос.
подключение Обязательный. Имя переменной, содержащей строка подключения, разрешаемую с помощью переменных среды или параметров приложения-функции. По умолчанию для поиска переменной KustoConnectionString. Во время выполнения эта переменная просматривается в среде. Документация по строка подключения находится в строка подключения Kusto. Например: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId.
tableName Обязательный. Таблица для приема данных.
mappingRef Необязательно. Атрибут для передачи ссылок сопоставления, который уже определен в кластере.
dataFormat Необязательно. Формат данных по умолчанию .multijson/json Его можно задать в текстовых форматах, поддерживаемых datasource в перечислении формата. Примеры проверяются и предоставляются для форматов CSV и JSON.
managedServiceIdentity Управляемое удостоверение можно использовать для подключения к Azure Data Explorer. Чтобы использовать управляемое удостоверение системы, используйте "system". Любые другие имена удостоверений интерпретируются как управляемое удостоверение пользователя.

Если разработка ведется на локальном компьютере, добавьте параметры приложения в файл local.settings.json в коллекции Values.

Использование

Конструктор атрибута принимает базу данных и атрибуты TableName, MappingRefа также DataFormat имя параметра подключения. Команда KQL может быть оператором KQL или функцией KQL. Имя параметра строка подключения соответствует параметру приложения (в local.settings.json локальной разработке), который содержит строка подключения Kusto. Например: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId. Запросы, выполняемые входной привязкой, параметризируются. Значения, указанные в параметрах KQL, используются во время выполнения.

Следующие шаги

Чтение данных из таблицы (входная привязка)