使用主控台檢查遙測數據
雖然控制台不是檢查遙測數據的建議方式,但這是一種簡單且快速的開始使用方式。 本文說明如何將遙測數據輸出至控制台,以使用最少的核心設定進行檢查。
Exporter
匯出者負責將遙測數據傳送至目的地。 在這裡深入了解導出者。 在此範例中,我們使用主控台導出工具將遙測資料輸出至主控台。
必要條件
- Azure OpenAI 聊天完成部署。
- 您作業系統的最新 .Net SDK 。
- Azure OpenAI 聊天完成部署。
- 計算機上安裝 Python 3.10、3.11 或 3.12 。
注意
Java 尚未提供語意核心可觀察性。
設定
建立新的主控台應用程式
在終端機中,執行下列命令以在 C# 中建立新的控制台應用程式:
dotnet new console -n TelemetryConsoleQuickstart
在命令完成之後,流覽至新建立的項目目錄。
安裝必要的套件
語意核心
dotnet add package Microsoft.SemanticKernel
OpenTelemetry 控制台導出工具
dotnet add package OpenTelemetry.Exporter.Console
使用語意核心建立簡單的應用程式
從項目目錄,使用您慣用的編輯器開啟 Program.cs
檔案。 我們將建立使用 Semantic Kernel 將提示傳送至聊天完成模型的簡單應用程式。 以下列程式代碼取代現有的內容,並填入、 endpoint
和 apiKey
的必要值deploymentName
:
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 TelemetryConsoleQuickstart
{
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
批注:
var resourceBuilder = ResourceBuilder
.CreateDefault()
.AddService("TelemetryConsoleQuickstart");
// Enable model diagnostics with sensitive data.
AppContext.SetSwitch("Microsoft.SemanticKernel.Experimental.GenAI.EnableOTelDiagnosticsSensitive", true);
using var traceProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(resourceBuilder)
.AddSource("Microsoft.SemanticKernel*")
.AddConsoleExporter()
.Build();
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.SetResourceBuilder(resourceBuilder)
.AddMeter("Microsoft.SemanticKernel*")
.AddConsoleExporter()
.Build();
using var loggerFactory = LoggerFactory.Create(builder =>
{
// Add OpenTelemetry as a logging provider
builder.AddOpenTelemetry(options =>
{
options.SetResourceBuilder(resourceBuilder);
options.AddConsoleExporter();
// Format log messages. This is default to false.
options.IncludeFormattedMessage = true;
options.IncludeScopes = true;
});
builder.SetMinimumLevel(LogLevel.Information);
});
最後取消批注將 // builder.Services.AddSingleton(loggerFactory);
記錄器處理站新增至產生器。
在上述代碼段中,我們會先建立資源產生器來建置資源實例。 資源代表產生遙測數據的實體。 您可以在這裡深入了解資源。 提供者的資源產生器是選擇性的。 如果未提供,則會使用預設屬性的默認資源。
接下來,我們會開啟具有敏感數據的診斷。 這是一項實驗性功能,可讓您在語意核心中啟用 AI 服務的診斷。 開啟此功能后,您會看到其他遙測數據,例如傳送至 的提示,以及從 AI 模型收到的回應,這些模型會被視為敏感數據。 如果您不想在遙測中包含敏感數據,您可以使用另一個參數 Microsoft.SemanticKernel.Experimental.GenAI.EnableOTelDiagnostics
來啟用具有非敏感數據的診斷,例如模型名稱、作業名稱和令牌使用方式等。
然後,我們會建立追蹤提供者產生器和計量提供者產生器。 提供者負責處理遙測數據,並將其管線傳送給導出者。 我們會訂閱 Microsoft.SemanticKernel*
來源,以接收來自 Semantic Kernel 命名空間的遙測數據。 我們會將主控台導出工具新增至追蹤提供者和計量提供者。 主控台匯出工具會將遙測數據傳送至主控台。
最後,我們會建立記錄器處理站,並將 OpenTelemetry 新增為將記錄數據傳送至主控台的記錄提供者。 我們會將記錄層級下限設定為 Information
,並在記錄輸出中包含格式化的訊息和範圍。 記錄器處理站接著會新增至產生器。
重要
提供者應該是單一提供者,而且應該在整個應用程式存留期內運作。 當應用程式關閉時,應該處置提供者。
建立新的 Python 虛擬環境
python -m venv telemetry-console-quickstart
啟用虛擬環境。
telemetry-console-quickstart\Scripts\activate
安裝必要的套件
pip install semantic-kernel
使用語意核心建立簡單的 Python 腳本
建立新的 Python 腳本,並使用您慣用的編輯器加以開啟。
New-Item -Path telemetry_console_quickstart.py -ItemType file
我們將建立使用語意核心將提示傳送至聊天完成模型的簡單 Python 腳本。 以下列程式代碼取代現有的內容,並填入、 endpoint
和 api_key
的必要值deployment_name
:
import asyncio
import logging
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, ConsoleLogExporter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import ConsoleMetricExporter, 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, ConsoleSpanExporter
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 連接器發出範圍,因為這些範圍會攜帶 gen_ai
被視為實驗性的屬性。 若要開啟此功能,請將環境變數 SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS
或 SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE
設定為 true
。
重要
提示和完成會被視為敏感數據。 除非 SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE
環境變數設定為 true
,否則語意核心不會從 AI 連接器發出這些數據。 將 設定 SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS
為 true
只會發出非敏感數據,例如模型名稱、作業名稱和令牌使用方式。
在與腳本相同的目錄中建立名為 .env
的新檔案,並新增下列內容:
SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE=true
代碼
如果您現在執行腳本,您應該會看到一個句子,說明天空為何為藍色。 若要透過遙測觀察核心,請使用下列程式代碼取代 # Telemetry setup code goes here
批注:
# Create a resource to represent the service/sample
resource = Resource.create({ResourceAttributes.SERVICE_NAME: "telemetry-console-quickstart"})
def set_up_logging():
exporter = ConsoleLogExporter()
# 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 = ConsoleSpanExporter()
# 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 = ConsoleMetricExporter()
# 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()
在上述代碼段中,我們會先建立資源來代表服務。 資源代表產生遙測數據的實體。 您可以在這裡深入了解資源。 然後,我們會建立三個函式來設定記錄、追蹤和計量。 每個函式都會為個別的遙測數據建立提供者,並將控制台導出工具新增至提供者。
最後,我們會呼叫三個函式來設定記錄、追蹤和計量。 這必須在任何其他遙測呼叫之前完成。
注意
Java 尚未提供語意核心可觀察性。
Run
使用下列命令執行主控台應用程式:
dotnet run
使用下列命令執行 Python 文稿:
python telemetry_console_quickstart.py
注意
Java 尚未提供語意核心可觀察性。
檢查遙測數據
所有記錄
您應該會在主控台輸出中看到多個記錄檔記錄。 其看起來如下所示:
LogRecord.Timestamp: 2024-09-12T21:48:35.2295938Z
LogRecord.TraceId: 159d3f07664838f6abdad7af6a892cfa
LogRecord.SpanId: ac79a006da8a6215
LogRecord.TraceFlags: Recorded
LogRecord.CategoryName: Microsoft.SemanticKernel.KernelFunction
LogRecord.Severity: Info
LogRecord.SeverityText: Information
LogRecord.FormattedMessage: Function InvokePromptAsync_290eb9bece084b00aea46b569174feae invoking.
LogRecord.Body: Function {FunctionName} invoking.
LogRecord.Attributes (Key:Value):
FunctionName: InvokePromptAsync_290eb9bece084b00aea46b569174feae
OriginalFormat (a.k.a Body): Function {FunctionName} invoking.
Resource associated with LogRecord:
service.name: TelemetryConsoleQuickstart
service.instance.id: a637dfc9-0e83-4435-9534-fb89902e64f8
telemetry.sdk.name: opentelemetry
telemetry.sdk.language: dotnet
telemetry.sdk.version: 1.9.0
每個記錄檔記錄有兩個部分:
- 記錄檔記錄本身:包含產生記錄檔記錄的時間戳和命名空間、記錄檔記錄的嚴重性和主體,以及與記錄檔記錄相關聯的任何屬性。
- 與記錄檔記錄相關聯的資源:包含用來產生記錄檔記錄之服務、實例和 SDK 的相關信息。
活動
注意
.Net 中的活動類似於 OpenTelemetry 中的範圍。 它們用來代表應用程式中的工作單位。
您應該會在主控台輸出中看到多個活動。 其看起來如下所示:
Activity.TraceId: 159d3f07664838f6abdad7af6a892cfa
Activity.SpanId: 8c7c79bc1036eab3
Activity.TraceFlags: Recorded
Activity.ParentSpanId: ac79a006da8a6215
Activity.ActivitySourceName: Microsoft.SemanticKernel.Diagnostics
Activity.DisplayName: chat.completions gpt-4o
Activity.Kind: Client
Activity.StartTime: 2024-09-12T21:48:35.5717463Z
Activity.Duration: 00:00:02.3992014
Activity.Tags:
gen_ai.operation.name: chat.completions
gen_ai.system: openai
gen_ai.request.model: gpt-4o
gen_ai.response.prompt_tokens: 16
gen_ai.response.completion_tokens: 29
gen_ai.response.finish_reason: Stop
gen_ai.response.id: chatcmpl-A6lxz14rKuQpQibmiCpzmye6z9rxC
Activity.Events:
gen_ai.content.prompt [9/12/2024 9:48:35 PM +00:00]
gen_ai.prompt: [{"role": "user", "content": "Why is the sky blue in one sentence?"}]
gen_ai.content.completion [9/12/2024 9:48:37 PM +00:00]
gen_ai.completion: [{"role": "Assistant", "content": "The sky appears blue because shorter blue wavelengths of sunlight are scattered in all directions by the gases and particles in the Earth\u0027s atmosphere more than other colors."}]
Resource associated with Activity:
service.name: TelemetryConsoleQuickstart
service.instance.id: a637dfc9-0e83-4435-9534-fb89902e64f8
telemetry.sdk.name: opentelemetry
telemetry.sdk.language: dotnet
telemetry.sdk.version: 1.9.0
每個活動各有兩個部分:
- 活動本身:包含 APM 工具用來建置追蹤、活動持續時間,以及與活動相關聯的任何標籤和事件之範圍標識碼和父範圍標識碼。
- 與活動相關聯的資源:包含用來產生活動之服務、實例和SDK的相關信息。
重要
要特別注意的屬性是開頭 gen_ai
為的屬性。 這些是 GenAI 語意慣例中指定的屬性。
計量
您應該會在主控台輸出中看到多個計量記錄。 其看起來如下所示:
Metric Name: semantic_kernel.connectors.openai.tokens.prompt, Number of prompt tokens used, Unit: {token}, Meter: Microsoft.SemanticKernel.Connectors.OpenAI
(2024-09-12T21:48:37.9531072Z, 2024-09-12T21:48:38.0966737Z] LongSum
Value: 16
您可以在這裡看到名稱、描述、單位、時間範圍、類型、計量的值,以及計量所屬的計量。
注意
上述計量是計數器計量。 如需計量類型的完整清單,請參閱 這裡。 視計量類型而定,輸出可能會有所不同。
記錄
您應該會在主控台輸出中看到多個記錄檔記錄。 其看起來如下所示:
{
"body": "Function SyVCcBjaULqEhItH invoking.",
"severity_number": "<SeverityNumber.INFO: 9>",
"severity_text": "INFO",
"attributes": {
"code.filepath": "C:\\tmp\\telemetry-console-quickstart\\Lib\\site-packages\\semantic_kernel\\functions\\kernel_function_log_messages.py",
"code.function": "log_function_invoking",
"code.lineno": 19
},
"dropped_attributes": 0,
"timestamp": "2024-09-13T17:55:45.504983Z",
"observed_timestamp": "2024-09-13T17:55:45.504983Z",
"trace_id": "0xe23e2c10785ea61ffc9f28be19482a80",
"span_id": "0x686bd592e27661d7",
"trace_flags": 1,
"resource": {
"attributes": {
"telemetry.sdk.language": "python",
"telemetry.sdk.name": "opentelemetry",
"telemetry.sdk.version": "1.27.0",
"service.name": "telemetry-console-quickstart"
},
"schema_url": ""
}
}
跨越
您應該會在主控台輸出中看到多個範圍。 其看起來如下所示:
{
"name": "chat.completions gpt-4o",
"context": {
"trace_id": "0xe23e2c10785ea61ffc9f28be19482a80",
"span_id": "0x8b20e9655610c3c9",
"trace_state": "[]"
},
"kind": "SpanKind.INTERNAL",
"parent_id": "0x686bd592e27661d7",
"start_time": "2024-09-13T17:55:45.515198Z",
"end_time": "2024-09-13T17:55:46.469471Z",
"status": {
"status_code": "UNSET"
},
"attributes": {
"gen_ai.operation.name": "chat.completions",
"gen_ai.system": "openai",
"gen_ai.request.model": "gpt-4o",
"gen_ai.response.id": "chatcmpl-A74oD7WGDjawnZ44SJZrj9fKrEv1B",
"gen_ai.response.finish_reason": "FinishReason.STOP",
"gen_ai.response.prompt_tokens": 16,
"gen_ai.response.completion_tokens": 29
},
"events": [
{
"name": "gen_ai.content.prompt",
"timestamp": "2024-09-13T17:55:45.515198Z",
"attributes": {
"gen_ai.prompt": "[{\"role\": \"user\", \"content\": \"Why is the sky blue in one sentence?\"}]"
}
},
{
"name": "gen_ai.content.completion",
"timestamp": "2024-09-13T17:55:46.469471Z",
"attributes": {
"gen_ai.completion": "[{\"role\": \"assistant\", \"content\": \"The sky appears blue because shorter blue wavelengths of sunlight are scattered in all directions by the molecules and particles in the atmosphere more effectively than other colors.\"}]"
}
}
],
"links": [],
"resource": {
"attributes": {
"telemetry.sdk.language": "python",
"telemetry.sdk.name": "opentelemetry",
"telemetry.sdk.version": "1.27.0",
"service.name": "telemetry-console-quickstart"
},
"schema_url": ""
}
}
請注意以 gen_ai
開頭的屬性。 這些是 GenAI 語意慣例中指定的屬性。 它們提供有關傳送至 的要求和從 AI 模型收到的響應的實用資訊。
計量
您應該會在主控台輸出中看到多個計量記錄。 其看起來如下所示:
{
"resource_metrics": [
{
"resource": {
"attributes": {
"telemetry.sdk.language": "python",
"telemetry.sdk.name": "opentelemetry",
"telemetry.sdk.version": "1.27.0",
"service.name": "telemetry-console-quickstart"
},
"schema_url": ""
},
"scope_metrics": [
{
"scope": {
"name": "semantic_kernel.functions.kernel_function",
"version": null,
"schema_url": "",
"attributes": null
},
"metrics": [
{
"name": "semantic_kernel.function.invocation.duration",
"description": "Measures the duration of a function's execution",
"unit": "s",
"data": {
"data_points": [
{
"attributes": {
"semantic_kernel.function.name": "SyVCcBjaULqEhItH"
},
"start_time_unix_nano": 1726250146470468300,
"time_unix_nano": 1726250146478526600,
"count": 1,
"sum": 0.9650602999900002,
"bucket_counts": [
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"explicit_bounds": [
0.0,
5.0,
10.0,
25.0,
50.0,
75.0,
100.0,
250.0,
500.0,
750.0,
1000.0,
2500.0,
5000.0,
7500.0,
10000.0
],
"min": 0.9650602999900002,
"max": 0.9650602999900002
}
],
"aggregation_temporality": 2
}
}
],
"schema_url": ""
}
],
"schema_url": ""
}
]
}
上面顯示的度量是直方圖計量。 如需計量類型的完整清單,請參閱 這裡。
注意
Java 尚未提供語意核心可觀察性。
下一步
既然您已順利將遙測數據輸出至控制台,您可以深入瞭解如何使用 APM 工具來可視化及分析遙測數據。