次の方法で共有


Application Insights を使用したテレメトリ データの検査

Application Insights は、 Azure Monitor の一部であり、クラウドおよびオンプレミス環境からテレメトリ データを収集、分析、操作するための包括的なソリューションです。 Application Insights を使用すると、アプリケーションのパフォーマンスを監視し、問題を検出し、問題を診断できます。

この例では、テレメトリ データを Application Insights にエクスポートし、Application Insights ポータルでデータを検査する方法について説明します。

輸出者

エクスポーターは、テレメトリ データを送信先に送信する役割を担います。 エクスポーターの詳細については、 こちらを参照してください。 この例では、Azure Monitor エクスポーターを使用して、テレメトリ データを Application Insights インスタンスに出力します。

前提条件

  • Azure OpenAI チャット完了のデプロイ。
  • Application Insights のインスタンス。 リソースがない場合は、 instructions ここに従ってリソースを作成します。 後で使用するために、接続文字列をコピーします。
  • オペレーティング システム用の最新の .Net SDK
  • Azure OpenAI チャット完了のデプロイ。
  • Application Insights のインスタンス。 リソースがない場合は、 instructions ここに従ってリソースを作成します。 後で使用するために、接続文字列をコピーします。
  • Python 3.10、3.11、または 3.12 コンピューターにインストールされています。

Note

セマンティック カーネルの可観測性は、Java ではまだ使用できません。

セットアップ

新しいコンソール アプリケーションを作成する

ターミナルで次のコマンドを実行して、C# で新しいコンソール アプリケーションを作成します。

dotnet new console -n TelemetryApplicationInsightsQuickstart

コマンドの完了後、新しく作成されたプロジェクト ディレクトリに移動します。

必要なパッケージをインストールする

  • セマンティック カーネル

    dotnet add package Microsoft.SemanticKernel
    
  • OpenTelemetry コンソール エクスポーター

    dotnet add package Azure.Monitor.OpenTelemetry.Exporter
    

セマンティック カーネルを使用して単純なアプリケーションを作成する

プロジェクト ディレクトリから、お気に入りのエディターで Program.cs ファイルを開きます。 セマンティック カーネルを使用してチャット完了モデルにプロンプトを送信する単純なアプリケーションを作成します。 既存のコンテンツを次のコードに置き換え、 deploymentNameendpoint、および apiKeyに必要な値を入力します。

using Azure.Monitor.OpenTelemetry.Exporter;

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using OpenTelemetry;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace TelemetryApplicationInsightsQuickstart
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // Telemetry setup code goes here

            IKernelBuilder builder = Kernel.CreateBuilder();
            // builder.Services.AddSingleton(loggerFactory);
            builder.AddAzureOpenAIChatCompletion(
                deploymentName: "your-deployment-name",
                endpoint: "your-azure-openai-endpoint",
                apiKey: "your-azure-openai-api-key"
            );

            Kernel kernel = builder.Build();

            var answer = await kernel.InvokePromptAsync(
                "Why is the sky blue in one sentence?"
            );

            Console.WriteLine(answer);
        }
    }
}

テレメトリを追加する

コンソール アプリを今すぐ実行すると、空が青い理由を説明する文が表示されます。 テレメトリを使用してカーネルを観察するには、 // Telemetry setup code goes here コメントを次のコードに置き換えます。

// Replace the connection string with your Application Insights connection string
var connectionString = "your-application-insights-connection-string";

var resourceBuilder = ResourceBuilder
    .CreateDefault()
    .AddService("TelemetryApplicationInsightsQuickstart");

// Enable model diagnostics with sensitive data.
AppContext.SetSwitch("Microsoft.SemanticKernel.Experimental.GenAI.EnableOTelDiagnosticsSensitive", true);

using var traceProvider = Sdk.CreateTracerProviderBuilder()
    .SetResourceBuilder(resourceBuilder)
    .AddSource("Microsoft.SemanticKernel*")
    .AddAzureMonitorTraceExporter(options => options.ConnectionString = connectionString)
    .Build();

using var meterProvider = Sdk.CreateMeterProviderBuilder()
    .SetResourceBuilder(resourceBuilder)
    .AddMeter("Microsoft.SemanticKernel*")
    .AddAzureMonitorMetricExporter(options => options.ConnectionString = connectionString)
    .Build();

