MLflowトレースをUnity Catalogに保存する
ベータ版
この機能はベータ版です。ワークスペース管理者は、 プレビュー ページからこの機能へのアクセスを制御できます。「Databricks プレビューの管理」を参照してください。
Databricksでは、OpenTelemetry 互換形式 (OTEL) を使用してMLflowトレースをUnity Catalogテーブルに保存することをサポートしています。 デフォルトでは、 MLflowはエクスペリメントごとに整理されたトレースをMLflowコントロールプレーンサービスに保存します。 ただし、OTEL 形式を使用してUnity Catalogにトレースを保存すると、次の利点があります。
-
アクセス制御は、エクスペリメント レベルの ACL ではなく、 Unity Catalogスキーマとテーブル権限を通じて管理されます。 Unity Catalogテーブルにアクセスできるユーザーは、トレースがどの エクスペリメント に属しているかに関係なく、それらのテーブルに保存されているすべてのトレースを表示できます。
-
トレース ID は
tr-<UUID>形式ではなく URI 形式を使用するため、外部システムとの互換性が向上します。 -
Delta テーブルに無制限のトレースを保存し、トレース データの長期保持と分析を可能にします。パフォーマンスに関する考慮事項を参照してください。
-
Databricks SQLウェアハウスを通じてSQLを使用してトレース データを直接クエリし、高度なアナリティクスとカスタム レポートを可能にします。
-
OTEL形式は他のOpenTelemetryクライアントおよびツールとの互換性を保証します
前提条件
-
Unity カタログ対応のワークスペース。
-
「OpenTelemetry on Databricks」プレビューが有効になっていることを確認します。「Databricks プレビューの管理」を参照してください。
-
Unity Catalog でカタログとスキーマを作成する権限。
-
CAN USE権限を持つDatabricks SQL ウェアハウス。後で参照できるようにウェアハウス ID を保存します。 -
この機能がベータ版である間は、ワークスペースは次のいずれかのリージョンにある必要があります。
us-east-1us-east-2us-west-2ca-central-1ap-southeast-1ap-southeast-2ap-northeast-1ap-northeast-2ap-south-1eu-central-1eu-west-1eu-west-2sa-east-1
-
環境にインストールされているMLflow Pythonライブラリ バージョン 3.11.0 以降:
Bashpip install mlflow[databricks]>=3.11.0 --upgrade --force-reinstall
セットアップ: Unity Catalogトレース場所を使用してエクスペリメントを作成する
次のコードを実行して、エクスペリメントを作成し、 Unity Catalogトレースの場所にバインドします。
# Example values for the placeholders below:
# MLFLOW_TRACING_SQL_WAREHOUSE_ID: "abc123def456" (found in SQL warehouse URL)
# experiment_name: "/Users/user@company.com/traces"
# catalog_name: "main" or "my_catalog"
# schema_name: "mlflow_traces" or "production_traces"
# table_prefix: "my_otel"
import os
import mlflow
from mlflow.entities.trace_location import UnityCatalog
mlflow.set_tracking_uri("databricks")
# Specify the ID of a SQL warehouse you have access to.
os.environ["MLFLOW_TRACING_SQL_WAREHOUSE_ID"] = "<SQL_WAREHOUSE_ID>"
# Specify the name of the MLflow Experiment to use for viewing traces in the UI.
experiment_name = "<MLFLOW_EXPERIMENT_NAME>"
# Specify the name of the Catalog to use for storing traces.
catalog_name = "<UC_CATALOG_NAME>"
# Specify the name of the Schema to use for storing traces.
schema_name = "<UC_SCHEMA_NAME>"
# Specify the name of the prefix appended to every table storing trace data.
table_prefix = "<UC_TABLE_PREFIX>"
# mlflow.set_experiment is an upsert operation
experiment = mlflow.set_experiment(
experiment_name=experiment_name,
trace_location=UnityCatalog(
catalog_name=catalog_name,
schema_name=schema_name,
table_prefix=table_prefix, # defaults to experiment id if not provided
),
)
print(f"Experiment ID: {experiment.experiment_id}")
print(experiment.trace_location.full_otel_spans_table_name)
mlflow.create_experiment同じtrace_locationとともに使用することもできます。 set_experimentとは異なり、 create_experimentアクティブな拡張を設定しないため、トレースが正しい場所にルーティングされるようにするには、後でset_experimentを呼び出す必要があります。
experiment_id = mlflow.create_experiment(
name=experiment_name,
trace_location=UnityCatalog(
catalog_name=catalog_name,
schema_name=schema_name,
table_prefix=table_prefix,
),
)
# trace_location is optional here since
# the experiment is already bound to the UC trace location above.
mlflow.set_experiment(experiment_id=experiment_id)
エクスペリメントを UC トレースの場所にバインドすると、そのエクスペリメントを別の UC トレースの場所に再割り当てすることはできません。 ただし、複数のエクスペリメントが同じ UC トレースの場所を共有できます。
テーブルを検証する
セットアップコードを実行すると、カタログエクスプローラーUIのスキーマに4つの新しいUnity Catalogテーブルが表示されます。
<table_prefix>_otel_annotations<table_prefix>_otel_logs<table_prefix>_otel_metrics<table_prefix>_otel_spans
権限を付与する
DatabricksユーザーまたはサービスプリンシパルがUnity CatalogテーブルからMLflowトレースを読み書きするには、次の権限が必要です。
- カタログに対する USE_CATALOG 権限。
- スキーマに対する USE_SCHEMA 権限。
- 各
<table_prefix>_<type>テーブルに対する MODIFY および SELECT 権限。
ALL_PRIVILEGES Unity Catalogトレース テーブルにアクセスするには不十分です。 MODIFY 権限 と SELECT 権限を明示的に付与する必要があります。
Unity Catalogテーブルへのトレースのログ
テーブルを作成した後、トレースの場所を指定することで、さまざまなソースからトレースをテーブルに書き込むことができます。その方法は、トレースのジェネレータによって異なります。
- MLflow SDK
- Model Serving endpoint
- 3rd party OTEL client
Unity Catalogトレース場所は、 mlflow.set_experiment Python APIを使用するか、 MLFLOW_TRACING_DESTINATIONを設定することで指定できます。
import mlflow
from mlflow.entities.trace_location import UnityCatalog
mlflow.set_tracking_uri("databricks")
# Specify the catalog, schema, and table prefix to use for storing Traces
catalog_name = "<UC_CATALOG_NAME>"
schema_name = "<UC_SCHEMA_NAME>"
table_prefix = "<UC_TABLE_PREFIX>"
# Option 1: Use the `set_experiment` API
# For existing experiments, it is not necessary to specify `trace_location`. MLflow
# retrieves the UC trace location bound to the experiment and routes traces to
# that location.
mlflow.set_experiment(
experiment_name="...",
trace_location=UnityCatalog(
catalog_name=catalog_name,
schema_name=schema_name,
table_prefix=table_prefix,
), # optional for existing experiments
)
# Option 2: Use the `MLFLOW_TRACING_DESTINATION` environment variable
import os
os.environ["MLFLOW_TRACING_DESTINATION"] = f"{catalog_name}.{schema_name}.{table_prefix}"
# Create and ingest an example trace using the `@mlflow.trace` decorator
@mlflow.trace
def test(x):
return x + 1
test(100)
Databricksモデルサービング エンドポイントからUnity Catalogテーブルにトレースを書き込むには、パーソナル アクセス トークン (PAT) を構成する必要があります。
- ユーザーまたはサービスプリンシパル
MODIFYとSELECTに、logsテーブルとspansテーブルへのアクセスを許可します。 - ユーザーまたはサービスプリンパルシのPAT を生成します。
- PAT をDatabricksモデルサービング エンドポイントの環境変数構成に追加し、環境変数名として
DATABRICKS_TOKENを指定します。 - 書き込むトレースの場所を、環境変数名として
MLFLOW_TRACING_DESTINATIONを使用して、 Databricksモデルサービング エンドポイントの環境変数構成に"{catalog}.{schema}.{table_prefix}"文字列として追加します。
import mlflow
from mlflow.entities.trace_location import UnityCatalog
mlflow.set_tracking_uri("databricks")
# Specify the catalog, schema, and table prefix to use for storing Traces
catalog_name = "<UC_CATALOG_NAME>"
schema_name = "<UC_SCHEMA_NAME>"
table_prefix = "<UC_TABLE_PREFIX>"
# Option 1: Use the `set_experiment` API
# For existing experiments, it is not necessary to specify `trace_location`. MLflow
# retrieves the UC trace location bound to the experiment and routes traces to
# that location.
mlflow.set_experiment(
experiment_name="...",
trace_location=UnityCatalog(
catalog_name=catalog_name,
schema_name=schema_name,
table_prefix=table_prefix,
), # optional for existing experiments
)
# Option 2: Use the `MLFLOW_TRACING_DESTINATION` environment variable
import os
os.environ["MLFLOW_TRACING_DESTINATION"] = f"{catalog_name}.{schema_name}.{table_prefix}"
# Create and ingest an example trace using the `@mlflow.trace` decorator
@mlflow.trace
def test(x):
return x + 1
test(100)
トレースを OTEL 形式で保存する利点の 1 つは、OTEL をサポートするサードパーティのクライアントを使用してUnity Catalogテーブルに書き込むことができることです。 この方法で記述されたトレースは、ルート スパンがある限り、テーブルにリンクされたMLflowエクスペリメントに表示されます。 次の例は、OpenTelemetry OTLP エクスポーターを示しています。
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
# Span exporter configuration
otlp_trace_exporter = OTLPSpanExporter(
# Databricks hosted OTLP traces collector endpoint
endpoint="https://myworkspace.databricks.com/api/2.0/otel/v1/traces",
headers={
"content-type": "application/x-protobuf",
"X-Databricks-UC-Table-Name": "<catalog>.<schema>.<table_prefix>_otel_spans",
"Authorization": "Bearer MY_API_TOKEN"
},
)
UIでトレースを表示する
他のトレースを表示するのと同じ方法で、OTEL 形式で保存されたトレースを表示します。
-
ワークスペースで、 エクスペリメント に移動します。
-
トレースが記録されているエクスペリメントを見つけます。 たとえば、
mlflow.set_experiment("/Shared/my-genai-app-traces")によって設定されたエクスペリメント。 -
「Traces」 タブをクリックすると、そのエクスペリメントに記録されたすべてのトレースのリストが表示されます。

