「アラートが鳴り続けて疲弊している」「本番で問題が起きてもどこが原因かわからない」——これはオブザーバビリティ(可観測性)が不十分なシステムの典型的な症状です。メトリクス・ログ・トレースという「可観測性の三本柱」を統合的に扱う標準仕様として「OpenTelemetry(OTel)」が2024〜2025年にかけて事実上の業界標準となっています。
オブザーバビリティをたとえで説明すると「飛行機のフライトレコーダー」のようなものです。何か問題が起きたとき、「いつ・どこで・何が起きたか」を後から正確に再現できる——これがオブザーバビリティの本質です。ログだけでは「何が起きたか」はわかっても「なぜ起きたか」はわかりません。トレースがあって初めて「リクエストがどのサービスのどの処理で遅くなったか」が見えます。
運用エンジニアS:「注文APIのレスポンスが時々遅いんですが、ログを見てもどこで詰まってるかわからなくて」
SREエンジニアT:「トレーシングが入ってないとそうなるよね。OpenTelemetryを計装すれば、リクエストが在庫サービス・決済サービス・配送サービスのどこで何ミリ秒かかったか全部見えるようになる」
S:「大変な作業ですか?」
T:「最近はゼロコード計装(auto-instrumentation)があるから、コードを一行も変えずに始められる」
Node.jsアプリへのOpenTelemetry自動計装の例を見てみましょう。
# 必要なパッケージをインストール
npm install @opentelemetry/sdk-node \
@opentelemetry/auto-instrumentations-node \
@opentelemetry/exporter-otlp-grpc
# tracing.js を作成
# node --require ./tracing.js app.js で起動するだけでOK
tracing.jsの中身はこうなります。
const { NodeSDK } = require("@opentelemetry/sdk-node");
const { getNodeAutoInstrumentations } = require("@opentelemetry/auto-instrumentations-node");
const { OTLPTraceExporter } = require("@opentelemetry/exporter-otlp-grpc");
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: "http://otel-collector:4317",
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
次に、SLOの設定例をPrometheusのrecording ruleで定義してみましょう。
# prometheus-rules.yaml
groups:
- name: slo_rules
rules:
# エラーレートの計算(99.9%の可用性SLO)
- record: job:http_errors:rate5m
expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])
# SLOバジェット残量のアラート
- alert: ErrorBudgetBurning
expr: job:http_errors:rate5m > 0.001
for: 5m
labels:
severity: warning
「SLOを設定する」とは「このサービスはどの程度壊れていいか」を意識的に決めることです。99.9%の可用性なら年間8.7時間のダウンタイムが許容される——この「エラーバジェット」の考え方を持つことで、運用チームは「問題が起きるたびに全員が徹夜で対応する」という消耗から解放されます。今日からOpenTelemetryを入れて、まず可視化から始めましょう。見えないものは改善できません。