← 文章 / 云原生与基础设施
signoz 2天前 · 2026-11-08 06:02:50 · 1 阅读

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 环境中安装所需的包。

Copy
pip 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:

Copy
from 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

日志:

Copy
from 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

指标:

Copy
from 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

Copy
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
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/traces
  • SIGNOZ_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/logs
  • SIGNOZ_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









原始来源: signoz

评论 (0)