using var loggerFactory = LoggerFactory.Create(builder =>
{
    // Add OpenTelemetry as a logging provider
    builder.AddOpenTelemetry(options =>
    {
        options.SetResourceBuilder(resourceBuilder);
        options.AddAzureMonitorLogExporter(options => options.ConnectionString = connectionString);
        // Format log messages. This is default to false.
        options.IncludeFormattedMessage = true;
        options.IncludeScopes = true;
    });
    builder.SetMinimumLevel(LogLevel.Information);
});

最後に、行 // builder.Services.AddSingleton(loggerFactory); のコメントを解除して、ロガー ファクトリをビルダーに追加します。

テレメトリのセットアップ コードの詳細については、この article を参照してください。 ここでの唯一の違いは、テレメトリ データを Application Insights にエクスポートするために AddAzureMonitor[Trace|Metric|Log]Exporter を使用していることです。

新しい Python 仮想環境を作成する

python -m venv telemetry-application-insights-quickstart

仮想環境をアクティブにします。

telemetry-application-insights-quickstart\Scripts\activate

必要なパッケージをインストールする

pip install semantic-kernel azure-monitor-opentelemetry-exporter

セマンティック カーネルを使用して単純な Python スクリプトを作成する

新しい Python スクリプトを作成し、お気に入りのエディターで開きます。

New-Item -Path telemetry_application_insights_quickstart.py -ItemType file

セマンティック カーネルを使用してチャット完了モデルにプロンプトを送信する単純な Python スクリプトを作成します。 既存のコンテンツを次のコードに置き換え、 deployment_nameendpoint、および api_keyに必要な値を入力します。

import asyncio
import logging

from azure.monitor.opentelemetry.exporter import (
    AzureMonitorLogExporter,
    AzureMonitorMetricExporter,
    AzureMonitorTraceExporter,
)

from opentelemetry._logs import set_logger_provider
from opentelemetry.metrics import set_meter_provider
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.sdk.metrics.view import DropAggregation, View
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.semconv.resource import ResourceAttributes
from opentelemetry.trace import set_tracer_provider

from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion


# Telemetry setup code goes here

async def main():
    # Create a kernel and add a service
    kernel = Kernel()
    kernel.add_service(AzureChatCompletion(
        api_key="your-azure-openai-api-key",
        endpoint="your-azure-openai-endpoint",
        deployment_name="your-deployment-name"
    ))

    answer = await kernel.invoke_prompt("Why is the sky blue in one sentence?")
    print(answer)


if __name__ == "__main__":
    asyncio.run(main())

テレメトリを追加する

環境変数

カーネルが AI コネクタのスパンを出力できるようにするために必要な環境変数を設定する方法の詳細については、この article を参照してください。

コード

ここでスクリプトを実行すると、空が青い理由を説明する文が表示されます。 テレメトリを使用してカーネルを観察するには、 # Telemetry setup code goes here コメントを次のコードに置き換えます。

# Replace the connection string with your Application Insights connection string
connection_string = "your-application-insights-connection-string"

# Create a resource to represent the service/sample
resource = Resource.create({ResourceAttributes.SERVICE_NAME: "telemetry-application-insights-quickstart"})


def set_up_logging():
    exporter = AzureMonitorLogExporter(connection_string=connection_string)

    # Create and set a global logger provider for the application.
    logger_provider = LoggerProvider(resource=resource)
    # Log processors are initialized with an exporter which is responsible
    # for sending the telemetry data to a particular backend.
    logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter))
    # Sets the global default logger provider
    set_logger_provider(logger_provider)

    # Create a logging handler to write logging records, in OTLP format, to the exporter.
    handler = LoggingHandler()
    # Add filters to the handler to only process records from semantic_kernel.
    handler.addFilter(logging.Filter("semantic_kernel"))
    # Attach the handler to the root logger. `getLogger()` with no arguments returns the root logger.
    # Events from all child loggers will be processed by this handler.
    logger = logging.getLogger()
    logger.addHandler(handler)
    logger.setLevel(logging.INFO)


def set_up_tracing():
    exporter = AzureMonitorTraceExporter(connection_string=connection_string)

    # Initialize a trace provider for the application. This is a factory for creating tracers.
    tracer_provider = TracerProvider(resource=resource)
    # Span processors are initialized with an exporter which is responsible
    # for sending the telemetry data to a particular backend.
    tracer_provider.add_span_processor(BatchSpanProcessor(exporter))
    # Sets the global default tracer provider
    set_tracer_provider(tracer_provider)


