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
ファイルを開きます。 セマンティック カーネルを使用してチャット完了モデルにプロンプトを送信する単純なアプリケーションを作成します。 既存のコンテンツを次のコードに置き換え、 deploymentName
、 endpoint
、および 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_name
、 endpoint
、および 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 タブに移動して、記録されたトランザクションを表示します。
最新のトランザクションを表示するには、[更新] をクリックします。 結果が表示されたら、そのうちの 1 つをクリックして詳細を表示します。
すべて表示とビューのタイムラインボタンを切り替えて、トランザクションのすべてのトレースと依存関係をさまざまなビューで表示します。
重要
トレース は、従来のログ エントリと OpenTelemetry スパン イベントを表します。 これらは分散トレースと同じではありません。 依存関係は、(内部および外部) コンポーネントの呼び出しを表します。 Application Insights のデータ モデルの詳細については、こちらの article を参照してください。
この特定の例では、2 つの依存関係と複数のトレースが表示されます。 最初の依存関係は、プロンプトから作成されるカーネル関数を表します。 2 番目の依存関係は、Azure OpenAI チャット完了モデルの呼び出しを表します。 chat.completion {your-deployment-name}
依存関係を展開すると、呼び出しの詳細が表示されます。 一連の gen_ai
属性が依存関係にアタッチされ、呼び出しに関する追加のコンテキストが提供されます。
スイッチMicrosoft.SemanticKernel.Experimental.GenAI.EnableOTelDiagnosticsSensitive
true
に設定されている場合は、プロンプトの機密データと完了結果を含む 2 つのトレースも表示されます。
それらをクリックすると、カスタム プロパティ セクションの下にプロンプトと入力候補が表示されます。
環境変数SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE
true
に設定されている場合は、プロンプトの機密データと完了結果を含む 2 つのトレースも表示されます。
それらをクリックすると、カスタム プロパティ セクションの下にプロンプトと入力候補が表示されます。
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 に正常に出力できたので、アプリケーションの監視と診断に役立つセマンティック カーネルのその他の機能を確認できます。