Databricks Appsのテレメトリを構成する
ベータ版
アプリテレメトリはベータ版です。
Databricks Appsテレメトリは、トレース、ログ、メトリックを収集し、OpenTelemetry (OTel) プロトコルを使用してUnity Catalogテーブルに保存します。 アプリ テレメトリを有効にすると、Databricks は、ユーザー ログインや直接 API 要求などのシステム ログと使用イベントを自動的にキャプチャします。フレームワーク用の OpenTelemetry SDK を使用してカスタム インストルメンテーションを追加することもできます。
要件
-
ワークスペースは、サポートされているリージョン内にある必要があります:
ap-northeast-1、ap-northeast-2、ap-south-1、ap-southeast-1、ap-southeast-2、ca-central-1、eu-central-1、eu-west-1、eu-west-2、sa-east-1、us-east-1、us-east-2、us-west-2。 -
Unity Catalogに新しいテレメトリ ターゲット テーブルを作成するには、ターゲット カタログとスキーマに対する
CAN MANAGE権限と、スキーマに対するCREATE TABLE権限が必要です。 -
Unity Catalog内の既存のテレメトリ ターゲット テーブルに書き込むには、ターゲット カタログとスキーマに対する
CAN MANAGE権限が必要です。または、すべての ユーザーがターゲット テーブルに対するUSE CATALOG、USE SCHEMA、SELECT、およびMODIFYを持っている必要があります。 -
ターゲット テーブルは、ワークスペースと同じリージョン内の管理された Delta テーブルである必要があります。
-
Databricks 、クエリのパフォーマンスを向上させるために、テレメトリ ターゲット テーブルで予測的最適化を有効にすることをお勧めします。
アプリテレメトリを有効にする
アプリ テレメトリ ベータ版より前にアプリを作成した場合は、次の構成手順に進む前に、アプリを停止して再起動する必要があります。
アプリのテレメトリをオンにするには、アプリ設定でテレメトリ テーブルのカタログとスキーマを構成します。
- Databricks ワークスペースでアプリの詳細ページを開きます。
- 概要タブで、 アプリテレメトリ 構成セクションを見つけて、 追加 をクリックします。
- カタログとスキーマを入力するか参照して選択します。Databricks は、選択した場所の 3 つのテーブル (
otel_metrics、otel_spans、otel_logs) にテレメトリ データを書き込みます。 - (オプション) テーブルに
<prefix>_otel_metrics、<prefix>_otel_spans、<prefix>_otel_logsという名前が付けられるように、テーブル プレフィックスを指定します。Databricks は既存のテーブルに追加するか、存在しない場合はテーブルを作成します。 - 保存 をクリックします。
- テレメトリが Unity Catalog に流れ始めるようにアプリを再デプロイします。
テレメトリデータを検証する
再デプロイメント後、 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;
次の例では、 otel_logsテーブルで過去 1 時間以内のシステムまたはカスタム OpenTelemetry ERROR ログを照会します。
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;
カスタムインストルメンテーションを追加する
OpenTelemetry 自動計測を追加して、カスタム トレース、メトリクス、ログを生成します。 フレームワークに応じて、 app.yamlと依存関係ファイルを更新します。
- Streamlit
- Dash
- Flask
- 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
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 環境変数の完全なリストについては、 「アプリ テレメトリ環境変数」を参照してください。
制限
アプリテレメトリには次の制限が適用されます。
上限 | Value |
|---|---|
レコードサイズ | レコードあたり10 MB |
リクエストサイズ | リクエストごとに30 MB |
ログラインサイズ | ログ行あたり1 MB |
レート制限 | ワークスペースごとに 1 秒あたり 100 件のエクスポート リクエスト |
耐久性 | 単一のアベイラビリティゾーンのみ。ゾーンが利用できない場合、エクスポート パイプラインでダウンタイムが発生する可能性があります。 |
配達 | 少なくとも 1 回。サーバーからの確認応答は、レコードが Delta テーブルに永続的に書き込まれたことを意味します。 |
制限事項
アプリテレメトリには次の制限があります。
- テーブル名では、ASCII 文字、数字、アンダースコアのみがサポートされます。
- ターゲット テーブルでは、Arclight のデフォルト ストレージを使用できません。
- ターゲット テーブルを再作成することはできません。
- アプリ テレメトリは、ターゲット テーブルでのスキーマ進化をサポートしていません。