Pengikatan output Azure Data Explorer untuk Azure Functions (pratinjau)

Saat fungsi berjalan, output Azure Data Explorer yang mengikat menyerap data ke Azure Data Explorer.

Untuk informasi tentang pengaturan dan detail konfigurasi, lihat gambaran umum.

Contoh

Fungsi C# dapat dibuat dengan menggunakan salah satu mode C# berikut:

  • Model pekerja terisolasi: Fungsi C# terkompilasi yang berjalan dalam proses pekerja yang terisolasi dari runtime. Proses pekerja terisolasi diperlukan untuk mendukung fungsi C# yang berjalan pada versi LTS dan non-LTS .NET dan .NET Framework.
  • Model dalam proses: Fungsi C# yang dikompilasi yang berjalan dalam proses yang sama dengan runtime Functions.
  • Skrip C#: Digunakan terutama saat Anda membuat fungsi C# di portal Azure.

Penting

Dukungan akan berakhir untuk model dalam proses pada 10 November 2026. Kami sangat menyarankan Agar Anda memigrasikan aplikasi Anda ke model pekerja yang terisolasi untuk dukungan penuh.

Sampel lainnya untuk pengikatan output Azure Data Explorer tersedia di repositori GitHub.

Bagian ini berisi contoh-contoh berikut:

Contohnya merujuk ke Product kelas dan tabel database terkait:

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)

Pemicu HTTP, tulis satu rekaman

Contoh berikut menunjukkan fungsi C# yang menambahkan rekaman ke database. Fungsi ini menggunakan data yang disediakan dalam permintaan HTTP POST sebagai isi 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 { };
        }
    }
}

Pemicu HTTP, tulis rekaman dengan pemetaan

Contoh berikut menunjukkan fungsi C# yang menambahkan kumpulan rekaman ke database. Fungsi ini menggunakan pemetaan yang mengubah ke ProductItem.

Untuk mengubah data dari Product ke Item, fungsi menggunakan referensi pemetaan:

.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 { };
        }
    }
}

Sampel lainnya untuk pengikatan input Java Azure Data Explorer tersedia di repositori GitHub.

Bagian ini berisi contoh-contoh berikut:

Contoh merujuk ke Products kelas (dalam file Product.javaterpisah ) dan tabel Products database yang sesuai (ditentukan sebelumnya):

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;
    }
}

Pemicu HTTP, tulis rekaman ke tabel

Contoh berikut menunjukkan pengikatan output Azure Data Explorer dalam fungsi Java yang menambahkan rekaman produk ke tabel. Fungsi ini menggunakan data yang disediakan dalam permintaan HTTP POST sebagai isi JSON. Fungsi ini mengambil dependensi lain pada pustaka com.fasterxml.jackson.core untuk mengurai isi 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();
        }
    }
}

Pemicu HTTP, tulis ke dua tabel

Contoh berikut menunjukkan pengikatan output Azure Data Explorer dalam fungsi Java yang menambahkan rekaman ke database dalam dua tabel berbeda (Product dan ProductChangeLog). Fungsi ini menggunakan data yang disediakan dalam permintaan HTTP POST sebagai isi JSON dan beberapa pengikatan output. Fungsi ini mengambil dependensi lain pada pustaka com.fasterxml.jackson.core untuk mengurai isi JSON.

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

Tabel kedua, ProductsChangeLog, sesuai dengan definisi berikut:

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

dan kelas Java di 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();
        }
    }
}

Sampel lainnya untuk pengikatan output Azure Data Explorer tersedia di repositori GitHub.

Bagian ini berisi contoh-contoh berikut:

Contohnya merujuk ke tabel database.

Contohnya merujuk ke tabel Products dan ProductsChangeLog (ditentukan sebelumnya).

Pemicu HTTP, tulis rekaman ke tabel

Contoh berikut menunjukkan pengikatan output Azure Data Explorer dalam file function.json dan fungsi JavaScript yang menambahkan rekaman ke tabel. Fungsi ini menggunakan data yang disediakan dalam permintaan HTTP POST sebagai isi JSON.

Contoh berikut adalah mengikat data dalam file 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
}

Bagian konfigurasi menjelaskan properti ini.

Cuplikan berikut adalah contoh kode 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
    };
}

Pemicu HTTP, tulis ke dua tabel

Contoh berikut menunjukkan pengikatan output Azure Data Explorer dalam file function.json dan fungsi JavaScript yang menambahkan rekaman ke database dalam dua tabel berbeda (Products dan ProductsChangeLog). Fungsi ini menggunakan data yang disediakan dalam permintaan HTTP POST sebagai isi JSON dan beberapa pengikatan output.

Tabel kedua, ProductsChangeLog, sesuai dengan definisi berikut:

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

Cuplikan berikut mengikat data dalam file 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
}

Bagian konfigurasi menjelaskan properti ini.

Cuplikan berikut adalah contoh kode 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"
        }
    }
}

Sampel lainnya untuk pengikatan output Azure Data Explorer tersedia di repositori GitHub.

Bagian ini berisi contoh-contoh berikut:

Contohnya merujuk ke tabel Products dan ProductsChangeLog (ditentukan sebelumnya).

Pemicu HTTP, tulis rekaman ke tabel

Contoh berikut menunjukkan pengikatan output Azure Data Explorer dalam file function.json dan fungsi Python yang menambahkan rekaman ke tabel. Fungsi ini menggunakan data yang disediakan dalam permintaan HTTP POST sebagai isi JSON.

Cuplikan berikut mengikat data dalam file 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"
    }
  ]
}

Bagian konfigurasi menjelaskan properti ini.

