2026年10月11日

2026年10月11日

New Relic APMでWordPressのパフォーマンスを監視する方法

はじめに

WordPressサイトのパフォーマンス問題を正確に診断するには、ページ読み込み時間だけでなく、PHPの実行時間・データベースクエリ・外部API呼び出しを個別に計測する必要があります。New Relic APM(Application Performance Monitoring)のPHPエージェントを使えば、トランザクション単位での詳細なパフォーマンス分析が可能になります。本記事では、New RelicをWordPressに統合し、実用的な監視体制を構築する手順を解説します。

症状・原因

  • サイトが重いがどのページ・どの処理がボトルネックか特定できない
  • データベースクエリは速いのにページ全体の応答が遅い
  • 特定のプラグインが重いと感じるが計測手段がない
  • 外部APIの応答遅延がWordPressのパフォーマンスに影響している
  • ピーク時間帯のみ遅延が発生し通常の計測では捕捉できない

解決手順

ステップ1:New Relic PHPエージェントのインストール

サーバーにNew Relic PHPエージェントをインストールします。

# New Relicの公式リポジトリを追加(Ubuntu/Debian)
echo 'deb http://apt.newrelic.com/debian/ newrelic non-free' | \
  sudo tee /etc/apt/sources.list.d/newrelic.list
wget -O- https://download.newrelic.com/548C16BF.gpg | sudo apt-key add -
sudo apt-get update

# PHPエージェントをインストール
sudo apt-get install -y newrelic-php5

# インストールスクリプトを実行(ライセンスキーを入力)
sudo newrelic-install install

# newrelic.ini の設定確認
# /etc/php/8.2/mods-available/newrelic.ini
cat /etc/php/8.2/mods-available/newrelic.ini | grep "newrelic.appname\|newrelic.license"

# PHPを再起動
sudo systemctl restart php8.2-fpm
sudo systemctl restart apache2  # または nginx

# エージェントの動作確認
php -r "var_dump(extension_loaded('newrelic'));"

ステップ2:New Relic設定ファイルのチューニング

newrelic.ini でWordPressに最適な設定を行います。

# /etc/php/8.2/mods-available/newrelic.ini

[newrelic]
newrelic.license          = "YOUR_LICENSE_KEY_HERE"
newrelic.appname          = "WordPress Production"
newrelic.logfile          = "/var/log/newrelic/php_agent.log"
newrelic.loglevel         = "info"

# トランザクショントレース設定
newrelic.transaction_tracer.enabled        = true
newrelic.transaction_tracer.threshold      = 500ms   ; 500ms以上を記録
newrelic.transaction_tracer.detail         = 1
newrelic.transaction_tracer.record_sql     = obfuscated  ; SQL文を難読化して記録

# スロークエリの閾値
newrelic.transaction_tracer.slow_sql_threshold = 100ms  ; 100ms以上のSQLを記録

# エラートレース
newrelic.error_collector.enabled           = true
newrelic.error_collector.record_database_errors = true

# ブラウザモニタリング(Real User Monitoring)
newrelic.browser_monitoring.auto_instrument = true

# カスタムイベントの最大数
newrelic.custom_insights_events.max_samples_stored = 30000

# バックグラウンドタスクの設定
newrelic.background_job.auto_detect_cli = true

ステップ3:WordPress用カスタム計装の実装

newrelic_add_custom_parameter() でWordPress固有のデータを追加します。

<?php
// mu-plugins/newrelic-wordpress-instrumentation.php

/**
 * New Relic WordPress カスタム計装
 * WordPress固有のコンテキストをトランザクションに追加する
 */

if ( ! extension_loaded( 'newrelic' ) ) {
    return;
}

/**
 * 各リクエストにWordPressのコンテキスト情報を追加
 */
add_action( 'wp', function () {
    if ( ! function_exists( 'newrelic_add_custom_parameter' ) ) {
        return;
    }

    // ページタイプを記録
    $page_type = 'unknown';
    if ( is_front_page() )  $page_type = 'front_page';
    elseif ( is_single() )  $page_type = 'single_post';
    elseif ( is_page() )    $page_type = 'page';
    elseif ( is_archive() ) $page_type = 'archive';
    elseif ( is_search() )  $page_type = 'search';

    newrelic_add_custom_parameter( 'wp_page_type',    $page_type );
    newrelic_add_custom_parameter( 'wp_template',     get_page_template_slug() ?: 'default' );
    newrelic_add_custom_parameter( 'wp_theme',        get_stylesheet() );
    newrelic_add_custom_parameter( 'wp_is_cached',    ( defined('WP_CACHE') && WP_CACHE ) ? 'true' : 'false' );
    newrelic_add_custom_parameter( 'wp_query_count',  get_num_queries() );
    newrelic_add_custom_parameter( 'wp_memory_usage', round( memory_get_usage() / 1024 / 1024, 2 ) . 'MB' );
} );

