大语言模型近年来呈现出快速增长的趋势,随着 DeepSeek 的强势出圈,AI 应用的门槛进一步降低,为各行业引入高效且低成本的解决方案,推动了人工智能落地应用的爆炸式发展。
大语言模型应用的运行涉及多个组件和复杂的交互过程,应用性能监控 APM 通过分布式追踪技术,清晰地展示请求在各个组件之间的调用链路,一旦出现故障,可以快速定位到问题所在的具体环节。同时,APM 可以实时监测模型应用的运行状态,及时发现异常行为并发出告警,使运维人员及时采取措施,避免问题扩大化。
支持的 LLM 组件与框架
LLM 应用可以基于 Traceloop 开源的 OpenLLMetry 项目进行接入,该项目完全兼容 OpenTelemetry 协议标准,能够和其他使用 OpenTelemetry 方案接入的应用实现链路信息互通。
接入流程
获取接入点与 token
1. 登录 腾讯云可观测平台 控制台。
2. 在左侧菜单栏中选择应用性能监控,单击应用列表 > 接入应用。
3. 在右侧弹出的数据接入抽屉框中,单击 Python 语言。
4. 在接入 Python 应用页面,选择您所要接入的地域以及业务系统。
5. 选择接入协议类型为 OpenTelemetry。
6. 上报方式选择您所想要的上报方式,获取您的接入点和 Token。
说明:
内网上报:使用此上报方式,您的服务需运行在腾讯云 VPC。通过 VPC 直接联通,在避免外网通信的安全风险同时,可以节省上报流量开销。
外网上报:当您的服务部署在本地或非腾讯云 VPC 内,可以通过此方式上报数据。请注意外网通信存在安全风险,同时也会造成一定上报流量费用。
安装 traceloop-sdk
通过
pip
命令安装 traceloop-sdk,其中包含了对 OpenLLMetry 以及 OpenTelemetry-SDK 的相关依赖。pip install traceloop-sdk
初始化配置
在 Python 项目的入口文件中引入 traceloop 和 OpenTelemetry-SDK,并根据前置步骤中获得的接入点以及 token 进行初始化。
说明:
在需要埋点的目标组件导入声明之前,就必须完成初始化,建议尽可能在入口文件的起始处添加初始化代码。
from traceloop.sdk import Traceloopfrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporterfrom opentelemetry.baggage.propagation import W3CBaggagePropagator# 配置链路数据发送后端# 尽可能在文件开头声明,一定要在目标埋点组件的导入声明前初始化Traceloop.init(app_name="<service_name>",resource_attributes={"token": "<token>","host.name": "<host_name>"},propagator=W3CBaggagePropagator,processor=BatchSpanProcessor(OTLPSpanExporter(endpoint="<endpoint>")))
对应的字段说明如下,请根据实际情况进行替换。
<service_name>
:应用名,多个使用相同 serviceName 接入的应用进程,在 APM 中会表现为相同应用下的多个实例。应用名最长63个字符,只能包含小写字母、数字及分隔符“ - ”,且必须以小写字母开头,数字或小写字母结尾。<token>
:前置步骤中拿到业务系统 Token。<host.name>
:该实例的主机名,是应用实例的唯一标识,通常情况下可以设置为应用实例的 IP 地址。<endpoint>
:前置步骤中拿到的接入点。示例代码
from traceloop.sdk import Traceloopfrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporterfrom opentelemetry.baggage.propagation import W3CBaggagePropagatorTraceloop.init(app_name="<service_name>",resource_attributes={"token": "<token>","host.name": "<host_name>"},propagator=W3CBaggagePropagator,processor=BatchSpanProcessor(OTLPSpanExporter(endpoint="<endpoint>")))from ollama import chatfrom ollama import ChatResponsedef ollama_chat():response: ChatResponse = chat(model='deepseek-r1:1.5b', messages=[{'role': 'user','content': 'Tell a joke of OpenTelemetry',},])print(response.message.content)if __name__ == "__main__":ollama_chat()
至此,LLM 应用已经完成了接入 APM 的所有工作。
自定义埋点增强
如果需要跟踪 LLM 相关框架与类库之外的业务场景,可以参照下述内容,使用 OpenTelemetry API 添加自定义埋点。本文仅展示最基本的自定义埋点方式,OpenTelemetry 社区提供了更多灵活的自定义埋点方式,具体使用方法可参考 OpenTelemetry 社区提供的 Python 自定义埋点文档。
from traceloop.sdk import Traceloopfrom opentelemetry import trace # 导入链路相关 SDKfrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporterfrom opentelemetry.baggage.propagation import W3CBaggagePropagatorTraceloop.init(app_name="<service_name>",resource_attributes={"token": "<token>","host.name": "<host_name>"},propagator=W3CBaggagePropagator,processor=BatchSpanProcessor(OTLPSpanExporter(endpoint="<endpoint>")))from ollama import chatfrom ollama import ChatResponsetracer = trace.get_tracer(__name__) # init tracerdef ollama_chat():response: ChatResponse = chat(model='deepseek-r1:1.5b', messages=[{'role': 'user','content': 'Tell a joke of OpenTelemetry',},])print(response.message.content)def main():with tracer.start_as_current_span("entry func") as span: # create a spanspan.set_attribute("func", "main") # set span attributesollama_chat()if __name__ == "__main__":main()
其中,
trace.get_tracer(__name__)
获取了 OpenTelemetry Tracer 对象,用于后续的自定义埋点增强。在main()
函数中,通过tracer.start_as_current_span()
添加了一个新的 Span,并加入到链路上下文当中。接入验证
完成接入工作后,启动 LLM 应用,应用就会向 APM 上报链路数据。在 应用性能监控 > 应用列表 页面将展示接入的应用,单击应用名称/ID 进入应用详情页,再选择实例监控,即可看到接入的应用实例。由于可观测数据的处理存在一定延时,如果接入后在控制台没有查询到应用或实例,请等待30秒左右。

单击其中的 Span,能够获取更多详细信息,例如下图:

