Semantic Kernel 可观测性 - 监控 AI 编排
本指南将带你为 Semantic Kernel 配置可观测性与监控,使用 OpenTelemetry,并将日志、链路和指标导出到 SigNoz。通过这一集成,你可以观察各种模型的性能、捕获请求/响应详情,并在 SigNoz 中跟踪系统级指标,实时掌握 Semantic Kernel 应用的延迟、错误率和使用趋势。
为应用中的 Semantic Kernel 添加遥测,可以对整个 AI 工作流实现全面可观测,让问题排查、性能优化和用户行为分析更加轻松。借助 SigNoz,你可以在统一的面板中分析关联的链路、日志和指标,配置告警,并获得可落地的洞察,持续提升可靠性、响应速度和用户体验。
前置条件
- 一个 SigNoz Cloud 账号,且拥有有效的 ingestion key
- 可以联网,以便向 SigNoz Cloud 发送遥测数据
- Python 3.10+,并已安装 Semantic Kernel
- Python 环境:已安装
pip用于管理包,(可选但推荐)使用 Python 虚拟环境隔离依赖
监控 Semantic Kernel
关于如何对 Semantic Kernel 应用进行链路追踪的更多详情,请点击这里。 关于 Semantic Kernel 遥测数据的更多详情,请点击这里。
PythonNo Code(Recommended)Code推荐使用无代码的自动 instrumentation,只需极少代码改动即可快速完成配置。适合希望不修改应用代码就搭建起可观测性、并使用标准 instrumentor 库的场景。
步骤 1:在 Python 环境中安装所需的包。
Copypip install \
opentelemetry-distro \
opentelemetry-exporter-otlp \
httpx \
opentelemetry-instrumentation-httpx \
opentelemetry-instrumentation-system-metrics \
semantic-kernel
第二步:添加自动插桩
复制opentelemetry-bootstrap --action=install第三步:为 Semantic Kernel 应用添加插桩
默认情况下,内核不会为 AI 连接器发出 span,因为这些 span 携带的 gen_ai 属性被视为实验性功能。若要启用此功能,请设置以下环境变量之一:
SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS=true- 发出非敏感数据(模型名称、操作名称、token 用量)SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE=true- 发出包含敏感数据(提示词和补全结果)的所有遥测信息
本指南中,我们使用敏感数据变体以获得全面的可观测性:
复制export SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE=true第四步:运行示例
复制from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.prompt_template import InputVariable, PromptTemplateConfig
import asyncio
import logging
import os
async def main():
kernel = Kernel()
kernel.add_service(
OpenAIChatCompletion(
ai_model_id="gpt-4.1",
api_key=os.getenv("OPENAI_API_KEY")
)
)
prompt = """{{$input}}
请回答上述问题。
"""
prompt_template_config = PromptTemplateConfig(
template=prompt,
name="summarize",
template_format="semantic-kernel",
input_variables=[
InputVariable(name="input", description="用户输入", is_required=True),
]
)
summarize = kernel.add_function(
function_name="summarizeFunc",
plugin_name="summarizePlugin",
prompt_template_config=prompt_template_config,
)
input_text = "SigNoz 是什么?"
summary = await kernel.invoke(summarize, input=input_text)
print(summary)
if __name__ == "__main__":
asyncio.run(main())📌 注意:运行此代码前,请确保已将环境变量
OPENAI_API_KEY设置为您的 API 密钥。
第五步:以自动插桩方式运行应用
复制OTEL_RESOURCE_ATTRIBUTES="service.name=<service_name>" \
OTEL_EXPORTER_OTLP_ENDPOINT="https://ingest.<region>.signoz.cloud:443" \
OTEL_EXPORTER_OTLP_HEADERS="signoz-ingestion-key=<your-ingestion-key>" \
OTEL_EXPORTER_OTLP_PROTOCOL=grpc \
OTEL_TRACES_EXPORTER=otlp \
OTEL_METRICS_EXPORTER=otlp \
OTEL_LOGS_EXPORTER=otlp \
OTEL_PYTHON_LOG_CORRELATION=true \
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true \
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS=openai \
opentelemetry-instrument <your_run_command>📌 注意:我们在运行命令中使用
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS=openai来禁用 OpenAI 的链路追踪插桩。这样可以避免与 Semantic Kernel 原生的遥测/插桩产生重复的 OpenAI span,确保遥测数据只通过 Semantic Kernel 内置的插桩来采集。
<service_name>是你的服务名称<region>:你的 SigNoz Cloud 区域<your-ingestion-key>:你的 SigNoz ingestion key- 将
<your_run_command>替换为你实际运行应用的命令,例如python main.py
使用自托管(Self-Hosted)SigNoz?大部分步骤完全相同,只需按Cloud → Self-Hosted 文档调整 endpoint 并移除 ingestion key 请求头即可。
基于代码的插桩方式能让你对遥测配置进行更细粒度的控制。当你需要自定义资源属性、采样策略,或对接现有的可观测性基础设施时,可以选择这种方式。
第 1 步:在 Python 环境中安装所需的包。
复制pip install \
opentelemetry-api \
opentelemetry-sdk \
opentelemetry-exporter-otlp \
opentelemetry-instrumentation-httpx \
opentelemetry-instrumentation-system-metrics \
semantic-kernel第 2 步:在 Python 应用中导入所需的模块。
Traces:
Copyfrom opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter日志:
Copyfrom opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
from opentelemetry._logs import set_logger_provider
import logging指标:
Copyfrom opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry import metrics
from opentelemetry.instrumentation.system_metrics import SystemMetricsInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor第三步: 配置 OpenTelemetry Tracer Provider,将链路直接发送至 SigNoz Cloud
Copyfrom opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry import trace
import os
resource = Resource.create({"service.name": "<service_name>"})
provider = TracerProvider(resource=resource)
span_exporter = OTLPSpanExporter(
endpoint= os.getenv("OTEL_EXPORTER_TRACES_ENDPOINT"),
headers={"signoz-ingestion-key": os.getenv("SIGNOZ_INGESTION_KEY")},
)
processor = BatchSpanProcessor(span_exporter)
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)<service_name>为你的服务名称OTEL_EXPORTER_TRACES_ENDPOINT→ 对应 region 的 SigNoz Cloud 链路接收端点:https://ingest.<region>.signoz.cloud:443/v1/tracesSIGNOZ_INGESTION_KEY→ 你的 SigNoz 数据摄入密钥
使用自托管(Self-Hosted)SigNoz?大部分步骤是一样的。只需参照Cloud → Self-Hosted 中的说明,修改 endpoint 并去掉 ingestion key 请求头即可。
第 4 步:配置日志
复制import logging
from opentelemetry.sdk.resources import Resource
from opentelemetry._logs import set_logger_provider
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
import os
resource = Resource.create({"service.name": "<service_name>"})
logger_provider = LoggerProvider(resource=resource)
set_logger_provider(logger_provider)
otlp_log_exporter = OTLPLogExporter(
endpoint= os.getenv("OTEL_EXPORTER_LOGS_ENDPOINT"),
headers={"signoz-ingestion-key": os.getenv("SIGNOZ_INGESTION_KEY")},
)
logger_provider.add_log_record_processor(
BatchLogRecordProcessor(otlp_log_exporter)
)
# Attach OTel logging handler to root logger
handler = LoggingHandler(level=logging.INFO, logger_provider=logger_provider)
logging.basicConfig(level=logging.INFO, handlers=[handler])
logger = logging.getLogger(__name__)<service_name>是你的服务名称OTEL_EXPORTER_LOGS_ENDPOINT→ 对应相应 region 的 SigNoz Cloud endpoint:https://ingest.<region>.signoz.cloud:443/v1/logsSIGNOZ_INGESTION_KEY→ 你的 SigNoz ingestion key
使用自托管(Self-Hosted)SigNoz?大部分步骤是一样的。只需参照Cloud → Self-Hosted 中的说明,修改 endpoint 并去掉 ingestion key 请求头即可。
第 5 步:配置指标
复制from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.metrics import MeterProvider
f
