2026年8月11日

2026年8月11日

WordPressのパフォーマンスをGrafana・Prometheusで監視する方法

はじめに

WordPressサイトのパフォーマンス問題は多くの場合、問題が深刻化してから気づくものです。GrafanaとPrometheusを組み合わせることでCPU・メモリ・DBクエリ数・レスポンスタイムを継続的に可視化し、問題の予兆を早期に検知できます。本記事では監視スタックの構築からSlackアラートまでを実践的に解説します。

症状・原因

  • サイト応答が遅い原因がサーバーリソース不足なのかDB負荷なのか判断できない
  • トラフィックスパイク時に何が起きているかリアルタイムで把握できない
  • 障害後にログを手動で掘り起こす作業に多大な時間がかかっている

解決手順

ステップ1:node_exporterをインストールしてシステムメトリクスを収集する

CPU・RAM・ディスクI/Oなどのシステムメトリクスをnode_exporterで収集します。

# Ubuntu/Debianへのインストール
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xvf node_exporter-1.8.1.linux-amd64.tar.gz
sudo mv node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/

# systemdサービスとして登録する
sudo tee /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=nobody
# デフォルトポート9100でメトリクスを公開する
ExecStart=/usr/local/bin/node_exporter --web.listen-address=":9100"
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter

# 動作確認: http://localhost:9100/metricsでメトリクスが表示されればOK
curl -s http://localhost:9100/metrics | grep "node_cpu_seconds_total" | head -3

ステップ2:WordPressカスタムメトリクスをREST APIエンドポイントで公開する

DBクエリ数・ピークメモリなどWordPress固有のメトリクスをカスタムエンドポイントで提供します。

<?php
// functions.php に追加 ─ Prometheusスクレイプ用のカスタムメトリクスエンドポイント

add_action( 'rest_api_init', function() {
    register_rest_route( 'metrics/v1', '/wordpress', [
        'methods'             => 'GET',
        'callback'            => 'expose_wordpress_metrics',
        // ローカルネットワーク(Prometheusサーバー)からのみアクセス許可
        'permission_callback' => function() {
            $allowed_ips = [ '127.0.0.1', '10.0.0.0/8' ];
            $client_ip   = $_SERVER['REMOTE_ADDR'];
            return in_array( $client_ip, $allowed_ips, true );
        },
    ] );
} );

function expose_wordpress_metrics() {
    global $wpdb;

    // DBクエリ数を取得(SAVEQUERIES定数が必要)
    $query_count = defined( 'SAVEQUERIES' ) && SAVEQUERIES ? count( $wpdb->queries ) : 0;

    // PHPのピークメモリ使用量をバイト単位で取得
    $peak_memory = memory_get_peak_usage( true );

    // Prometheusテキスト形式でメトリクスを出力する
    $output  = "# HELP wordpress_db_query_count Total DB queries this request\n";
    $output .= "# TYPE wordpress_db_query_count gauge\n";
    $output .= "wordpress_db_query_count {$query_count}\n\n";
    $output .= "# HELP wordpress_peak_memory_bytes Peak PHP memory usage\n";
    $output .= "# TYPE wordpress_peak_memory_bytes gauge\n";
    $output .= "wordpress_peak_memory_bytes {$peak_memory}\n\n";

    // キャッシュヒット率も記録する
    $cache_hits   = wp_cache_get( 'hits', 'cache_stats' ) ?: 0;
    $cache_misses = wp_cache_get( 'misses', 'cache_stats' ) ?: 0;
    $output .= "# HELP wordpress_object_cache_hits Object cache hit count\n";
    $output .= "# TYPE wordpress_object_cache_hits counter\n";
    $output .= "wordpress_object_cache_hits {$cache_hits}\n";

    return new WP_REST_Response( $output, 200, [ 'Content-Type' => 'text/plain; version=0.0.4' ] );
}

ステップ3:Prometheusのスクレイプ設定を構成する

prometheus.yml にWordPressとnode_exporterのスクレイプターゲットを追加します。

