取り組みの背景 — なぜアプリケーション監視が重要なのか
アプリケーションを本番環境にデプロイした後、「動いているはず」という感覚だけで運用していませんか。実際のところ、レスポンスタイムの悪化やメモリリーク、予期しないエラーの急増といった問題は、ユーザーからのクレームが届くまで気づけないケースが少なくありません。
Prometheus と Grafana を組み合わせた監視基盤は、こうした問題をリアルタイムに検知し、障害の予兆を可視化するための業界標準のソリューションです。しかし、設定ファイルの記述やダッシュボードの設計には一定の知識と手間が必要でしました。
ここで Antigravity の AI エージェントが力を発揮します。設定ファイルの自動生成、アラートルールの策定、Grafana ダッシュボードの JSON 定義まで、AI に指示を出しながら効率的に構築できるのです。
ここではAntigravity を使って Prometheus + Grafana 監視基盤をゼロから構築する手順を、実際のコード例とともに解説します。
Prometheus と Grafana の基本アーキテクチャ
監視基盤の全体像を理解しておくと、各コンポーネントの役割が明確になります。
Prometheus はプル型のメトリクス収集システムです。監視対象のアプリケーションが /metrics エンドポイントを公開し、Prometheus が定期的にスクレイピング(データ取得)します。収集したメトリクスは時系列データベースに格納され、PromQL というクエリ言語で検索・集計できます。
Grafana は収集したメトリクスを可視化するダッシュボードツールです。Prometheus をデータソースとして接続し、グラフ・ゲージ・テーブルなどのパネルを組み合わせて直感的な監視画面を作成できます。
基本的なデータフローは以下の通りです。
- アプリケーションがメトリクスを
/metricsエンドポイントで公開 - Prometheus が定期的にスクレイピングしてデータを蓄積
- Grafana が Prometheus に PromQL でクエリを投げて可視化
- Alertmanager がしきい値超過時にSlack・メール等で通知
Antigravity でプロジェクトをセットアップする
まず、Antigravity で監視基盤プロジェクトを立ち上げましょう。Antigravity のターミナルで以下のコマンドを実行します。
# プロジェクトディレクトリの作成
mkdir monitoring-stack && cd monitoring-stack
# Docker Compose ファイルと設定ディレクトリの準備
mkdir -p prometheus grafana/provisioning/datasources grafana/provisioning/dashboards次に、Antigravity の AI エージェントに Docker Compose ファイルの生成を依頼します。エージェントへの指示例は次の通りです。
Prometheus, Grafana, Alertmanager を含む Docker Compose ファイルを作成してください。
Prometheus は localhost:9090、Grafana は localhost:3000 でアクセスできるようにしてください。
ネットワークは monitoring という名前のブリッジネットワークを使用します。
AI エージェントが生成する docker-compose.yml は以下のようになります。
# docker-compose.yml
# Prometheus + Grafana + Alertmanager の監視スタック
version: "3.8"
services:
prometheus:
image: prom/prometheus:v2.53.0
container_name: prometheus
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/alert-rules.yml:/etc/prometheus/alert-rules.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
networks:
- monitoring
restart: unless-stopped
grafana:
image: grafana/grafana:11.1.0
container_name: grafana
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=your-secure-password
networks:
- monitoring
restart: unless-stopped
alertmanager:
image: prom/alertmanager:v0.27.0
container_name: alertmanager
volumes:
- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
ports:
- "9093:9093"
networks:
- monitoring
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:
networks:
monitoring:
driver: bridgeDocker を使ったコンテナ開発環境の構築に慣れていない方は、先にそちらの記事を確認しておくとスムーズです。
Node.js アプリケーションにメトリクスを組み込む
監視対象のアプリケーションに Prometheus 用のメトリクスエンドポイントを追加します。Node.js(Express)の場合、prom-client ライブラリを使うのが最も一般的です。
Antigravity のエージェントに以下のように指示します。
Express アプリに prom-client を使って /metrics エンドポイントを追加してください。
HTTP リクエストの総数、レスポンスタイムのヒストグラム、アクティブ接続数のゲージを計測します。
生成されるコードの例は以下の通りです。
// src/metrics.ts
// Prometheus メトリクス定義とエンドポイント設定
import { Registry, Counter, Histogram, Gauge, collectDefaultMetrics } from "prom-client";
// カスタムレジストリを作成(デフォルトメトリクスと分離可能)
const register = new Registry();
// Node.js のデフォルトメトリクス(CPU、メモリ、GC等)を自動収集
collectDefaultMetrics({ register });
// HTTP リクエスト総数カウンター
export const httpRequestsTotal = new Counter({
name: "http_requests_total",
help: "Total number of HTTP requests",
labelNames: ["method", "route", "status_code"],
registers: [register],
});
// レスポンスタイムのヒストグラム(秒単位)
export const httpRequestDuration = new Histogram({
name: "http_request_duration_seconds",
help: "Duration of HTTP requests in seconds",
labelNames: ["method", "route", "status_code"],
buckets: [0.01, 0.05, 0.1, 0.3, 0.5, 1, 2, 5],
registers: [register],
});
// アクティブ接続数のゲージ
export const activeConnections = new Gauge({
name: "active_connections",
help: "Number of active connections",
registers: [register],
});
export { register };続いて、Express のミドルウェアとしてメトリクスを収集します。
// src/middleware/metricsMiddleware.ts
// リクエストごとにメトリクスを記録するミドルウェア
import { Request, Response, NextFunction } from "express";
import {
httpRequestsTotal,
httpRequestDuration,
activeConnections,
} from "../metrics";
export function metricsMiddleware(
req: Request,
res: Response,
next: NextFunction
) {
// アクティブ接続数を増加
activeConnections.inc();
// レスポンスタイム計測開始
const end = httpRequestDuration.startTimer();
res.on("finish", () => {
// リクエスト完了時にメトリクスを記録
const route = req.route?.path || req.path;
const labels = {
method: req.method,
route,
status_code: res.statusCode.toString(),
};
httpRequestsTotal.inc(labels);
end(labels); // ヒストグラムにレスポンスタイムを記録
activeConnections.dec();
});
next();
}// src/app.ts
// Express アプリケーションのエントリポイント
import express from "express";
import { register } from "./metrics";
import { metricsMiddleware } from "./middleware/metricsMiddleware";
const app = express();
// メトリクスミドルウェアを全ルートに適用
app.use(metricsMiddleware);
// /metrics エンドポイント(Prometheus がスクレイピングする)
app.get("/metrics", async (_req, res) => {
res.set("Content-Type", register.contentType);
res.end(await register.metrics());
});
// 期待する出力: curl http://localhost:4000/metrics
// # HELP http_requests_total Total number of HTTP requests
// # TYPE http_requests_total counter
// http_requests_total{method="GET",route="/api/users",status_code="200"} 42
// ...
app.listen(4000, () => {
console.log("Server running on port 4000");
});Prometheus のスクレイピング設定
Prometheus がアプリケーションのメトリクスを収集するための設定ファイルを作成します。
# prometheus/prometheus.yml
# Prometheus のグローバル設定とスクレイピングターゲット
global:
scrape_interval: 15s # 15秒ごとにメトリクスを取得
evaluation_interval: 15s # 15秒ごとにアラートルールを評価
# アラートルールファイルの読み込み
rule_files:
- "alert-rules.yml"
# Alertmanager の接続先
alerting:
alertmanagers:
- static_configs:
- targets:
- "alertmanager:9093"
# スクレイピング対象の定義
scrape_configs:
# Prometheus 自身の監視
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
# Node.js アプリケーションの監視
- job_name: "node-app"
static_configs:
- targets: ["host.docker.internal:4000"]
metrics_path: "/metrics"
scrape_interval: 10s # アプリは10秒間隔で取得scrape_interval はメトリクスの取得間隔です。短くするほどリアルタイム性が増しますが、負荷も上がるため、アプリケーションの特性に合わせて調整してください。
アラートルールの設定
障害を早期に検知するためのアラートルールを定義します。Antigravity のエージェントに「本番環境で一般的なアラートルールを作成して」と指示すると、実用的なルールセットを生成してくれます。
# prometheus/alert-rules.yml
# アプリケーション監視のアラートルール定義
groups:
- name: application-alerts
rules:
# 高エラーレート検知
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{status_code=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
> 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "5xx エラー率が 5% を超過"
description: "過去5分間のエラー率: {{ $value | humanizePercentage }}"
# レスポンスタイム悪化検知
- alert: HighLatency
expr: |
histogram_quantile(0.95,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
) > 1.0
for: 3m
labels:
severity: warning
annotations:
summary: "P95 レスポンスタイムが 1秒 を超過"
description: "現在の P95 レイテンシ: {{ $value }}秒"
# メモリ使用量アラート
- alert: HighMemoryUsage
expr: |
process_resident_memory_bytes / (1024 * 1024) > 512
for: 5m
labels:
severity: warning
annotations:
summary: "メモリ使用量が 512MB を超過"
description: "現在のメモリ使用量: {{ $value }}MB"for パラメータは、条件が継続する期間を指定します。一時的なスパイクでアラートが発火しないよう、2〜5分程度の猶予を設けるのがベストプラクティスです。
Grafana ダッシュボードの自動プロビジョニング
Grafana を起動するたびに手動でデータソースやダッシュボードを設定するのは非効率です。プロビジョニングファイルを使って自動化しましょう。
# grafana/provisioning/datasources/prometheus.yml
# Grafana データソースの自動設定
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: falseダッシュボードの JSON 定義も Antigravity のエージェントに生成させることができます。エージェントへの指示例はこちらです。
Grafana ダッシュボード JSON を作成してください。以下のパネルを含めます:
1. HTTP リクエスト率(リクエスト/秒)の時系列グラフ
2. エラー率(5xx / 全リクエスト)のゲージ
3. P50 / P95 / P99 レスポンスタイムの時系列グラフ
4. アクティブ接続数のスタットパネル
生成されるダッシュボード定義(抜粋)は以下のようになります。
{
"dashboard": {
"title": "Application Monitoring",
"panels": [
{
"title": "Request Rate (req/s)",
"type": "timeseries",
"targets": [
{
"expr": "sum(rate(http_requests_total[1m]))",
"legendFormat": "Total Requests/s"
}
],
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 }
},
{
"title": "Error Rate",
"type": "gauge",
"targets": [
{
"expr": "sum(rate(http_requests_total{status_code=~\"5..\"}[5m])) / sum(rate(http_requests_total[5m])) * 100"
}
],
"fieldConfig": {
"defaults": {
"thresholds": {
"steps": [
{ "color": "green", "value": 0 },
{ "color": "yellow", "value": 1 },
{ "color": "red", "value": 5 }
]
},
"unit": "percent"
}
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 }
}
]
}
}より高度なオブザーバビリティ(トレース・ログの統合)については、Antigravity × OpenTelemetry: AI 駆動オブザーバビリティパイプライン構築で詳しく解説しています。
監視スタックの起動と動作確認
すべての設定ファイルが揃ったら、Docker Compose で監視スタック全体を起動します。
# 監視スタックをバックグラウンドで起動
docker compose up -d
# 各コンテナの状態を確認
docker compose ps
# 期待する出力:
# NAME IMAGE STATUS
# prometheus prom/prometheus:v2.53.0 Up 10 seconds
# grafana grafana/grafana:11.1.0 Up 10 seconds
# alertmanager prom/alertmanager:v0.27.0 Up 10 seconds起動後、以下の URL でそれぞれのサービスにアクセスできます。
- Prometheus:
http://localhost:9090— PromQL クエリの実行、ターゲットの状態確認 - Grafana:
http://localhost:3000— ダッシュボードの閲覧(初期ユーザー: admin) - Alertmanager:
http://localhost:9093— アラートの確認・サイレンス設定
Prometheus の「Status > Targets」画面で、node-app ターゲットが UP 状態になっていれば、メトリクスの収集が正常に動作しています。
まとめ
Antigravity の AI エージェントを活用することで、Prometheus + Grafana による監視基盤の構築を大幅に効率化できます。設定ファイルの生成、アラートルールの策定、Grafana ダッシュボードの JSON 作成まで、AI がサポートしてくれるため、監視の専門知識が少なくても本格的なモニタリング環境を構築できるのが大きなメリットです。
監視は「あったほうがいい」ではなく「なければ障害に気づけない」ものです。この記事を参考に、まずは開発環境で Docker Compose を使った監視スタックを立ち上げてみてください。小さく始めて、運用しながらアラートルールやダッシュボードを育てていくのが成功への近道です。
CI/CD パイプラインとの統合で監視のデプロイまで自動化したい方は、Antigravity × GitHub Actions 上級CI/CDパイプライン構築も参考になるでしょう。また、本記事の内容