/**
 * 管理画面のトランザクション名を設定
 */
add_action( 'admin_init', function () {
    if ( ! function_exists( 'newrelic_name_transaction' ) ) {
        return;
    }
    $screen = get_current_screen();
    if ( $screen ) {
        newrelic_name_transaction( 'wp-admin/' . $screen->id );
    }
} );

/**
 * WP Cronのジョブをトランザクションとして記録
 */
add_action( 'wp_after_admin_bar_render', function () {
    if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
        newrelic_background_job( true );
        newrelic_name_transaction( 'wp-cron/' . ( $_GET['doing_wp_cron'] ?? 'unknown' ) );
    }
} );

ステップ4:スロークエリの検出と分析

データベースクエリの遅延をNew Relicで検出するカスタムフィルターを実装します。

<?php
// mu-plugins/newrelic-query-monitor.php

/**
 * 遅いWordPressクエリをNew Relicのカスタムイベントとして記録
 */
add_filter( 'query', function ( string $query ): string {
    if ( ! function_exists( 'newrelic_record_custom_event' ) ) {
        return $query;
    }

    $start = microtime( true );
    // クエリ実行はWordPress本体が行うのでフックで時間を計測
    add_filter( 'query_vars', function ( $vars ) use ( $query, $start ) {
        $duration_ms = ( microtime( true ) - $start ) * 1000;
        if ( $duration_ms > 100 ) {
            // 100ms以上のクエリをカスタムイベントとして記録
            newrelic_record_custom_event( 'SlowWordPressQuery', [
                'query'       => substr( $query, 0, 500 ),
                'duration_ms' => round( $duration_ms, 2 ),
                'page_url'    => $_SERVER['REQUEST_URI'] ?? '/',
                'timestamp'   => time(),
            ]);
        }
        return $vars;
    } );
    return $query;
} );

ステップ5:アラートポリシーの設定

New Relicのアラートで応答時間超過を自動通知します。

# New Relic CLI を使ったアラートポリシー作成
# pip install newrelic-client または New Relic API を直接使用

# アラートポリシーの作成(APIを使用)
curl -X POST 'https://api.newrelic.com/v2/alerts_policies.json' \
  -H 'X-Api-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "policy": {
      "incident_preference": "PER_POLICY",
      "name": "WordPress Performance Alerts"
    }
  }'

# 応答時間2秒超過アラートの設定(NRQLアラート)
# New Relic UI または API で以下のNRQLを設定:
# SELECT average(duration) FROM Transaction
# WHERE appName = 'WordPress Production'
# AND transactionType = 'Web'
# FACET name
# → 平均応答時間が2000ms を超えたらアラート

# Slack通知チャンネルの設定(New Relic UI で設定後IDを取得)
curl -X POST 'https://api.newrelic.com/v2/alerts_channels.json' \
  -H 'X-Api-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "channel": {
      "name": "WordPress Slack Alerts",
      "type": "slack",
      "configuration": {
        "url": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
        "channel": "#wp-alerts"
      }
    }
  }'

注意事項

  • New Relic PHPエージェントはリクエストごとにわずかなオーバーヘッドを追加する(通常1-3ms)。高トラフィックサイトではサンプリング率(newrelic.analytics_events.transactions_enabled)を調整すること
  • newrelic.transaction_tracer.record_sql = raw は本番環境での使用を避けること。個人情報を含むSQLがNew Relicサーバーに送信される可能性がある
  • ライセンスキーは wp-config.php や公開リポジトリに直接書かず、環境変数(NEW_RELIC_LICENSE_KEY)として管理すること
  • New Relicの無料プランでは最大90日分のデータ保持、有料プランでは最大13ヶ月のデータ保持が可能
  • WP-CLIやWP Cronの実行はバックグラウンドトランザクションとして分類されるため、newrelic_background_job(true) を設定しないとWebトランザクションとして集計されアラートが誤発火する

まとめ

New Relic APMを導入することで、WordPressのパフォーマンスをトランザクション単位で可視化し、ボトルネックを精確に特定できます。パフォーマンス改善の次のステップとして「WordPressへの突然のトラフィックスパイクを対処する方法」も参照してください。

お気軽にご相談ください

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