# /etc/prometheus/prometheus.yml

global:
  scrape_interval: 15s      # 15秒ごとにメトリクスを収集する
  evaluation_interval: 15s  # アラートルールを15秒ごとに評価する

scrape_configs:
  # システムメトリクス(CPU・RAM・ディスク)
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
        labels:
          instance: 'wordpress-server'

  # WordPressカスタムメトリクス
  - job_name: 'wordpress'
    metrics_path: '/wp-json/metrics/v1/wordpress'
    scheme: 'https'
    static_configs:
      - targets: ['example.com']
        labels:
          site: 'example.com'

  # MySQLメトリクス(mysqld_exporterを別途インストール)
  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']

ステップ4:GrafanaダッシュボードでWordPressパフォーマンスを可視化する

GrafanaにPrometheusデータソースを追加し、主要パネルのPromQLクエリを設定します。

# GrafanaをDockerで起動(設定永続化)
docker run -d \
  --name grafana \
  -p 3000:3000 \
  -v grafana-storage:/var/lib/grafana \
  -e GF_SECURITY_ADMIN_PASSWORD=your-secure-password \
  grafana/grafana:latest

# Prometheusもdocker-composeで管理する場合のcompose.yml
cat > docker-compose.yml << 'EOF'
services:
  prometheus:
    image: prom/prometheus:latest
    ports: ["9090:9090"]
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus

  grafana:
    image: grafana/grafana:latest
    ports: ["3000:3000"]
    volumes:
      - grafana-data:/var/lib/grafana
    environment:
      GF_SECURITY_ADMIN_PASSWORD: your-secure-password

volumes:
  prometheus-data:
  grafana-data:
EOF

ステップ5:アラートルールとSlack Webhookで通知を設定する

レスポンスタイム超過やエラー率上昇を検知してSlackに通知します。

# /etc/prometheus/alerts.yml ─ アラートルールの定義

groups:
  - name: wordpress_alerts
    rules:
      # レスポンスタイムが2秒を超えた場合にアラートを発火する
      - alert: WordPressHighResponseTime
        expr: probe_duration_seconds{job="wordpress"} > 2
        for: 5m  # 5分間継続した場合のみ通知(一時的なスパイクは無視)
        labels:
          severity: warning
        annotations:
          summary: "WordPress応答が遅い: {{ $labels.instance }}"
          description: "レスポンスタイム {{ $value }}秒(閾値: 2秒)"

      # エラー率が1%を超えた場合にアラートを発火する
      - alert: WordPressHighErrorRate
        expr: rate(nginx_http_requests_total{status=~"5.."}[5m]) /
              rate(nginx_http_requests_total[5m]) > 0.01
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "WordPress 5xxエラー率上昇: {{ $labels.instance }}"
          description: "エラー率 {{ $value | humanizePercentage }}"
# /etc/alertmanager/alertmanager.yml ─ Slackへの通知設定

receivers:
  - name: slack-notifications
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
        channel: '#wordpress-alerts'
        # アラートの内容をSlackメッセージとして整形する
        text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'

注意事項

  • メトリクスエンドポイントの保護: /wp-json/metrics/v1/wordpress はIPフィルタリングまたはBasic認証で保護し、外部に公開しないこと
  • SAVEQUERIES定数: DBクエリ数を記録するにはwp-config.phpで define('SAVEQUERIES', true) が必要。本番環境ではメモリ消費が増えるため注意
  • Prometheusのストレージ: デフォルトの保持期間は15日。長期保存にはThanos等のリモートストレージを検討すること

まとめ

GrafanaとPrometheusを組み合わせることでWordPressのパフォーマンスボトルネックを定量的に特定・監視できます。アラートを設定することで問題の予兆を早期にキャッチし、ダウンタイムを最小化できます。関連記事:WordPressにElasticsearch全文検索を実装してUX・SEOを改善する方法

お気軽にご相談ください

お見積りへ お問い合わせへ