mcpField
M
monitoring-expert

monitoring-expert

github.com/jeffallanクラウド・DevOps12.1k5.7k 回インストール今日更新
リポジトリ

monitoring-expert について

アプリケーション監視を整備するエンジニア向けの可観測性・性能スキルです。計装、データ収集、ダッシュボード、アラート、性能テストを扱い、一般的な監視手順の例も示します。

主な機能

  1. 01構造化ログとリクエスト相関
  2. 02Prometheus メトリクス設定
  3. 03OpenTelemetry トレース
  4. 04RED/USE ダッシュボード設計
  5. 05重要経路のアラート設定
  6. 06k6 負荷テスト

活用シーン

  1. 01API へのメトリクスとトレース追加
  2. 02サービス性能ダッシュボードの構築
  3. 03重要な業務経路へのアラート設定
  4. 04負荷テストによる性能評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeffallan/claude-skills --skill monitoring-expert

インストール後、Claude Code で/monitoring-expertを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
alerting-rules.md
application-profiling.md
capacity-planning.md
dashboards.md
opentelemetry.md
performance-testing.md
prometheus-metrics.md
structured-logging.md

詳細

監視エキスパート

包括的な監視、アラート、トレース、パフォーマンステストのシステムを実装する、オブザーバビリティとパフォーマンスのスペシャリストです。

コアワークフロー

  1. 評価 — 監視対象(SLI、クリティカルパス、ビジネスメトリクス)を特定します
  2. 計装 — アプリケーションにログ、メトリクス、トレースを追加します(以下の例を参照)
  3. 収集 — 集約と保存を設定します(Prometheus のスクレイプ、ログシッパー、OTLP エンドポイント)。次に進む前に、データが届いていることを確認します
  4. 可視化 — RED(Rate/Errors/Duration)または USE(Utilization/Saturation/Errors)の手法を使ってダッシュボードを構築します
  5. アラート — クリティカルパスにしきい値アラートと異常アラートを定義します。リリース前に、誤検知が大量発生しないことを検証します

クイックスタートの例

構造化ログ(Node.js / Pino)
import pino from 'pino';

const logger = pino({ level: 'info' });

// Good — structured fields, includes correlation ID
logger.info({ requestId: req.id, userId: req.user.id, durationMs: elapsed }, 'order.created');

// Bad — string interpolation, no correlation
console.log(`Order created for user ${userId}`);
Prometheus メトリクス(Node.js)
import { Counter, Histogram, register } from 'prom-client';

const httpRequests = new Counter({
  name: 'http_requests_total',
  help: 'Total HTTP requests',
  labelNames: ['method', 'route', 'status'],
});

const httpDuration = new Histogram({
  name: 'http_request_duration_seconds',
  help: 'HTTP request latency',
  labelNames: ['method', 'route'],
  buckets: [0.05, 0.1, 0.3, 0.5, 1, 2, 5],
});

// Instrument a route
app.use((req, res, next) => {
  const end = httpDuration.startTimer({ method: req.method, route: req.path });
  res.on('finish', () => {
    httpRequests.inc({ method: req.method, route: req.path, status: res.statusCode });
    end();
  });
  next();
});

// Expose scrape endpoint
app.get('/metrics', async (req, res) => {
  res.set('Content-Type', register.contentType);
  res.end(await register.metrics());
});
OpenTelemetry トレース(Node.js)
import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { trace } from '@opentelemetry/api';

const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({ url: 'http://jaeger:4318/v1/traces' }),
});
sdk.start();

// Manual span around a critical operation
const tracer = trace.getTracer('order-service');
async function processOrder(orderId) {
  const span = tracer.startSpan('order.process');
  span.setAttribute('order.id', orderId);
  try {
    const result = await db.saveOrder(orderId);
    span.setStatus({ code: SpanStatusCode.OK });
    return result;
  } catch (err) {
    span.recordException(err);
    span.setStatus({ code: SpanStatusCode.ERROR });
    throw err;
  } finally {
    span.end();
  }
}
Prometheus アラートルール
groups:
  - name: api.rules
    rules:
      - alert: HighErrorRate
        expr: |
          rate(http_requests_total{status=~"5.."}[5m])
          / rate(http_requests_total[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Error rate above 5% on {{ $labels.route }}"
k6 負荷テスト
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '1m', target: 50 },   // ramp up
    { duration: '5m', target: 50 },   // sustained load
    { duration: '1m', target: 0 },    // ramp down
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'],  // 95th percentile < 500 ms
    http_req_failed:   ['rate<0.01'],  // error rate < 1%
  },
};

export default function () {
  const res = http.get('https://api.example.com/orders');
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(1);
}

リファレンスガイド

状況に応じて詳細なガイダンスを参照します。

トピックリファレンス参照するタイミング
ログreferences/structured-logging.mdPino、JSON ログ
メトリクスreferences/prometheus-metrics.mdCounter、Histogram、Gauge
トレースreferences/opentelemetry.mdOpenTelemetry、スパン
アラートreferences/alerting-rules.mdPrometheus アラート
ダッシュボードreferences/dashboards.mdRED/USE 手法、Grafana
パフォーマンステストreferences/performance-testing.md負荷テスト、k6、Artillery、ベンチマーク
プロファイリングreferences/application-profiling.mdCPU/メモリのプロファイリング、ボトルネック
キャパシティプランニングreferences/capacity-planning.mdスケーリング、予測、予算

制約事項

必ず実施すること
  • 構造化ログ(JSON)を使用します
  • 相関のためにリクエスト ID を含めます
  • クリティカルパスにアラートを設定します
  • 技術的なメトリクスだけでなく、ビジネスメトリクスも監視します
  • 適切なメトリクスの種類(counter/gauge/histogram)を使用します
  • ヘルスチェックのエンドポイントを実装します
必ず避けること
  • 機密データ(パスワード、トークン、PII)をログに記録しません
  • すべてのエラーにアラートを設定しません(アラート疲れを招きます)
  • ログで文字列補間を使用しません(構造化フィールドを使用します)
  • 分散システムで相関 ID を省略しません

Synergetic Solutions のプリンシパルコンサルタント、@jeffallan がメンテナンスしています。

ドキュメント

コメント