跳到主要内容

MLflow 追踪全面支持 OpenTelemetry

·4 分钟阅读
MLflow maintainers
MLflow 维护者

我们很高兴地宣布,MLflow 3.6.0 为开源 MLflow 服务器带来了**全面支持 OpenTelemetry**。这次集成标志着 MLflow 在成为 GenAI 应用**供应商中立的可观测性平台**方面迈出了重要一步。

MLflow OpenTelemetry Hero

有什么新功能?

MLflow 始终致力于为 GenAI 应用提供强大的追踪功能。随着全面的 OpenTelemetry 集成的加入,您现在可以

  • **创建统一的追踪**,将 MLflow SDK 仪器化与第三方库的 OpenTelemetry 自动仪器化结合起来
  • **将 OpenTelemetry Span 摄入** MLflow 追踪服务器
  • **无缝集成**已使用 OpenTelemetry 进行仪器化的现有应用程序
  • **选择任意语言**的 AI 应用并追踪它们,包括 Java、Go、Rust 等。

将 OpenTelemetry 追踪发送到 MLflow 服务器

MLflow 3.6.0 支持直接通过 OTLP(OpenTelemetry Protocol)端点摄入 OpenTelemetry 追踪。这使您可以从任何已进行 OpenTelemetry 仪器化的应用程序发送追踪到 MLflow 追踪服务器。

使用 MLflow 追踪 SDK

MLflow Tracing SDK 构建在 OpenTelemetry SDK 之上,旨在最大限度地减少仪器化工作。它会自动与 OpenTelemetry 的默认追踪器提供程序集成,使来自不同仪器化源的 Span 能够合并成连贯的追踪。

GenAI 框架的自动日志记录

import mlflow
from openai import OpenAI

# Enable auto-logging for OpenAI
mlflow.openai.autolog()

client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello, world!"}]
)

使用 @trace 装饰器的手动仪器化

import mlflow

@mlflow.trace
def process_request(data):
# Your application logic
return result

# Call the traced function
process_request({"input": "data"})

使用带 OTLP Exporter 的 OpenTelemetry SDK

对于不使用 MLflow SDK 的应用程序,或用 Python/TypeScript 以外的语言编写的应用程序,您可以使用标准的 OpenTelemetry OTLP Exporter 直接将追踪发送到 MLflow。MLflow 3.6.0 提供了一个符合 OTLP 的端点,可以接受来自任何已进行 OpenTelemetry 仪器化的应用程序的追踪。

程序化配置

在您的应用程序代码中配置 OTLPSpanExporter,将追踪发送到 MLflow 的 OTLP 端点

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

# Replace with your own MLflow server URI
mlflow_server_uri = "https://:5000"
experiment_id = "123" # Your MLflow experiment ID

# Configure OTLP exporter to send to MLflow
otlp_exporter = OTLPSpanExporter(
endpoint=f"{mlflow_server_uri}/v1/traces",
headers={
"Content-Type": "application/x-protobuf",
"x-mlflow-experiment-id": experiment_id,
}
)

# Set up the tracer provider
provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
trace.set_tracer_provider(provider)

# Now any OpenTelemetry instrumentation will send traces to MLflow
tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span("my_operation"):
# Your application code here
pass

环境变量配置

对于用其他语言(Java、Go、Rust 等)编写的应用程序,或者当您偏好通过环境变量进行配置时,请设置以下内容

export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://:5000/v1/traces
export OTEL_EXPORTER_OTLP_TRACES_HEADERS=x-mlflow-experiment-id=123

这种方法适用于任何 OpenTelemetry SDK,并允许您跨整个技术栈追踪应用程序,将所有追踪发送到 MLflow 以实现统一的可观测性。

OpenTelemetry and MLflow Trace

跨堆栈的统一可观测性

使用 MLflow 3.6.0,您现在可以无缝地结合

  • **OpenTelemetry 自动仪器化**(FastAPI、Django、Flask 等)
  • **MLflow 自动日志记录**(OpenAI、LangChain、DSPy 等)
  • **MLflow @trace 装饰器** 用于自定义 Span

它们可以在您的应用程序中生成**单个、统一的追踪**,从而提供从传入请求到 LLM 调用和最终输出的端到端可见性。

# These now create a single unified trace
from fastapi import FastAPI
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
import mlflow

app = FastAPI()
FastAPIInstrumentor.instrument_app(app) # OTel auto-instrumentation

@mlflow.trace # MLflow tracing
def my_llm_function(input_text):
# Your logic here
return result
OpenTelemetry and MLflow Trace

OpenTelemetry 集成的优势

⚖️ 供应商中立性

OpenTelemetry 是由 Cloud Native Computing Foundation (CNCF) 支持的开放标准。通过全面支持 OTel,MLflow 确保您永远不会被锁定在专有的可观测性解决方案中。

🌐 生态系统兼容性

利用广泛的 OpenTelemetry 生态系统,包括

  • 流行框架(FastAPI、Django、Flask 等)的自动仪器化
  • Python 以外的语言支持(TypeScript、Java、Go 等)
  • 与现有可观测性工具和平台的集成

🔭 统一可见性

在一个追踪中查看应用程序行为的完整图景,从 HTTP 请求到您的业务逻辑再到外部 API 调用。

了解更多

准备好开始在 MLflow 中使用 OpenTelemetry 了吗?请查看以下资源

加入社区

我们对此次集成带来的可能性感到兴奋,并非常希望听到您的反馈贡献

对于那些有兴趣分享知识的人,我们邀请您共同协作 MLflow 网站。无论是撰写教程、分享用例还是提供反馈,每一次贡献都会丰富 MLflow 社区。

请继续关注更多更新,我们将继续增强 MLflow 的可观测性功能!