MLflow 生成的跟踪与 OpenTelemetry 跟踪规范兼容。 因此,可以将 MLflow 跟踪导出到支持 OpenTelemetry 的各种可观测性解决方案。
导出模式
MLflow 支持三种跟踪导出模式:
- 仅 MLflow 跟踪(默认):跟踪仅发送到 MLflow 跟踪服务器。
- 仅 OpenTelemetry:追踪仅发送到 OpenTelemetry 收集器。
- 双重导出:跟踪数据同时发送到 MLflow Tracking 和 OpenTelemetry 收集器。
OpenTelemetry 导出
默认情况下,MLflow 将跟踪导出到 MLflow 跟踪服务器。 若要仅将跟踪导出到 OpenTelemetry 收集器,请在OTEL_EXPORTER_OTLP_ENDPOINT将OTEL_EXPORTER_OTLP_TRACES_ENDPOINT环境变量(或)设置为 OpenTelemetry 收集器的目标 URL。
import mlflow
import os
# Set the endpoint of the OpenTelemetry Collector
os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "http://localhost:4317/v1/traces"
# Optionally, set the service name to group traces
os.environ["OTEL_SERVICE_NAME"] = "<your-service-name>"
# Trace will be exported ONLY to the OTel collector at http://localhost:4317/v1/traces
with mlflow.start_span(name="foo") as span:
span.set_inputs({"a": 1})
span.set_outputs({"b": 2})
双重导出 (MLflow + OpenTelemetry)
若要 同时将跟踪 导出到 Databricks MLflow 和另一个 OpenTelemetry 服务,请使用 MLflow 的双重导出配置。 这样就可以将相同的跟踪数据发送到多个目标,而无需在 MLflow 的跟踪功能和现有可观测性基础结构之间进行选择。
启用双重导出
设置 MLFLOW_ENABLE_DUAL_EXPORT 环境变量与 OpenTelemetry 配置一起:
import mlflow
import os
# Enable dual export mode
os.environ["MLFLOW_ENABLE_DUAL_EXPORT"] = "true"
# Configure OpenTelemetry Collector endpoint
os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "http://localhost:4317/v1/traces"
os.environ["OTEL_SERVICE_NAME"] = "my-ml-service"
# Configure MLflow tracking URI to Databricks
mlflow.set_tracking_uri("databricks")
# Traces will be exported to BOTH MLflow and the OTel collector
with mlflow.start_span(name="dual_export_example") as span:
span.set_inputs({"model": "gpt-4", "prompt": "Hello world"})
# Your ML workflow here
result = "Generated response"
span.set_outputs({"response": result})
span.set_attributes({"token_count": 15})
指标导出
配置指标终结点时,MLflow 可以导出 OpenTelemetry 指标。 这样,就可以在兼容的监视系统中监视持续时间和其他与跟踪相关的指标。
有关 MLflow 导出的指标的完整列表,请参阅 MLflow 导出的指标文档。
启用指标导出
若要将指标导出到 OpenTelemetry 收集器,请设置以下环境变量:
import os
# Enable metrics export
os.environ["OTEL_METRICS_EXPORTER"] = "otlp"
os.environ["OTEL_EXPORTER_OTLP_METRICS_ENDPOINT"] = "http://localhost:4317"
# Optional: Configure metric export interval (in milliseconds)
os.environ["OTEL_METRIC_EXPORT_INTERVAL"] = "60000" # Export every 60 seconds
OpenTelemetry 采集器
单击以下链接了解有关如何为特定可观测性平台设置 OpenTelemetry 收集器的详细信息:
| 平台 | OpenTelemetry 文档 |
|---|---|
| Datadog | OpenTelemetry 指南 |
| New Relic | OpenTelemetry APM 应用性能监控 |
| SigNoz | OpenTelemetry Python Instrumentation |
| Splunk | 获取数据 |
| Grafana | 通过 OTLP 发送数据 |
| ServiceNow (Lightstep) | 收集器文档 |
配置
MLflow 使用标准 OTLP 导出程序将跟踪导出到 OpenTelemetry 收集器实例。 因此,可以使用 OpenTelemetry 支持 的所有配置 。 以下示例将 OTLP 导出程序配置为使用 HTTP 协议而不是默认 gRPC 并设置自定义标头:
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:4317/v1/traces"
export OTEL_EXPORTER_OTLP_TRACES_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_TRACES_HEADERS="api_key=12345"