日曜日の朝。あなたのスマホが鳴った。
Mika: 「すみません、昨日の夜からうちのお店の予約ページが開けないんですけど…」
あなた: 「えっ、いつからですか?」
Mika: 「お客さんから連絡があったのは昨晩10時くらいです。何人か予約しようとしてダメだったみたいで…」
あなたは慌ててダッシュボードを確認する。確かにAPIサーバーが応答していない。ログを調べると、昨晩9時にデータベースの接続数が上限に達してエラーが出ていた。
あなた: 「10時間も気づかなかった…」
あなた: 「日曜だったから誰もモニタリングしてなかったんだよ。」
Yuki: 「これは人間の問題じゃない、仕組みの問題だよ。」
あなた: 「仕組み?」
Yuki: 「今のShimaLinkには”目”がないんだ。サーバーが悲鳴を上げているのに、誰も気づけない。モニタリングとアラートの仕組みを作れば、問題が起きた瞬間に通知が来る。ユーザーが気づく前に、あなたたちが先に動けるようになる。」
あなた: 「ユーザーよりも先に問題を知る…」
Yuki: 「そう。それが信頼性の高いサービスの条件。観測可能性——オブザーバビリティって呼ぶんだけど、ログ、メトリクス、トレースの3本柱でシステムの状態を可視化するんだ。」
「お医者さんが患者の心拍数や血圧をモニタリングするように、エンジニアもサービスの”健康状態”を常に見守る必要がある」とYukiは言った。
ShimaLinkに”目”を持たせる。
なぜモニタリングが重要なのか
「計測できないものは改善できない。見えないものは守れない。」 ——Yuki
モニタリングがない世界
問題発生(夜中3時)
↓ 数時間
ユーザーが気づく
↓ 問い合わせ
サポートに連絡が来る
↓ 翌朝
開発者が知る
↓ 調査開始
原因を特定
↓ 修正・デプロイ
復旧
→ 総ダウンタイム: 10時間以上
モニタリングがある世界
問題発生(夜中3時)
↓ 30秒
アラート発報(Slack通知)
↓ 5分
開発者が対応開始
↓ 調査・修正
復旧
→ 総ダウンタイム: 30分以下
オブザーバビリティの3本柱
| 柱 | 内容 | 例 |
|---|---|---|
| ログ | イベントの詳細記録 | エラーメッセージ、アクセスログ |
| メトリクス | 数値で表す指標 | CPU使用率、レスポンスタイム |
| トレース | リクエストの追跡 | API → DB → 外部APIの流れ |
オブザーバビリティ
┌────┼────┐
│ │ │
ログ メトリクス トレース
「何が起きた」「どのくらい」「どこを通った」
ログ
「何が起きたか」を詳細に記録。デバッグに最も役立つ。
[2024-10-15 03:00:12] ERROR: Database connection failed
- host: shimalink-db
- error: too many connections (max: 50)
- current: 50
メトリクス
「どのくらいか」を数値で示す。傾向把握やアラートに使う。
cpu_usage: 35% → 55% → 78% → 95% ← 上昇傾向!
response_time: 50ms → 80ms → 200ms → timeout
db_connections: 10 → 30 → 48 → 50 ← 上限到達!
トレース
「リクエストがどこを通ったか」を追跡。ボトルネックの特定に使う。
[ユーザーの予約リクエスト]
→ API Gateway (2ms)
→ 認証サービス (15ms)
→ 予約API (5ms)
→ データベースクエリ (350ms) ← ボトルネック!
→ メール送信 (100ms)
Total: 472ms
主要なモニタリングツール
| ツール | 特徴 | 料金 |
|---|---|---|
| Datadog | オールインワン、高機能 | 有料 |
| Grafana + Prometheus | OSS、自由度が高い | 無料(自前運用) |
| Cloud Monitoring (GCP) | GCPとネイティブ統合 | 無料枠あり |
| CloudWatch (AWS) | AWSとネイティブ統合 | 無料枠あり |
| New Relic | APM に強い | 無料枠あり |
ShimaLinkでは、まずクラウドプロバイダーのネイティブツールから始めるのが効率的です。
SLI / SLO / SLA
サービスの信頼性を測る指標です。
| 用語 | 意味 | ShimaLinkの例 |
|---|---|---|
| SLI (Service Level Indicator) | 測定指標 | レスポンスタイム、エラー率 |
| SLO (Service Level Objective) | 目標値 | 99.9% の可用性 |
| SLA (Service Level Agreement) | 契約上の保証 | 稼働率99.5%を保証 |
Yuki: 「モニタリングは”後から入れる”ものじゃない。最初から設計に含めるもの。病気になってから健康診断を始めるのは遅いでしょ?」
ポイント
- モニタリングなしでは問題の発見が遅れ、ユーザーに先に気づかれる
- ログ、メトリクス、トレースがオブザーバビリティの3本柱
- クラウドネイティブのモニタリングツールから始めるのが効率的
- SLI/SLO/SLAで信頼性の目標を明確にする
ロギングのベストプラクティス
「良いログは、未来の自分へのラブレターだよ。」 ——Yuki
ログレベル
| レベル | 用途 | 例 |
|---|---|---|
| ERROR | 処理が失敗した | DB接続エラー、API呼び出し失敗 |
| WARN | 問題の兆候 | メモリ使用率80%超え、リトライ発生 |
| INFO | 通常の動作記録 | リクエスト処理完了、ユーザーログイン |
| DEBUG | 開発時の詳細情報 | 変数の値、SQL文の内容 |
// Node.js でのログ出力例
const logger = require("winston");
// エラー — 即座に対応が必要
logger.error("Database connection failed", {
host: "shimalink-db",
error: err.message,
retryCount: 3,
});
// 警告 — 注意が必要
logger.warn("High memory usage detected", {
usage: "85%",
threshold: "80%",
});
// 情報 — 正常な動作の記録
logger.info("Booking created", {
bookingId: "BK-12345",
shopId: "SHOP-001",
userId: "USER-042",
});
// デバッグ — 開発時のみ
logger.debug("SQL query executed", {
query: "SELECT * FROM bookings WHERE ...",
duration: "12ms",
});
構造化ログ
テキストの羅列ではなく、JSON形式で出力するのがモダンなプラクティスです。
// 悪い例(非構造化ログ)
2024-10-15 03:00:12 Error: too many connections for user shimalink_user
// 良い例(構造化ログ)
{
"timestamp": "2024-10-15T03:00:12Z",
"level": "error",
"message": "Database connection failed",
"service": "shimalink-api",
"host": "shimalink-db",
"error": "too many connections",
"max_connections": 50,
"current_connections": 50,
"request_id": "req-abc123"
}
構造化ログのメリット:
- 検索・フィルタリングが容易
- ダッシュボードでの可視化が可能
- アラート条件の設定が正確にできる
リクエストIDによる追跡
すべてのログにリクエストIDを付与すると、1つのリクエストに関連するログを紐づけられます。
// ミドルウェアでリクエストIDを付与
app.use((req, res, next) => {
req.requestId = req.headers["x-request-id"] || uuid();
next();
});
// すべてのログにリクエストIDを含める
app.post("/api/bookings", (req, res) => {
logger.info("Booking request received", {
requestId: req.requestId,
shopId: req.body.shopId,
});
// ... 処理 ...
logger.info("Booking created successfully", {
requestId: req.requestId,
bookingId: newBooking.id,
});
});
# リクエストIDでフィルタすると、1つの予約の流れが見える
{"requestId": "req-abc123", "message": "Booking request received"}
{"requestId": "req-abc123", "message": "Validating booking data"}
{"requestId": "req-abc123", "message": "Checking availability"}
{"requestId": "req-abc123", "message": "Booking created successfully"}
ログの保存と管理
| 項目 | 推奨 |
|---|---|
| 保存期間 | 本番ログ: 30日〜90日 |
| 保存先 | クラウドのログサービス(CloudWatch Logs等) |
| 容量管理 | ローテーション(古いログを自動削除) |
| アクセス制御 | 機密情報を含むログは閲覧権限を制限 |
ログに含めてはいけない情報
// 悪い例 — 機密情報をログに出力
logger.info("User login", {
email: user.email,
password: user.password, // 絶対NG!
creditCard: user.cardNumber, // 絶対NG!
});
// 良い例 — 機密情報をマスク
logger.info("User login", {
userId: user.id,
email: maskEmail(user.email), // u***r@example.com
});
Yuki: 「本番で DEBUG レベルを有効にするとログが爆発するから注意。通常は INFO 以上にして、問題調査時だけ一時的に DEBUG を有効にするんだ。」
ポイント
- ログレベル(ERROR/WARN/INFO/DEBUG)を適切に使い分ける
- 構造化ログ(JSON形式)で検索・分析しやすくする
- リクエストIDで関連するログを紐づけられるようにする
- パスワードやクレジットカード情報は絶対にログに出力しない
- 本番では INFO 以上、デバッグ時だけ DEBUG を有効にする
メトリクスとダッシュボード
「数字で語れないものは管理できない。ダッシュボードはチームの共通言語になる。」 ——Yuki
監視すべき4大メトリクス(Golden Signals)
Googleが提唱する、サービス監視の4つの黄金シグナルです。
| シグナル | 意味 | ShimaLinkでの例 |
|---|---|---|
| レイテンシ | 応答にかかる時間 | APIレスポンスタイム: 95ms |
| トラフィック | リクエストの量 | 毎秒100リクエスト |
| エラー率 | 失敗したリクエストの割合 | 5xxエラー: 0.1% |
| サチュレーション | リソースの使用率 | CPU: 60%、メモリ: 75% |
アプリケーションレベルのメトリクス
// Express.js でメトリクスを収集する例
const prometheus = require("prom-client");
// レスポンスタイムのヒストグラム
const httpDuration = new prometheus.Histogram({
name: "http_request_duration_seconds",
help: "HTTPリクエストの処理時間",
labelNames: ["method", "route", "status"],
buckets: [0.05, 0.1, 0.3, 0.5, 1, 3],
});
// リクエスト数のカウンター
const httpRequests = new prometheus.Counter({
name: "http_requests_total",
help: "HTTPリクエストの総数",
labelNames: ["method", "route", "status"],
});
// ミドルウェアで計測
app.use((req, res, next) => {
const end = httpDuration.startTimer();
res.on("finish", () => {
end({
method: req.method,
route: req.route?.path || "unknown",
status: res.statusCode,
});
httpRequests.inc({
method: req.method,
route: req.route?.path || "unknown",
status: res.statusCode,
});
});
next();
});
// メトリクスエンドポイント
app.get("/metrics", async (req, res) => {
res.set("Content-Type", prometheus.register.contentType);
res.end(await prometheus.register.metrics());
});
インフラレベルのメトリクス
| メトリクス | 正常値 | 警告 | 危険 |
|---|---|---|---|
| CPU使用率 | < 60% | 60-80% | > 80% |
| メモリ使用率 | < 70% | 70-85% | > 85% |
| ディスク使用率 | < 70% | 70-90% | > 90% |
| DB接続数 | < 60% | 60-80% | > 80% |
| レスポンスタイム | < 200ms | 200-500ms | > 500ms |
| エラー率 | < 0.1% | 0.1-1% | > 1% |
ダッシュボードの設計
ShimaLink サービス概要ダッシュボード
┌─────────────────────────────────────────┐
│ ShimaLink サービス概要 │
├──────────┬──────────┬──────────┬─────────┤
│ 稼働率 │ 応答時間 │ エラー率 │ RPS │
│ 99.95% │ 95ms │ 0.05% │ 85 │
│ ✅ │ ✅ │ ✅ │ ✅ │
├──────────┴──────────┴──────────┴─────────┤
│ [レスポンスタイム 24時間グラフ] │
│ ░░░▒▒▓▓▓▒▒░░░░▒▓▓▒▒░░░░ │
├─────────────────────┬─────────────────── │
│ [CPU使用率] │ [メモリ使用率] │
│ ▓▓▓░░░░░░ 35% │ ▓▓▓▓▓▓░░░ 60% │
├─────────────────────┴─────────────────── │
│ [エラーログ(直近)] │
│ 03:00 WARN - High memory usage │
│ 02:45 INFO - Auto-scaled to 3 instances │
└───────────────────────────────────────── ┘
ダッシュボード設計のコツ
| 原則 | 説明 |
|---|---|
| 一目で状況がわかる | 赤/黄/緑の信号で正常・警告・異常を表示 |
| トップダウン | 概要 → 詳細の順に掘り下げられる構成 |
| アクション可能 | 異常を見たら次に何をすべきかわかる |
| ノイズを減らす | 重要な情報だけを表示する |
Grafana でのダッシュボード例
# docker-compose.yml に追加
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
# prometheus.yml
scrape_configs:
- job_name: "shimalink-api"
scrape_interval: 15s
static_configs:
- targets: ["api:4000"]
Yuki: 「ダッシュボードは朝一番にチーム全員が見るものにしよう。毎朝の習慣にすれば、異変にすぐ気づけるようになる。」
ポイント
- Golden Signals(レイテンシ、トラフィック、エラー率、サチュレーション)を監視する
- アプリケーションとインフラの両方のメトリクスを収集する
- ダッシュボードは「一目で状況がわかる」設計にする
- Prometheus + Grafana の組み合わせがOSSの定番
- チーム全員がダッシュボードを見る習慣を作る
アラート戦略 — 適切に通知し、適切に対応する
「アラートが多すぎると、本当に大事なアラートを見逃す。“アラート疲れ”は最大の敵だよ。」 ——Yuki
アラートの設計原則
良いアラート
| 特性 | 説明 |
|---|---|
| アクション可能 | 受け取った人が具体的な対応ができる |
| 緊急性が明確 | 今すぐ対応?明日でOK?が一目でわかる |
| コンテキスト付き | 何が起きているかの情報が含まれている |
| 誤報が少ない | 本当の問題だけを通知する |
悪いアラート
# 悪い例: 曖昧で対応できない
"CPU usage is high"
# 良い例: 具体的でアクション可能
"shimalink-api: CPU使用率が90%を超過(閾値: 80%)
現在の値: 92% / 直近5分の平均: 88%
影響: レスポンスタイムが300msに増加
対応: スケールアウトまたはリクエスト制限を検討
ダッシュボード: https://grafana.shimalink.com/d/cpu"
アラートの優先度
| 優先度 | 条件 | 通知先 | 対応時間 |
|---|---|---|---|
| P1 (Critical) | サービス停止 | 電話 + Slack | 即時対応 |
| P2 (High) | 一部機能障害 | Slack (urgent) | 30分以内 |
| P3 (Medium) | 性能低下 | Slack | 数時間以内 |
| P4 (Low) | 警告(将来的問題) | メール | 翌営業日 |
ShimaLink のアラート例
P1: API が5分間応答なし → 電話通知
P2: エラー率が5%超過 → Slack urgent チャンネル
P3: レスポンスタイムが500ms超過 → Slack monitoring チャンネル
P4: ディスク使用率70%超過 → メール通知
アラートルールの設定
# Prometheus のアラートルール例
groups:
- name: shimalink-alerts
rules:
# P1: API ダウン
- alert: APIDown
expr: up{job="shimalink-api"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "ShimaLink APIが停止しています"
description: "2分以上APIが応答していません"
# P2: 高エラー率
- alert: HighErrorRate
expr: |
rate(http_requests_total{status=~"5.."}[5m])
/ rate(http_requests_total[5m]) > 0.05
for: 5m
labels:
severity: high
annotations:
summary: "エラー率が5%を超過"
# P3: レスポンスタイム劣化
- alert: HighLatency
expr: |
histogram_quantile(0.95,
rate(http_request_duration_seconds_bucket[5m])
) > 0.5
for: 10m
labels:
severity: medium
annotations:
summary: "95%タイルのレスポンスタイムが500msを超過"
# P4: ディスク使用率
- alert: DiskUsageHigh
expr: disk_usage_percent > 70
for: 30m
labels:
severity: low
annotations:
summary: "ディスク使用率が70%を超過"
Slack 通知の実装
// アラート通知用の関数
async function sendAlert(alert) {
const color =
{
critical: "#FF0000",
high: "#FF8C00",
medium: "#FFD700",
low: "#87CEEB",
}[alert.severity] || "#808080";
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
attachments: [
{
color: color,
title: `[${alert.severity.toUpperCase()}] ${alert.summary}`,
text: alert.description,
fields: [
{ title: "サービス", value: alert.service, short: true },
{ title: "発生時刻", value: alert.timestamp, short: true },
],
actions: [
{
type: "button",
text: "ダッシュボードを開く",
url: alert.dashboardUrl,
},
],
},
],
}),
});
}
アラート疲れを防ぐ
| 対策 | 説明 |
|---|---|
| 閾値の調整 | 誤報が多い場合は閾値を緩める |
| for条件の活用 | 一時的なスパイクでは発報しない(5分以上継続の場合のみ) |
| グループ化 | 同じ原因のアラートをまとめる |
| 抑制ルール | P1アラート中はP3/P4を抑制する |
| 定期的な見直し | 月1回、アラートルールをレビューする |
インシデント対応フロー
アラート発報
↓
1. 確認 — ダッシュボードで状況を把握
↓
2. トリアージ — 優先度と影響範囲を判断
↓
3. 対応 — 復旧作業(ロールバック、スケールアウト等)
↓
4. 通知 — 関係者に状況を共有
↓
5. 振り返り — ポストモーテム(原因分析と再発防止)
Yuki: 「ポストモーテム(振り返り)が一番大事なステップ。“誰が悪い”じゃなくて、“仕組みで防ぐにはどうするか”を考える。同じ障害を2回起こさないことが目標だよ。」
ポイント
- アラートは「アクション可能」「緊急性が明確」「誤報が少ない」が重要
- 優先度(P1〜P4)で通知方法と対応速度を使い分ける
for条件で一時的なスパイクによる誤報を防ぐ- アラート疲れを避けるために、定期的にルールを見直す
- インシデント後のポストモーテムで再発を防止する
モニタリングダッシュボードが完成した。ShimaLinkの全サービスの状態がリアルタイムで可視化されている。
ShimaLink ダッシュボード
━━━━━━━━━━━━━━━━━━━━
API レスポンスタイム: 95ms [████████░░] 正常
エラー率: 0.1% [█░░░░░░░░░] 正常
DB 接続数: 12/50 [███░░░░░░░] 正常
CPU使用率: 35% [████░░░░░░] 正常
メモリ使用率: 60% [██████░░░░] 注意あなた: 「これはすごい。一目でシステム全体の状態がわかる。」
あなた: 「しかも、DB接続数が上限の80%に達したら自動でSlackに通知が来るように設定しました。もう10時間気づかないなんてことは起きません。」
Mika: 「安心ですね。お客さんから問い合わせが来る前に対応してもらえるなんて。」
Yuki: 「ここまでの旅を振り返ってみよう。」
Chapter 16: Docker でコンテナ化 → 環境の統一
Chapter 17: CI/CD で自動化 → デプロイの自動化
Chapter 18: クラウドに移行 → スケーラビリティ
Chapter 19: Terraform でインフラをコード化 → 再現可能なインフラ
Chapter 20: モニタリングとアラート → 観測可能性Yuki: 「手動でやっていたことを、一つずつ自動化して、可視化してきた。これがモダンな開発・運用の基盤——DevOpsの考え方だよ。」
あなた: 「最初は “works on my machine” で悩んでたのに、今はクラウドでオートスケールして、問題を自動検知できるまでになった。」
あなた: 「ShimaLink、もう”手作りのWebサイト屋さん”じゃないですね。ちゃんとしたプラットフォームになった。」
Yuki: 「でも、旅はまだ続く。ShimaLinkが本当に信頼されるプラットフォームになるには、チームとしてのスキルも磨かないとね。コードの品質、アーキテクチャの設計、チーム開発のプラクティス…次のアークが楽しみだよ。」
あなた: 「どこまで行けるんだろう、ShimaLink。」
Yuki: 「行けるところまで、一緒に行こう。」
拡大編(Scale Arc)完了 — ShimaLinkは、コンテナ化・CI/CD・クラウド・IaC・モニタリングを備えた本格的なプラットフォームに成長した。次のアークでは、コードの品質とチーム開発のプラクティスに踏み込んでいく。
🧠 理解度チェック
Q1.オブザーバビリティの3本柱はどれ?
💡 Yukiが「3本柱でシステムの状態を可視化する」と教えてくれた基本概念だ。
Q2.構造化ログ(JSON形式)の最大のメリットは?
💡 非構造化ログではエラーの原因特定に時間がかかったが、構造化ログなら検索一発だ。
Q3.Google が提唱する Golden Signals に含まれないのは?
💡 ダッシュボードの最上部に配置した4つの重要指標を思い出そう。
Q4.アラートの「for: 5m」設定の意味は?
💡 一瞬だけCPUが上がっただけで毎回アラートが鳴ったら、本当の異常を見逃してしまう。
Q5.ログに絶対に含めてはいけない情報は?
💡 セキュリティ監査で学んだ教訓がここでも生きている。機密情報の扱いは常に慎重に。
Q6.アラート疲れ(Alert Fatigue)を防ぐ方法として適切なのは?
💡 Yukiが「アラートが多すぎると、本当に大事なアラートを見逃す」と警告していた。
Q7.SLO(Service Level Objective)の説明として正しいのは?
💡 ShimaLinkの可用性目標を99.9%に設定した時の話を思い出そう。
Q8.インシデント対応後に行うポストモーテム(振り返り)の目的は?
💡 Yukiが「同じ障害を2回起こさないことが目標」と言っていたポストモーテムの精神だ。
❓ よくある質問
モニタリングツールが多すぎてどれを使えばいいかわからない
まずはクラウドプロバイダーのネイティブツールから始めましょう。 **GCPの場合:** - Cloud Monitoring(メトリクス) - Cloud Logging(ログ) - Cloud Trace(トレース) **AWSの場合:** - CloudWatch(メトリクス + ログ) - X-Ray(トレース) **成長に合わせてステップアップ:** 1. クラウドネイティブツール(無料枠あり) 2. Prometheus + Grafana(OSS、自前運用) 3. Datadog / New Relic(有料、オールインワン) ShimaLinkの規模なら、まずはクラウドネイティブ + Grafanaで十分です。
ログが多すぎて必要な情報が見つからない
構造化ログとフィルタリングで解決します。 **1. 構造化ログを使う** ```javascript logger.info("Booking created", { service: "api", requestId: "req-123", bookingId: "BK-456", }); ``` **2. ログレベルでフィルタ** - 本番: INFO以上のみ表示 - デバッグ時: DEBUG まで表示 **3. クエリで絞り込む(Cloud Logging の例)** ``` resource.type="cloud_run_revision" severity>=ERROR textPayload:"database" ``` **4. リクエストIDで追跡** ``` jsonPayload.requestId="req-abc123" ```
Prometheusのインストールと設定方法がわからない
Docker Composeで簡単にセットアップできます。 ```yaml # docker-compose.monitoring.yml services: prometheus: image: prom/prometheus:latest volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" grafana: image: grafana/grafana:latest ports: - "3001:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin ``` ```yaml # prometheus.yml scrape_configs: - job_name: "shimalink-api" scrape_interval: 15s static_configs: - targets: ["api:4000"] ``` ```bash docker compose -f docker-compose.monitoring.yml up -d ``` Grafanaは `http://localhost:3001` でアクセスできます。
アラートが頻繁に鳴りすぎて困る
アラート疲れの典型的な症状です。以下で改善しましょう。 **1. 閾値を見直す** - CPU 70% で鳴る → 85% に緩和 - 一度でも超えたら鳴る → 5分継続したら鳴るに変更 **2. for条件を追加** ```yaml alert: HighCPU expr: cpu_usage > 85 for: 5m # 5分継続した場合のみ ``` **3. 優先度を分ける** - P1のみ電話通知 - P2-P3はSlack - P4はメール(翌営業日対応) **4. 定期レビュー** 月1回、過去のアラートを振り返り: - 誤報が多いルール → 閾値を調整 - 対応不要だったアラート → 削除/格下げ
レスポンスタイムの「95パーセンタイル」とは?
全リクエストの95%がその時間以内に完了するという指標です。 **例: 100件のリクエスト** - 平均: 100ms - 95パーセンタイル: 350ms これは「95件は350ms以内に完了し、5件はそれ以上かかった」という意味です。 **なぜ平均ではなくパーセンタイルを使う?** 平均は外れ値に弱い: - 99件が50ms、1件が10秒 → 平均は149ms - でも体感では「ほとんど速い、たまに激遅」 パーセンタイルなら実態を正確に表せます: - p50(中央値): 50ms — 半分のユーザーの体験 - p95: 350ms — ほとんどのユーザーの体験 - p99: 2000ms — 最悪に近いユーザーの体験
ヘルスチェックエンドポイントの作り方は?
アプリケーションの死活を確認するための軽量なAPIです。 ```javascript // 基本のヘルスチェック app.get("/health", (req, res) => { res.json({ status: "ok" }); }); // 詳細なヘルスチェック(DB接続も確認) app.get("/health/detail", async (req, res) => { try { await db.query("SELECT 1"); res.json({ status: "ok", database: "connected", uptime: process.uptime(), }); } catch (err) { res.status(503).json({ status: "error", database: "disconnected", error: err.message, }); } }); ``` **Cloud Runでの設定:** ```yaml startup: httpGet: path: /health periodSeconds: 10 ``` ヘルスチェックが失敗すると、ロードバランサーがそのインスタンスへのトラフィックを停止します。
ポストモーテムの書き方がわからない
以下のテンプレートを参考にしてください。 **ポストモーテムテンプレート:** ``` ## インシデント概要 - 発生日時: 2024-10-15 03:00 JST - 検知日時: 2024-10-15 03:02 JST - 復旧日時: 2024-10-15 03:25 JST - 影響範囲: 全ユーザーの予約機能 - 影響人数: 約50名 ## タイムライン - 03:00 DB接続数が上限到達 - 03:02 アラート発報 - 03:05 対応開始 - 03:15 原因特定(コネクションリーク) - 03:25 修正デプロイ、復旧確認 ## 根本原因 DBコネクションのクローズ漏れ ## 再発防止策 1. コネクションプールの設定を見直す 2. DB接続数のアラート閾値を下げる 3. コネクションリーク検出テストを追加 ``` **重要:** 個人を責めない(Blame-free)文化が大前提です。
Slack通知の設定方法がわからない
Slack Incoming Webhookを使います。 **1. Webhook URLを取得** - Slack → App設定 → Incoming Webhooks → 有効化 - 通知先チャンネルを選択 - Webhook URLをコピー **2. 環境変数に設定** ```bash export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxx/yyy/zzz" ``` **3. テスト送信** ```bash curl -X POST $SLACK_WEBHOOK_URL \ -H 'Content-type: application/json' \ -d '{"text": "テスト通知です"}' ``` **4. Prometheusからの通知(Alertmanager)** ```yaml # alertmanager.yml receivers: - name: "slack" slack_configs: - api_url: "https://hooks.slack.com/services/xxx" channel: "#monitoring" ```
トレースとログの違いは?
どちらも「何が起きたか」を記録しますが、視点が異なります。 **ログ:** 1つのサービス内のイベント記録 ``` [api] Booking request received [api] Database query executed (12ms) [api] Booking created ``` **トレース:** リクエスト全体の流れを追跡 ``` [User] → [API Gateway 2ms] → [Auth Service 15ms] → [Booking API 5ms] → [Database 12ms] → [Email Service 100ms] Total: 134ms ``` **使い分け:** - **ログ:** 特定のエラーの詳細を調べたい - **トレース:** どのサービスがボトルネックか調べたい ShimaLinkのように複数サービスがある場合、トレースが特に有効です。
ダッシュボードに何を表示すればいい?
3層構成がおすすめです。 **第1層: サービス概要(1画面)** - 稼働率(Uptime) - レスポンスタイム(p95) - エラー率 - リクエスト数/秒 **第2層: サービス別詳細** - API: エンドポイント別レスポンスタイム - DB: クエリ実行時間、接続数 - Web: ページ読み込み時間 **第3層: インフラ** - CPU/メモリ/ディスク使用率 - コンテナ数(オートスケーリングの状態) - ネットワーク帯域 **設計のコツ:** - 最上部に「今、問題があるか」が一目でわかる信号を配置 - 赤=異常、黄=警告、緑=正常で色分け - 時系列グラフで傾向を可視化 - クリックで詳細にドリルダウンできる構成