Databricks Appsのテレメトリを構成する
パブリックプレビュー
アプリのテレメトリ機能はパブリックプレビュー版です。
Databricks Appsテレメトリは、トレース、ログ、メトリックを収集し、OpenTelemetry (OTel) プロトコルを使用してUnity Catalogテーブルに保存します。 アプリ テレメトリを有効にすると、Databricks は、ユーザー ログインや直接 API 要求などのシステム ログと使用イベントを自動的にキャプチャします。フレームワーク用の OpenTelemetry SDK を使用してカスタム インストルメンテーションを追加することもできます。
要件
-
ワークスペースはサポートされているリージョン(
us-east1、us-east4、us-west1、us-central1、europe-west3にある必要があります。 -
Unity Catalogに新しいテレメトリ ターゲット テーブルを作成するには、ターゲット カタログとスキーマに対する
CAN MANAGE権限と、スキーマに対するCREATE TABLE権限が必要です。 -
Unity Catalog内の既存のテレメトリ ターゲット テーブルに書き込むには、ターゲット カタログとスキーマに対する
CAN MANAGE権限が必要です。または、すべての ユーザーがターゲット テーブルに対するUSE CATALOG、USE SCHEMA、SELECT、およびMODIFYを持っている必要があります。 -
ターゲット テーブルは、ワークスペースと同じリージョン内の管理された Delta テーブルである必要があります。
-
Databricks 、クエリのパフォーマンスを向上させるために、テレメトリ ターゲット テーブルで予測的最適化を有効にすることをお勧めします。
アプリテレメトリを有効にする
アプリのテレメトリをオンにするには、アプリ設定でテレメトリ テーブルのカタログとスキーマを構成します。
- UI
- CLI
- Databricks ワークスペースでアプリの詳細ページを開きます。
- 設定 タブで、 アプリのテレメトリ 構成セクションを見つけて、 [追加] をクリックします。
- カタログとスキーマを入力するか参照して選択します。Databricks は、選択した場所の 3 つのテーブル (
otel_metrics、otel_spans、otel_logs) にテレメトリ データを書き込みます。 - (オプション) テーブルに
<prefix>_otel_metrics、<prefix>_otel_spans、<prefix>_otel_logsという名前が付けられるように、テーブル プレフィックスを指定します。Databricks は既存のテーブルに追加するか、存在しない場合はテーブルを作成します。 - 保存 をクリックします。
- テレメトリが Unity Catalog に流れ始めるようにアプリを再デプロイします。
-
databricks apps updateコマンドを使用してテレメトリを設定し、カタログ、スキーマ、およびテーブル名をすべて指定します。Bashdatabricks apps update <app-name> --json '{
"telemetry_export_destinations": [
{
"unity_catalog": {
"logs_table": "<catalog>.<schema>.<your-prefix>-otel_logs",
"metrics_table": "<catalog>.<schema>.otel_metrics",
"traces_table": "<catalog>.<schema>.otel_spans"
}
}
]
}' -
テレメトリデータがUnity Catalogに送信されるよう、アプリを再デプロイしてください。
Bashdatabricks apps deploy <app-name>
テレメトリデータを検証する
再デプロイメント後、 otel_logsテーブルにデータが自動的に入力されます。otel_spansテーブルとotel_metricsテーブルは、アプリにカスタム インストルメンテーションを追加した後にのみ入力されます。
アプリを再デプロイした後:
-
アクティビティを生成するには、アプリの URL にアクセスしてください。
-
最初のデータ バッチが表示されるまで数秒お待ちください。
-
データが流れていることを確認するには、Databricks SQL で次のクエリを実行します。
SQLSELECT * FROM <catalog>.<schema>.otel_logs
LIMIT 10;
テレメトリデータのクエリ
テレメトリ データをフィルタリングおよび相関付けるのに役立つ列には、 time 、 service_name 、 trace_id 、 span_id 、 attributesなどがあります。attributes列は、 event.nameなどのイベント固有のメタデータを含むマップです。
テレメトリ テーブルの完全なスキーマを表示するには、次のコマンドを実行します。
DESCRIBE TABLE <catalog>.<schema>.otel_logs;
以下の例は、過去1時間のエラーレベルのログをクエリするもので、アプリの問題をデバッグする際に役立ちます。
SELECT time, body
FROM <catalog>.<schema>.otel_logs
WHERE service_name = '<app-name>'
AND severity_text = "ERROR"
AND time >= current_timestamp() - INTERVAL 1 HOUR
ORDER BY time DESC
LIMIT 100;
クエリシステムイベント
Databricksは、ユーザーログインや直接APIリクエストなどの使用イベントといったシステムイベントをotel_logsテーブルに自動的に記録します。event.name属性でフィルタリングして、これらのイベントをクエリします。
次の例は、アプリケーションの最新の使用状況イベントを100件取得します。
SELECT time, attributes
FROM <catalog>.<schema>.otel_logs
WHERE service_name = '<app-name>'
AND attributes:["event.name"]::string = 'app.auth'
ORDER BY time DESC
LIMIT 100;
カスタムインストルメンテーションを追加する
OpenTelemetry 自動計測を追加して、カスタム トレース、メトリクス、ログを生成します。 フレームワークに応じて、 app.yamlと依存関係ファイルを更新します。
- Streamlit
- Dash
- Flask
- FastAPI
- Node.js
app.yamlを更新:
command: ['opentelemetry-instrument', 'streamlit', 'run', 'app.py']
env:
- name: OTEL_TRACES_SAMPLER
value: 'always_on'
requirements.txtを更新:
streamlit==1.38.0
# Auto-instrumentation
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
# Required for Streamlit
opentelemetry-instrumentation-tornado
# Host metrics (CPU, memory)
opentelemetry-instrumentation-system-metrics
app.yamlを更新:
command: ['opentelemetry-instrument', 'python', 'app.py']
env:
- name: OTEL_TRACES_SAMPLER
value: 'always_on'
requirements.txtを更新:
dash
dash-bootstrap-components
pandas
plotly
databricks-sql-connector
databricks-sdk
python-dotenv
dash-ag-grid
opentelemetry-distro[otlp]
opentelemetry-instrumentation-flask
opentelemetry-exporter-otlp-proto-grpc
app.yamlを更新:
command: ['opentelemetry-instrument', 'flask', '--app', 'app.py', 'run', '--no-reload']
env:
- name: OTEL_TRACES_SAMPLER
value: 'always_on'
requirements.txtを更新:
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
app.yamlを更新:
command: ['opentelemetry-instrument', 'uvicorn', 'app:app', '--host', '0.0.0.0', '--port', '8000']
env:
- name: OTEL_TRACES_SAMPLER
value: 'always_on'
requirements.txtを更新:
fastapi
uvicorn
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-fastapi
otel.jsファイルを作成します:
'use strict';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto';
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter(),
metricReader: new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter(),
exportIntervalMillis: 10000,
}),
instrumentations: [
getNodeAutoInstrumentations({
'@opentelemetry/instrumentation-fs': { enabled: false },
}),
],
});
try {
sdk.start();
} catch (e) {
console.error('OTel SDK failed to start', e);
}
async function shutdown() {
try {
await sdk.shutdown();
} catch (e) {
console.error('OTel SDK shutdown failed', e);
} finally {
process.exit(0);
}
}
process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);
package.jsonを更新:
{
"name": "nodejs-otel",
"version": "0.1.0",
"private": true,
"main": "app.js",
"scripts": {
"start": "node -r ./otel.js app.js"
},
"dependencies": {
"express": "^4.21.2",
"morgan": "^1.10.0",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/sdk-node": "0.203.0",
"@opentelemetry/auto-instrumentations-node": "0.67.3",
"@opentelemetry/exporter-trace-otlp-proto": "0.203.0",
"@opentelemetry/exporter-metrics-otlp-proto": "0.203.0",
"@opentelemetry/exporter-logs-otlp-proto": "0.203.0",
"@opentelemetry/sdk-metrics": "2.0.1"
}
}
環境変数
アプリ テレメトリを有効にすると、Databricks は、OTLP コレクター エンドポイント、エクスポート プロトコル、リソース属性、およびバッチ処理のために、アプリ ランタイムの環境変数を自動的に構成します。OTel 環境変数の完全なリストについては、 「アプリ テレメトリ環境変数」を参照してください。
価格
アプリのテレメトリは Zerobus Ingest コネクタを通じて Unity Catalog テーブルに書き込まれるため、テレメトリの取り込みは Lakeflow Connect の利用として課金されます。これは、アプリ自体を実行するためのコンピュート料金とは別です。
料金は「Jobs Serverless」SKUに対して請求されます。料金については、 Lakeflow Connectの価格ページを参照してください。
テレメトリ取り込みのコストを追跡するには、課金利用システムテーブルをクエリーします。Zerobus Ingestの使用状況を分離するフィルターについては、 「使用状況のモニタリング」を参照してください。アプリ自体のコンピュートコストを監視するには、 「アプリコストの監視」を参照してください。
制限事項
アプリのテレメトリは、Zerobus Ingest コネクタを使用して Unity Catalog テーブルにデータを書き込みます。すべての Zerobus Ingest コネクタの制限事項は、レコードサイズ、throughput、配信保証、ターゲットテーブルの要件に関する制限を含め、アプリのテレメトリに適用されます。Zerobus Ingest のクォータを参照してください。
Zerobusの制限に加えて、アプリのテレメトリ機能では、ログ行あたりの最大サイズが1MBに制限されます。