ストーリー
田
田中VPoE
SREの世界ではオブザーバビリティ(可観測性)が重要だ。メトリクス、ログ、トレースの3本柱で、システムの状態を把握し障害を早期検知する
あなた
データパイプラインにも同じ考え方が適用できるんですか?
あ
田
田中VPoE
まさにそうだ。データオブザーバビリティは、「データのダウンタイム」を検知し最小化するための仕組みだ。パイプラインが正常に動いていても、データが壊れている可能性がある。これを「サイレントデータ障害」と呼ぶ
あなた
パイプラインのジョブは成功しているのに、データの中身がおかしいケースですね
あ
田
田中VPoE
例えば、ソースシステムの仕様変更で日付フォーマットが変わり、NULLに変換されてしまうケース。dbtジョブは成功するが、データの品質は壊れている。これをプロアクティブに検知するのがデータオブザーバビリティだ
データオブザーバビリティの5本柱
監視すべき5つの領域
| 柱 | 監視対象 | 異常の例 | 検知方法 |
|---|
| 鮮度(Freshness) | データの最終更新時刻 | テーブルが6時間更新されていない | タイムスタンプ監視 |
| ボリューム(Volume) | テーブルのレコード数 | 日次で通常1万件が100件に激減 | 統計的異常検知 |
| スキーマ(Schema) | テーブル構造の変更 | カラムが追加/削除された | スキーマスナップショット比較 |
| 分布(Distribution) | カラム値の統計的分布 | NULL率が突然30%に上昇 | 分布モニタリング |
| リネージ(Lineage) | データの依存関係 | 上流テーブルの障害による下流への影響 | 依存関係の追跡 |
データオブザーバビリティの全体像:
┌──────────────────────────────────────────────┐
│ データオブザーバビリティ │
│ │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌────┐│
│ │ 鮮度 │ │ 量 │ │スキーマ│ │ 分布 │ │系譜 ││
│ │ │ │ │ │ │ │ │ │ ││
│ │ 最終 │ │レコード│ │ 構造 │ │ NULL │ │依存 ││
│ │ 更新 │ │ 数 │ │ 変更 │ │ 率 │ │関係 ││
│ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ └─┬──┘│
│ │ │ │ │ │ │
│ └────────┴────────┴────────┴────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ 異常検知エンジン │ │
│ │ (ML + ルール) │ │
│ └───────┬────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ アラート + 対応 │ │
│ │ Slack/PagerDuty │ │
│ └────────────────┘ │
└──────────────────────────────────────────────┘
データオブザーバビリティツール
主要ツール比較
| ツール | ライセンス | 特徴 | 異常検知 |
|---|
| Monte Carlo | 商用 | フルマネージド、ML異常検知 | 自動(ML) |
| Elementary | OSS | dbtネイティブ | ルールベース + 統計 |
| Soda | OSS / 商用 | SodaCL言語、マルチプラットフォーム | ルールベース |
| Great Expectations | OSS | Python、テスト特化 | ルールベース |
| re_data | OSS | dbt統合 | 統計的異常検知 |
Elementary(dbtネイティブ)の例
# dbt_project.yml
# Elementary パッケージで異常検知テストを定義
models:
- name: slv_orders
columns:
- name: total_amount
tests:
- elementary.column_anomalies:
# 過去30日間の統計から異常を検知
timestamp_column: order_date
where: "order_date >= CURRENT_DATE - 30"
anomaly_sensitivity: 3 # 3σ以上で異常
- name: order_id
tests:
- elementary.volume_anomalies:
# レコード数の異常を検知
timestamp_column: order_date
anomaly_sensitivity: 3
アラート設計
アラートの分類
| 重要度 | 条件 | 通知先 | 対応時間 |
|---|
| Critical | 主要テーブルの鮮度が2時間超過 | PagerDuty + Slack #data-incidents | 30分以内 |
| High | レコード数が期待値の50%以下 | Slack #data-alerts | 2時間以内 |
| Medium | NULL率が閾値を超過 | Slack #data-quality | 翌営業日 |
| Low | スキーマ変更の検知 | Slack #data-changes | 確認のみ |
アラート疲れの防止
| 対策 | 方法 |
|---|
| 重要テーブルに限定 | Gold層 + 経営ダッシュボード関連のみCritical |
| 集約通知 | 同じ問題のアラートは1つにまとめる |
| 自動解決 | 一時的な異常は一定時間後に自動クローズ |
| チューニング | 誤検知が多いアラートの閾値を調整 |
| オンコールローテーション | 対応者を交代制にして負荷分散 |
データインシデント管理
インシデント対応フロー
データインシデント対応フロー:
1. 検知 (MTTD: Mean Time to Detect)
└── アラート受信 → インシデント起票
2. 影響分析 (MTTI: Mean Time to Identify)
├── リネージで影響範囲を特定
├── 影響を受けるダッシュボード/レポートを特定
└── ステークホルダーに影響を通知
3. 根本原因分析
├── リネージで上流をたどる
├── 品質チェックログを確認
└── ソースシステムの変更を確認
4. 修復 (MTTR: Mean Time to Resolve)
├── データの修正(再処理/パッチ)
├── パイプラインの修正
└── 品質チェックの追加
5. 振り返り
└── ポストモーテム → 再発防止策
データSLAの定義
| SLA | 定義 | 目標値 |
|---|
| MTTD | 検知までの平均時間 | 30分以内 |
| MTTR | 復旧までの平均時間 | 4時間以内 |
| データ鮮度SLA | Gold層の更新遅延 | 2時間以内 |
| 品質スコアSLA | 品質スコアの下限 | 95点以上 |
| 可用性SLA | パイプラインの稼働率 | 99.5% |
「データオブザーバビリティは、SREのオブザーバビリティをデータに適用したものだ。サイレントデータ障害を検知できる仕組みがなければ、誤ったデータで意思決定するリスクを常に抱えることになる」 — 田中VPoE
まとめ
| ポイント | 内容 |
|---|
| 5本柱 | 鮮度、ボリューム、スキーマ、分布、リネージ |
| ツール | Monte Carlo(商用)、Elementary(OSS/dbt)、Soda(OSS) |
| アラート設計 | 重要度に応じた通知先と対応時間の定義、アラート疲れの防止 |
| インシデント管理 | 検知→影響分析→根本原因分析→修復→振り返りのフロー |
チェックリスト
次のステップへ
次は「演習:データガバナンス基盤を設計しよう」です。Step 4で学んだデータ品質、リネージ、カタログ、オブザーバビリティを統合したガバナンス基盤を設計します。
推定読了時間: 30分