来源 examples/online_serving/opentelemetry.
设置OpenTelemetry概念验证¶
-
安装OpenTelemetry包:
-
在Docker容器中启动Jaeger:
# 来源: https://www.jaegertracing.io/docs/1.57/getting-started/ docker run --rm --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 4317:4317 \ -p 4318:4318 \ -p 14250:14250 \ -p 14268:14268 \ -p 14269:14269 \ -p 9411:9411 \ jaegertracing/all-in-one:1.57
-
在新终端中,导出Jaeger IP:
export JAEGER_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' jaeger) export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=grpc://$JAEGER_IP:4317
然后为OpenTelemetry设置vLLM的服务名称,启用与Jaeger的不安全连接并运行vLLM:
-
在新终端中,通过模拟客户端发送带有追踪上下文的请求
-
打开Jaeger网页界面: http://localhost:16686/
在搜索面板中,选择
vllm-server
服务并点击Find Traces
。您将看到一系列追踪记录,每个请求对应一条记录。 -
点击追踪记录将显示其跨度和相关标签。在本演示中,每条追踪记录包含2个跨度:一个来自模拟客户端(包含提示文本),另一个来自vLLM(包含请求的元数据)。
导出器协议¶
OpenTelemetry 支持在导出器中使用 grpc
或 http/protobuf
作为跟踪数据的传输协议。
默认情况下使用 grpc
。要将 http/protobuf
设置为协议,请按如下方式配置 OTEL_EXPORTER_OTLP_TRACES_PROTOCOL
环境变量:
export OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://$JAEGER_IP:4318/v1/traces
vllm serve facebook/opt-125m --otlp-traces-endpoint="$OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"
FastAPI 的仪表化¶
OpenTelemetry支持对FastAPI进行自动插桩。
-
安装仪表化库
-
使用
opentelemetry-instrument
运行 vLLM -
向vLLM发送请求并在Jaeger中查找其跟踪记录。其中应包含来自FastAPI的跨度信息。
示例材料¶
dummy_client.py
# SPDX-License-Identifier: Apache-2.0
import requests
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
from opentelemetry.trace import SpanKind, set_tracer_provider
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
trace_provider = TracerProvider()
set_tracer_provider(trace_provider)
trace_provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
trace_provider.add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
tracer = trace_provider.get_tracer("dummy-client")
url = "http://localhost:8000/v1/completions"
with tracer.start_as_current_span("client-span", kind=SpanKind.CLIENT) as span:
prompt = "San Francisco is a"
span.set_attribute("prompt", prompt)
headers = {}
TraceContextTextMapPropagator().inject(headers)
payload = {
"model": "facebook/opt-125m",
"prompt": prompt,
"max_tokens": 10,
"n": 3,
"use_beam_search": "true",
"temperature": 0.0,
# "stream": True,
}
response = requests.post(url, headers=headers, json=payload)