Cuplikan berikut adalah sampel kode 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"
    )

Pemicu HTTP, tulis ke dua tabel

Contoh berikut menunjukkan pengikatan output Azure Data Explorer dalam file function.json dan fungsi JavaScript yang menambahkan rekaman ke database dalam dua tabel berbeda (Products dan ProductsChangeLog). Fungsi ini menggunakan data yang disediakan dalam permintaan HTTP POST sebagai isi JSON dan beberapa pengikatan output. Tabel kedua, ProductsChangeLog, sesuai dengan definisi berikut:

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

Cuplikan berikut mengikat data dalam file 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"
    }
  ]
}

Bagian konfigurasi menjelaskan properti ini.

Cuplikan berikut adalah sampel kode 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"
    )

Atribut

Pustaka C# menggunakan atribut KustoAttribute untuk mendeklarasikan pengikatan Azure Data Explorer pada fungsi , yang memiliki properti berikut.

Properti atribut Deskripsi
Database Harus diisi. Database tempat kueri harus dijalankan.
Connection Harus diisi. Nama variabel yang menyimpan string koneksi, yang diselesaikan melalui variabel lingkungan atau melalui pengaturan aplikasi fungsi. Default untuk mencari variabel KustoConnectionString. Pada runtime, variabel ini dicari terhadap lingkungan. Dokumentasi tentang string koneksi ada di Kusto string koneksi s. Misalnya: "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 Harus diisi. Tabel untuk menyerap data.
MappingRef Opsional. Atribut untuk meneruskan ref pemetaan yang sudah ditentukan dalam kluster.
ManagedServiceIdentity Opsional. Identitas terkelola dapat digunakan untuk menyambungkan ke Azure Data Explorer. Untuk menggunakan identitas terkelola sistem, gunakan "sistem." Nama identitas lain ditafsirkan sebagai identitas terkelola pengguna.
DataFormat Opsional. Format data default adalah multijson/json. Ini dapat diatur ke format teks yang didukung dalam datasource enumerasi format. Sampel divalidasi dan disediakan untuk format CSV dan JSON.

Anotasi

Pustaka runtime fungsi Java menggunakan @KustoInput anotasi (com.microsoft.azure.functions.kusto.annotation.KustoOutput).

Elemen Deskripsi
nama Harus diisi. Nama variabel yang mewakili kueri dalam kode fungsi.
database Harus diisi. Database tempat kueri harus dijalankan.
koneksi Harus diisi. Nama variabel yang menyimpan string koneksi, yang diselesaikan melalui variabel lingkungan atau melalui pengaturan aplikasi fungsi. Default untuk mencari variabel KustoConnectionString. Pada runtime, variabel ini dicari terhadap lingkungan. Dokumentasi tentang string koneksi ada di Kusto string koneksi s. Misalnya: "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 Harus diisi. Tabel untuk menyerap data.
mappingRef Opsional. Atribut untuk meneruskan ref pemetaan yang sudah ditentukan dalam kluster.
dataFormat Opsional. Format data default adalah multijson/json. Ini dapat diatur ke format teks yang didukung dalam datasource enumerasi format. Sampel divalidasi dan disediakan untuk format CSV dan JSON.
managedServiceIdentity Identitas terkelola dapat digunakan untuk menyambungkan ke Azure Data Explorer. Untuk menggunakan identitas terkelola sistem, gunakan "sistem." Nama identitas lain ditafsirkan sebagai identitas terkelola pengguna.

Konfigurasi

Tabel berikut menjelaskan properti konfigurasi pengikatan yang Anda atur di file function.json.

Properti function.json Deskripsi
jenis Harus diisi. Harus diatur ke kusto.
direction Harus diisi. Harus diatur ke out.
nama Harus diisi. Nama variabel yang mewakili kueri dalam kode fungsi.
database Harus diisi. Database tempat kueri harus dijalankan.
koneksi Harus diisi. Nama variabel yang menyimpan string koneksi, diselesaikan melalui variabel lingkungan atau melalui pengaturan aplikasi fungsi. Default untuk mencari variabel KustoConnectionString. Pada runtime, variabel ini dicari terhadap lingkungan. Dokumentasi tentang string koneksi ada di Kusto string koneksi s. Misalnya: "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 Harus diisi. Tabel untuk menyerap data.
mappingRef Opsional. Atribut untuk meneruskan ref pemetaan yang sudah ditentukan dalam kluster.
dataFormat Opsional. Format data default adalah multijson/json. Ini dapat diatur ke format teks yang didukung dalam datasource enumerasi format. Sampel divalidasi dan disediakan untuk format CSV dan JSON.
managedServiceIdentity Identitas terkelola dapat digunakan untuk menyambungkan ke Azure Data Explorer. Untuk menggunakan identitas terkelola sistem, gunakan "sistem." Nama identitas lain ditafsirkan sebagai identitas terkelola pengguna.

Ketika Anda mengembangkan secara lokal, tambahkan pengaturan aplikasi di file local.settings.json dalam koleksi Values.

Penggunaan

Konstruktor atribut mengambil database dan atribut TableName, , MappingRefdan dan DataFormat nama pengaturan koneksi. Perintah KQL dapat berupa pernyataan KQL atau fungsi KQL. Nama pengaturan string koneksi sesuai dengan pengaturan aplikasi (untuk local.settings.json pengembangan lokal) yang berisi string koneksi Kusto. Misalnya:"KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId. Kueri yang dijalankan oleh pengikatan input diparameterkan. Nilai yang disediakan dalam parameter KQL digunakan pada runtime.

Langkah berikutnya

Membaca data dari tabel (pengikatan input)