def set_up_metrics():
    exporter = AzureMonitorMetricExporter(connection_string=connection_string)

    # Initialize a metric provider for the application. This is a factory for creating meters.
    meter_provider = MeterProvider(
        metric_readers=[PeriodicExportingMetricReader(exporter, export_interval_millis=5000)],
        resource=resource,
        views=[
            # Dropping all instrument names except for those starting with "semantic_kernel"
            View(instrument_name="*", aggregation=DropAggregation()),
            View(instrument_name="semantic_kernel*"),
        ],
    )
    # Sets the global default meter provider
    set_meter_provider(meter_provider)


# This must be done before any other telemetry calls
set_up_logging()
set_up_tracing()
set_up_metrics()

テレメトリのセットアップ コードの詳細については、この article を参照してください。 ここでの唯一の違いは、テレメトリ データを Application Insights にエクスポートするために AzureMonitor[Trace|Metric|Log]Exporter を使用していることです。

Note

セマンティック カーネルの可観測性は、Java ではまだ使用できません。

[ファイル名を指定して実行]

次のコマンドを使用してコンソール アプリケーションを実行します。

dotnet run

次のコマンドを使用して Python スクリプトを実行します。

python telemetry_application_insights_quickstart.py

Note

セマンティック カーネルの可観測性は、Java ではまだ使用できません。

テレメトリ データを検査する

アプリケーションを実行したら、Application Insights ポータルに進み、テレメトリ データを調べます。 ポータルにデータが表示されるまでに数分かかる場合があります。

Transaction search タブに移動して、記録されたトランザクションを表示します。

AppInsights の左側のパネル

最新のトランザクションを表示するには、[更新] をクリックします。 結果が表示されたら、そのうちの 1 つをクリックして詳細を表示します。

AppInsights トランザクション検索

すべて表示ビューのタイムラインボタンを切り替えて、トランザクションのすべてのトレースと依存関係をさまざまなビューで表示します。

重要

トレース は、従来のログ エントリと OpenTelemetry スパン イベントを表します。 これらは分散トレースと同じではありません。 依存関係は、(内部および外部) コンポーネントの呼び出しを表します。 Application Insights のデータ モデルの詳細については、こちらの article を参照してください。

この特定の例では、2 つの依存関係と複数のトレースが表示されます。 最初の依存関係は、プロンプトから作成されるカーネル関数を表します。 2 番目の依存関係は、Azure OpenAI チャット完了モデルの呼び出しを表します。 chat.completion {your-deployment-name}依存関係を展開すると、呼び出しの詳細が表示されます。 一連の gen_ai 属性が依存関係にアタッチされ、呼び出しに関する追加のコンテキストが提供されます。

GenAI 属性

スイッチMicrosoft.SemanticKernel.Experimental.GenAI.EnableOTelDiagnosticsSensitivetrueに設定されている場合は、プロンプトの機密データと完了結果を含む 2 つのトレースも表示されます。

GenAI の機密性の高い属性

それらをクリックすると、カスタム プロパティ セクションの下にプロンプトと入力候補が表示されます。

環境変数SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVEtrueに設定されている場合は、プロンプトの機密データと完了結果を含む 2 つのトレースも表示されます。

GenAI の機密性の高い属性

それらをクリックすると、カスタム プロパティ セクションの下にプロンプトと入力候補が表示されます。

Log Analytics

テレメトリ データを検査する唯一の方法は、トランザクション検索ではありません。 Log 分析を使用して、データのクエリと分析を行うこともできます。 Monitoring の下にある Logs に移動して開始します。

この ドキュメントに従って ログ分析インターフェイスの探索を開始します。

この例で使用できるサンプル クエリを次に示します。

// Retrieves the total number of completion and prompt tokens used for the model if you run the application multiple times.
dependencies
| where name startswith "chat"
| project model = customDimensions["gen_ai.request.model"], completion_token = toint(customDimensions["gen_ai.response.completion_tokens"]), prompt_token = toint(customDimensions["gen_ai.response.prompt_tokens"])
| where model == "gpt-4o"
| project completion_token, prompt_token
| summarize total_completion_tokens = sum(completion_token), total_prompt_tokens = sum(prompt_token)
// Retrieves all the prompts and completions and their corresponding token usage.
dependencies
| where name startswith "chat"
| project timestamp, operation_Id, name, completion_token = customDimensions["gen_ai.response.completion_tokens"], prompt_token = customDimensions["gen_ai.response.prompt_tokens"]
| join traces on operation_Id
| where message startswith "gen_ai"
|project timestamp, messages = customDimensions, token=iff(customDimensions contains "gen_ai.prompt", prompt_token, completion_token)

クエリ結果

次のステップ

テレメトリ データを Application Insights に正常に出力できたので、アプリケーションの監視と診断に役立つセマンティック カーネルのその他の機能を確認できます。