monitoring-expert について
アプリケーション監視を整備するエンジニア向けの可観測性・性能スキルです。計装、データ収集、ダッシュボード、アラート、性能テストを扱い、一般的な監視手順の例も示します。
主な機能
- 01構造化ログとリクエスト相関
- 02Prometheus メトリクス設定
- 03OpenTelemetry トレース
- 04RED/USE ダッシュボード設計
- 05重要経路のアラート設定
- 06k6 負荷テスト
活用シーン
- 01API へのメトリクスとトレース追加
- 02サービス性能ダッシュボードの構築
- 03重要な業務経路へのアラート設定
- 04負荷テストによる性能評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill monitoring-expertインストール後、Claude Code で/monitoring-expertを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/alerting-rules.mdapplication-profiling.mdcapacity-planning.mddashboards.mdopentelemetry.mdperformance-testing.mdprometheus-metrics.mdstructured-logging.md詳細
監視エキスパート
包括的な監視、アラート、トレース、パフォーマンステストのシステムを実装する、オブザーバビリティとパフォーマンスのスペシャリストです。
コアワークフロー
- 評価 — 監視対象(SLI、クリティカルパス、ビジネスメトリクス)を特定します
- 計装 — アプリケーションにログ、メトリクス、トレースを追加します(以下の例を参照)
- 収集 — 集約と保存を設定します(Prometheus のスクレイプ、ログシッパー、OTLP エンドポイント)。次に進む前に、データが届いていることを確認します
- 可視化 — RED(Rate/Errors/Duration)または USE(Utilization/Saturation/Errors)の手法を使ってダッシュボードを構築します
- アラート — クリティカルパスにしきい値アラートと異常アラートを定義します。リリース前に、誤検知が大量発生しないことを検証します
クイックスタートの例
構造化ログ(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.md | Pino、JSON ログ |
| メトリクス | references/prometheus-metrics.md | Counter、Histogram、Gauge |
| トレース | references/opentelemetry.md | OpenTelemetry、スパン |
| アラート | references/alerting-rules.md | Prometheus アラート |
| ダッシュボード | references/dashboards.md | RED/USE 手法、Grafana |
| パフォーマンステスト | references/performance-testing.md | 負荷テスト、k6、Artillery、ベンチマーク |
| プロファイリング | references/application-profiling.md | CPU/メモリのプロファイリング、ボトルネック |
| キャパシティプランニング | references/capacity-planning.md | スケーリング、予測、予算 |
制約事項
必ず実施すること
- 構造化ログ(JSON)を使用します
- 相関のためにリクエスト ID を含めます
- クリティカルパスにアラートを設定します
- 技術的なメトリクスだけでなく、ビジネスメトリクスも監視します
- 適切なメトリクスの種類(counter/gauge/histogram)を使用します
- ヘルスチェックのエンドポイントを実装します
必ず避けること
- 機密データ(パスワード、トークン、PII)をログに記録しません
- すべてのエラーにアラートを設定しません(アラート疲れを招きます)
- ログで文字列補間を使用しません(構造化フィールドを使用します)
- 分散システムで相関 ID を省略しません
Synergetic Solutions のプリンシパルコンサルタント、@jeffallan がメンテナンスしています。
コメント
Markdown 対応