GH GambleHub

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の接続、ドリルダウンと自動ロールバックの追加、わかりやすいコストで管理可能な信頼性が得られます。

Contact

お問い合わせ

ご質問やサポートが必要な場合はお気軽にご連絡ください。いつでもお手伝いします!

Telegram
@Gamble_GC
統合を開始

Email は 必須。Telegram または WhatsApp は 任意

お名前 任意
Email 任意
件名 任意
メッセージ 任意
Telegram 任意
@
Telegram を入力いただいた場合、Email に加えてそちらにもご連絡します。
WhatsApp 任意
形式:+国番号と電話番号(例:+81XXXXXXXXX)。

ボタンを押すことで、データ処理に同意したものとみなされます。