Observabilityスタック
1)なぜ観測スタックが必要なのか
急速なRCAおよび減らされたMTTR:数分で引き起こすために徴候から。
SLO管理:エラー/レイテンシの測定、誤った予算によるアラート。
リリースコントロール:カナリア計算、メトリックによる自動ロールバック。
セキュリティと監査:アクセスルート、異常、法的保持。
FinOpsの透明性:ストレージ/リクエストのコスト、SLOごとのコスト。
方法論:ゴールデンシグナル(レイテンシ/トラフィック/エラー/彩度)、RED、 USE。
2)基本的なスタックアーキテクチャ
レイヤーごとのコンポーネント
コレクション/エージェント:Exporters、 Promtail/Fluent Bit、 OTel SDK/Auto-Instr、 Blackbox-probes。
ingest: Prometheus remote_write→Mimir/Thanos、 Loki ディストリビューター/ingesters、 Tempo/Jaeger ingesters。
ストレージ:オブジェクトS3/GCS/MinIO(長い寒さ)、SSD(熱い行)。
クエリ/ビジュアライゼーション:Grafana(パネル、SLOウィジェット)、Kibana (ELKの場合)。
管理:Alertmanager/Graphanaアラート、サービスカタログ、RBAC、シークレットマネージャー。
展開パターン
管理(Grafana Cloud/クラウドサービス)-ボリュームで高速かつ高価。
K8sでセルフホスティング-完全な制御、操作、FinOpsが必要です。
3)データ標準: 統一された「オブザビリティスキーム」
3.1メトリック(Prometheus/OpenMetrics)
必須ラベル:'env'、 'region'、 'cluster'、 'namespace'、 'service'、 'version'、 'tenant'(マルチテナントの場合)、'endpoint'。
名前:'snake_case'、接尾辞'_total'、'_seconds'、'_bytes'。
棒グラフ:固定'バケット'(SLO指向)。
Cardinality:ラベルに'user_id'、 'request_id'は含まれません。
3.2つのログ
フォーマット:JSON;必須フィールド'ts'、 'level'、 'service'、 'env'、 'trace_id'、 'span_id'、 'msg'。
PII:エージェントのマスキング(PAN、トークン、電子メールなど)。
Lokiラベル:低いカーディナリティ('app'、 'namespace'、 'level'、 'tenant')のみ。
3.3トラック
OTel semantics:'サービス。name'、'deployment。環境'、'db。システム'、'http'。
サンプリング:p99ターゲットパスは'always_on '/tail-sampling、残りは'parent/ratio'です。
IDの埋め込み:ログとメトリック(ラベル/フィールド)に'trace_id/span_id'をフリックします。
4) M-L-T相関(メトリック/ログ/トレース)
アラートグラフ(メトリック)→フィルタされたログから'trace_id'→特定のトレースを指定します。
トレース(スロースパン)から、スパン間隔の特定のバックエンドのメトリックの要求は→です。
パネルのドリルダウンボタン:「ログへ」と「トレースへ」変数置換('$env'、'$service'、'$trace_id')。
5) OpenTelemetryコレクター: 参照パイプライン
yaml receivers:
otlp:
protocols: { http: {}, grpc: {} }
prometheus:
config:
scrape_configs:
- job_name: kube-nodes static_configs: [{ targets: ['kubelet:9100'] }]
processors:
batch: {}
memory_limiter: { check_interval: 1s, limit_mib: 512 }
attributes:
actions:
- key: deployment. environment value: ${ENV}
action: insert tail_sampling:
decision_wait: 5s policies:
- name: errors type: status_code status_code: { status_codes: [ERROR] }
- name: important-routes type: string_attribute string_attribute: { key: http. target, values: ["/payments","/login"] }
- name: probabilistic type: probabilistic probabilistic: { sampling_percentage: 10 }
exporters:
otlphttp/mimir: { endpoint: "https://mimir/api/v1/push" }
otlphttp/tempo: { endpoint: "https://tempo/api/traces" }
loki:
endpoint: https://loki/loki/api/v1/push labels:
attributes:
env: "deployment. environment"
service: "service. name"
service:
pipelines:
metrics: { receivers: [prometheus, otlp], processors: [memory_limiter, batch], exporters: [otlphttp/mimir] }
logs: { receivers: [otlp], processors: [batch], exporters: [loki] }
traces: { receivers: [otlp], processors: [memory_limiter, attributes, tail_sampling, batch], exporters: [otlphttp/tempo] }
6)警告: SLOおよび複数の焼跡
アイデア:alertimは「CPU> 80%」のレベルではなく、Error Budgetの消費量です。
PromQLテンプレート:promql
5-minute error rate err_ratio_5m =
sum(rate(http_requests_total{status=~"5.."}[5m])) /
sum(rate(http_requests_total[5m]))
Quick burn (1m window)
(err_ratio_1m / (1 - SLO)) > 14. 4
Slow burn (30m)
(err_ratio_30m / (1 - SLO)) > 2
レイテンシー(ヒストグラム):
promql latency_p95 =
histogram_quantile(0. 95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
7)ダッシュボード: フォルダ構造
00_Overview-プラットフォーム:SLO、 P95、 5xx%、容量、アクティブインシデント。
10_Services-サービス別:RPS、 p95/p99、エラー、リリース(注釈)。
20_Infra-K8s/nodes/story/network、 etcd、コントローラー。
30_DB/Queues-PostgreSQL/Redis/Kafka/RabbitMQ。
40_Edge/DNS/CDN/WAF-入力、LB、 WAFルール。
50_Synthetic-アップタイムとヘッドレススクリプト。
60_Cost/FinOps-ストレージ、お問い合わせ、ホット/コールド、予報。
各パネル:説明、単位、所有者、runbookリンク、drilldown。
8)ログ: LogQLワークショップ
logql
API errors
{app="api", level="error"} = "Exception"
Nginx 5xx in 5 minutes
{app="nginx"} json status=~"5.." count_over_time([5m])
Extract Fields
{app="payments"} json code!="" unwrap duration avg()
9)トラック: TraceQLとトリック
最も遅いスパンを見つけて下さい:
{ service. name = "api" } duration > 500ms
Slow SQL sandwich in a slow query:
{ name = "HTTP GET /order" } child. span. name = "SELECT" & child. duration > 50ms
10)合成および稼働時間
Blackbox-exporter: ≥ 3 リージョン/ASNからのHTTP/TCP/TLS/DNSサンプル。
Headless:ログイン/入金スケジュールされたスクリプト。
Quorumアラート:regional ≥ 2が失敗した場合にトリガーされます。
ステータスページ:自動更新+手動コメント。
11)貯蔵および保持
メトリクス:ホット7-30日(高速行)、ダウンサンプリング/記録ルール、コールド-オブジェクトストレージ(数ヶ月)。
ログ:3-7日間ホットし、インデックス(Loki chunk store/ELK ILM)でS3/GCSします。
トレース:3-7日'always_on'+サンプルの長期保存(テールサンプリング/拒否)。
- サイズおよび時間のロールオーバー;リクエストの予算(クォータ/制限)。
- prod/stageとセキュリティデータの個別のポリシー。
12)複数のテナントおよびアクセス
'tenant'/'namespace '/Spaces、インデックスパターン、解像度で区切ります。
請求のためのリソースをタグ付け:'テナント'、'サービス'、'チーム'。
ダッシュボード/アラートを特定のチームのスペースにインポートします。
13)安全性とコンプライアンス
エージェントからバックエンドへのTLS/mTLS、プライベートヘルスのためのHMAC。
すべてのリクエストとアラートを読み取り/書き込み、監査するRBAC。
端のPII版;ログ内の秘密の禁止;DSAR/Legal Hold。
アイソレーション:機密ドメインのクラスタ/nymspacesを分離します。
14) FinOps: 観測可能性のコスト
私達はingestのラベルそして論理のcardinalityを減らします(要求ではなく)。
クリティカルパスのサンプリング+ターゲットを常にトラッキングします。
重い集計のためのダウンサンプリング/記録ルール。
冷たいオブジェクトへのレアアクセスをアーカイブします。
'storage_cost_gb_day'、 'query_cost_hour'、 'cost_per_rps'、 'cost_per_9'。
15) CI/CDおよび観察性試験
CIでのメトリック/ログのリンク:カーディナリティの「爆発」の禁止、ヒストグラム/ユニットの検証。
オブザビリティコントラクトテスト:ミドルウェアの必須メトリック/ログフィールド'trace_id'。
カナリア:グラフ上のリリースの注釈、SLO自動ロールバック。
16)例: クイッククエリ
エラーによるトップエンドポイント:promql topk(10, sum by (route) (rate(http_requests_total{status=~"5.."}[5m])))
CPUのスロットリング:
promql sum by (namespace, pod) (rate(container_cpu_cfs_throttled_seconds_total[5m])) > 0
カフカラグ:
promql max by (topic, group) (kafka_consumergroup_lag)
ログからトラックへ(Loki→Tempo): Tempo UI/ダッシュボードへのリンクとして'trace_id'を渡します。
17)スタック品質: チェックリスト
- 合意されたメトリック/ログ/トレーススキームと単位。
- ログとメトリックの'trace_id'、パネルからのドリルダウン。
- フラップなしでマルチバーンSLOアラート(クォーラム/マルチウィンドウ)。
- ダウンサンプリング、リクエストクォータ、ステップ/範囲制限。
- 保存クラスと保存クラスは文書化され、適用されます。
- RBAC/監査/PIIリビジョンが含まれています。
- ダッシュボード:所有者、runbooks、 ≤ 2-3画面、迅速な応答。
- FinOps-dashboard(ボリューム、コスト、トップトーカー)。
18)実施計画(3回繰り返し)
1.MVP (2週間):プロメテウス→ミミール、ロキ、テンポ;OTelコレクター;基本的なダッシュボードとSLOアラート;ブラックボックスのサンプル。
2.スケール(3-4週間):テールサンプリング、ダウンサンプリング、マルチリージョンインジェスト、RBAC/スペース、 FinOpsダッシュボード。
3.Pro (4週間以上):SLOの自動ロールバック、キーパスのヘッドレス合成、リーガルホールド、SLOポートフォリオおよびレポート。
19)アンチパターン
「SLOなしの美しいグラフィックス」-アクションなし→利益なし。
高いカーディナリティラベル('user_id'、 'request_id')-メモリとコストの爆発。
JSONなしのログと'trace_id'なしのログ-相関はありません。
症状の代わりにリソースのアラート-ノイズとオンコールのバーンアウト。
保持ポリシーの欠如-制御されていないコストが増加します。
20) ミニFAQ
選ぶべきもの:LokiかELKか?
複雑な検索/ファセットのためのELK;Lokiは、grepのようなシナリオではより安価で高速です。ハイブリッドがよく使われる。
誰もがトラックを必要としていますか?
はい、少なくともテールサンプリングを使用したキーパス(ログイン、チェックアウト、支払い)では、これはRCAを劇的に高速化します。
ゼロから始めるには?
OTel Collector→Mimir/Loki/Tempo→基本的なSLOとブラックボックスのサンプル→その後、ダッシュボードとバーンアラート。
合計
観測スタックは、異なるツールのセットではなく、一貫したシステムです:均一なデータ標準→M-L-T相関→SLOアラートと合成→安全性とFinOps。回路図のキャプチャ、ラベルの規律と保持、OTelの接続、ドリルダウンと自動ロールバックの追加、わかりやすいコストで管理可能な信頼性が得られます。