オブザーバビリティとは
オブザーバビリティ(可観測性)は、システムの外部出力からシステム内部の状態を理解する能力です。「何が起きているか」だけでなく「なぜ起きているか」を把握できます。
監視との違い: 監視は既知の問題を検出しますが、オブザーバビリティは未知の問題も調査できます。
3本柱
flowchart LR
subgraph Observability["オブザーバビリティ"]
Metrics["メトリクス<br/>Metrics<br/>「何が起きているか」"]
Logs["ログ<br/>Logs<br/>「詳細は何か」"]
Traces["トレース<br/>Traces<br/>「どう流れたか」"]
end
メトリクス(Metrics)
数値データを時系列で記録します。
メトリクスの種類
| 種類 | 説明 | 例 |
|---|---|---|
| Counter | 増加のみ | リクエスト数、エラー数 |
| Gauge | 増減する値 | CPU使用率、メモリ使用量 |
| Histogram | 分布 | レスポンスタイム |
| Summary | 統計値 | パーセンタイル |
Prometheusの例
const prometheus = require('prom-client');
// Counterの例
const requestCounter = new prometheus.Counter({
name: 'http_requests_total',
help: 'Total HTTP requests',
labelNames: ['method', 'path', 'status']
});
// Histogramの例
const responseTime = new prometheus.Histogram({
name: 'http_response_time_seconds',
help: 'HTTP response time in seconds',
buckets: [0.1, 0.5, 1, 2, 5]
});
// 計測
app.use((req, res, next) => {
const end = responseTime.startTimer();
res.on('finish', () => {
requestCounter.inc({
method: req.method,
path: req.path,
status: res.statusCode
});
end();
});
next();
});
重要なメトリクス(RED/USE)
REDメソッド(サービス向け):
- Rate: リクエストレート
- Errors: エラーレート
- Duration: レスポンスタイム
USEメソッド(リソース向け):
- Utilization: 使用率
- Saturation: 飽和度
- Errors: エラー
ログ(Logs)
イベントの詳細を記録します。
構造化ログ
// 構造化されていないログ(検索しにくい)
console.log(`User ${userId} logged in from ${ip}`);
// 構造化ログ(検索・分析しやすい)
const log = {
timestamp: new Date().toISOString(),
level: 'info',
message: 'User logged in',
userId: '123',
ip: '192.168.1.1',
userAgent: 'Mozilla/5.0...',
requestId: 'req_abc123'
};
console.log(JSON.stringify(log));
ログレベル
| レベル | 用途 |
|---|---|
| ERROR | エラー、異常事態 |
| WARN | 警告、潜在的な問題 |
| INFO | 重要なイベント |
| DEBUG | デバッグ情報 |
| TRACE | 詳細なトレース情報 |
ログ管理スタック
ELK Stack:
アプリ → Filebeat → Logstash → Elasticsearch → Kibana
Loki Stack:
アプリ → Promtail → Loki → Grafana
トレース(Traces)
リクエストがシステムを通過する経路を追跡します。
分散トレーシング
flowchart TB
subgraph Trace["Trace ID: abc123"]
subgraph Gateway["Span: API Gateway (50ms)"]
Auth["Span: Auth Service (10ms)"]
subgraph UserSvc["Span: User Service (30ms)"]
DB["Span: Database Query (15ms)"]
end
end
end
OpenTelemetryの例
const { trace } = require('@opentelemetry/api');
const tracer = trace.getTracer('my-service');
async function processOrder(orderId) {
return tracer.startActiveSpan('processOrder', async (span) => {
span.setAttribute('order.id', orderId);
try {
await validateOrder(orderId);
await processPayment(orderId);
span.setStatus({ code: 1 }); // OK
} catch (error) {
span.setStatus({ code: 2, message: error.message }); // ERROR
throw error;
} finally {
span.end();
}
});
}
主要なツール
| ツール | 特徴 |
|---|---|
| Jaeger | CNCFプロジェクト、Uber開発 |
| Zipkin | Twitter開発、シンプル |
| AWS X-Ray | AWS統合 |
| Datadog APM | SaaS、豊富な機能 |
アラート
メトリクスに基づいて通知を行います。
アラートの設計
# Prometheus Alertmanager の例
groups:
- name: app-alerts
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate detected"
description: "Error rate is {{ $value }} for the last 5 minutes"
- alert: SlowResponseTime
expr: histogram_quantile(0.95, rate(http_response_time_seconds_bucket[5m])) > 2
for: 10m
labels:
severity: warning
アラート疲れの防止
良いアラートの条件:
✓ アクションが必要な事象のみ
✓ 適切な閾値(ノイズを減らす)
✓ 明確な対応手順
✓ エスカレーションポリシー
避けるべきアラート:
✗ 情報提供のみ(ダッシュボードで確認)
✗ すぐに自動復旧する事象
✗ 対応できない深夜のアラート
ダッシュボード
Grafanaダッシュボードの構成
| セクション | 内容 |
|---|---|
| サービス概要 | リクエストレート / レスポンスタイム(p95) |
| エラー指標 | エラーレート / 成功率 |
| リソース使用率 | CPU / Memory / Disk / Network |
| ログ | 最近のエラーログ |
まとめ
オブザーバビリティは、複雑なシステムの健全性を理解するために不可欠です。メトリクス、ログ、トレースの3本柱を組み合わせ、問題の検出から原因調査までをスムーズに行えるようにしましょう。適切なアラート設定とダッシュボードにより、障害への迅速な対応が可能になります。
← 一覧に戻る