20
☁️ 拡大編 Chapter 20

見守る目

サービスの健康状態をリアルタイムで把握する

約55分
モニタリング · intro ロギング · intro アラート · intro
目次(29セクション)
🎬 Story — Introduction

日曜日の朝。あなたのスマホが鳴った。


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 + PrometheusOSS、自由度が高い無料(自前運用)
Cloud Monitoring (GCP)GCPとネイティブ統合無料枠あり
CloudWatch (AWS)AWSとネイティブ統合無料枠あり
New RelicAPM に強い無料枠あり

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%
レスポンスタイム< 200ms200-500ms> 500ms
エラー率< 0.1%0.1-1%> 1%

ダッシュボードの設計

┌─────────────────────────────────────────┐
│  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)警告(将来的問題)メール翌営業日
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 条件で一時的なスパイクによる誤報を防ぐ
  • アラート疲れを避けるために、定期的にルールを見直す
  • インシデント後のポストモーテムで再発を防止する
📖 Story — Conclusion

モニタリングダッシュボードが完成した。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/メモリ/ディスク使用率 - コンテナ数(オートスケーリングの状態) - ネットワーク帯域 **設計のコツ:** - 最上部に「今、問題があるか」が一目でわかる信号を配置 - 赤=異常、黄=警告、緑=正常で色分け - 時系列グラフで傾向を可視化 - クリックで詳細にドリルダウンできる構成