-
トレースをUnity Catalogテーブルに保存した場合、 Databricks SQLウェアハウスを使用してトレースを取得します。 ドロップダウン メニューからSQLウェアハウスを選択します。
UI を使用してトレースを検索する方法の詳細については、 「 Databricks MLflow UI でトレースを表示する」を参照してください。
本番運用モニタリングを有効にする
Unity Catalogに保存されたトレースを使用して本番運用モニタリングを使用するには、エクスペリメントのSQLウェアハウス ID を構成する必要があります。 モニタリング ジョブでは、 Unity Catalogテーブルに対してスコアラー クエリを実行するためにこの構成が必要です。
set_databricks_monitoring_sql_warehouse_id()を使用してSQLウェアハウス ID を設定します。
from mlflow.tracing import set_databricks_monitoring_sql_warehouse_id
# Set the SQL warehouse ID for monitoring
set_databricks_monitoring_sql_warehouse_id(
sql_warehouse_id="<SQL_WAREHOUSE_ID>",
experiment_id="<EXPERIMENT_ID>" # Optional, uses active experiment if not specified
)
あるいは、モニタリングを開始する前に、 MLFLOW_TRACING_SQL_WAREHOUSE_ID環境変数を設定することもできます。
このステップをスキップすると、モニタリング ジョブは失敗し、 mlflow.monitoring.sqlWarehouseIdエクスペリメント タグが見つからないことを示すエラーが表示されます。
Unity Catalogトレースのモニタリングを設定するには、次のワークスペース レベルの権限が必要です。
CAN USESQLウェアハウスに対する権限CAN EDITMLflowエクスペリメントの許可- モニタリングジョブの権限(最初のスコアラーを登録すると自動的に付与されます)
モニタリング ジョブは、エクスペリメントに最初にスコアラーを登録したユーザーの ID で実行されます。 このユーザーの権限によって、モニタリング ジョブがアクセスできる内容が決まります。
制限事項
-
トレースデータの取り込みは、ワークスペースあたり毎秒200トレース、テーブルあたり毎秒100MBに制限されています。
-
エクスペリメントは、エクスペリメントの作成時にUnity Catalogトレースの場所にのみバインドできます。
-
Unity Catalogに保存されたトレースは、 Knowledge AssistantまたはSupervisor Agentではサポートされていません。
-
2TB を超えるトレース データがテーブルに保存されると、UI パフォーマンスが低下する可能性があります。パフォーマンスに関する考慮事項を参照してください。
-
Unity Catalogに保存されているトレースの個々のトレースの削除はサポートされていません。 トレースを削除するには、 SQLを使用して、基礎となるUnity Catalogテーブルから行を直接削除する必要があります。 これは、 MLflow UI またはAPIを使用して削除できるエクスペリメント トレースと異なります。
-
MLflow MCP サーバーは、Unity Catalog に保存されているトレースとのやり取りをサポートしていません。
次のステップ
- MLflow Databricks SQL を使用して MLflow トレースをクエリする
- OTel スパン属性によるトレースの検索: Unity Catalogに保存されているサードパーティの OTel トレースをスパン属性で検索します。