New Relic NRQL高度クエリ - 複雑な分析とデータ相関技法

NRQL(New Relic Query Language)の基本的な使い方を習得した後は、より高度な分析技法を身につけることで、システムの深い洞察を得られます。この記事では、複雑な統計関数、サブクエリ、データ相関分析など、実践的な運用現場で威力を発揮するNRQLの応用テクニックを詳しく解説していきます。

高度な統計関数とデータ分析

NRQLでは、単純な平均値や合計値を超えた、統計学的に意味のある分析が可能です。特に重要なのがパーセンタイル分析とヒストグラム分析です。

パーセンタイル分析では、データの分布を詳細に把握できます。レスポンス時間の分析において、平均値だけでは見えない異常値や分布の偏りを発見することができます。

sql
SELECT histogram(duration, 10, 20) as 'Response Time Distribution',
       percentile(duration, 50, 75, 90, 95, 99) as 'Percentiles',
       stddev(duration) as 'Standard Deviation'
FROM Transaction
WHERE appName = 'CriticalApp'
SINCE 1 day ago
TIMESERIES 1 hour

このクエリでは、histogram()関数で応答時間の分布を10個のバケットに分け、最大値20秒として可視化します。同時に、複数のパーセンタイル値を一度に取得し、標準偏差も計算しています。その結果、レスポンス時間の全体的な傾向と異常な遅延の発生パターンを包括的に理解できます。

NRQL APIのレート制限についても理解しておきましょう。スタンダードアカウントでは1日あたり25,000回のクエリ、Proアカウントでは100,000回までの利用が可能です。また、データ保持期間は契約プランにより異なり、Standard版では90日間、Pro版以上では13ヶ月間のクエリ実行が可能です。

変化率や傾向分析には、rate()関数とderivative()関数が有効です。

sql
SELECT rate(count(*), 1 minute) as 'Requests per Minute',
       derivative(average(duration), 1 minute) as 'Response Time Trend'
FROM Transaction
WHERE appName = 'MyApp'
SINCE 6 hours ago
TIMESERIES 1 minute

rate()関数は指定した時間単位での変化率を計算し、derivative()関数は値の変化の傾向を示します。これらを組み合わせることで、負荷の急激な増加やパフォーマンスの劣化傾向をいち早く検出できるでしょう。

条件付き集計とフィルタリング関数

複雑なビジネスロジックに対応するため、NRQLには高度なフィルタリング機能が用意されています。filter()関数を使用すると、同じクエリ内で異なる条件のデータを並行して分析できるでしょう。

sql
SELECT count(*) as 'Total Requests',
       filter(count(*), WHERE responseCode LIKE '2%') as 'Successful Requests',
       filter(count(*), WHERE responseCode LIKE '4%') as 'Client Errors',
       filter(count(*), WHERE responseCode LIKE '5%') as 'Server Errors',
       filter(average(duration), WHERE responseCode LIKE '2%') as 'Success Response Time',
       filter(average(duration), WHERE responseCode LIKE '5%') as 'Error Response Time'
FROM Transaction
WHERE appName = 'ProductionApp'
SINCE 1 hour ago
FACET name

このクエリでは、成功レスポンス、クライアントエラー、サーバーエラーを同時に分析し、さらにそれぞれの応答時間も比較しています。エラー時の応答時間が通常より長い場合、タイムアウトやリソース不足が原因である可能性を示唆します。

エラーが発生した場合は、以下のデバッグ手順を試してください:

  1. クエリの構文エラーチェック
  2. データ量の削減(LIMIT句の使用)
  3. 時間範囲の縮小
  4. 存在しない属性名の確認

正規表現を活用したパターンマッチングも強力な機能です。

sql
SELECT count(*) as 'API Calls',
       average(duration) as 'Average Duration'
FROM Transaction
WHERE name RLIKE '^/api/v[0-9]+/users/[0-9]+$'
  AND httpMethod = 'GET'
SINCE 1 day ago
FACET capture(name, r'^/api/(v[0-9]+)/') as 'API Version'

RLIKE演算子で正規表現によるマッチングを行い、capture()関数で特定のパターンを抽出しています。その結果、API バージョン別のパフォーマンス分析が可能になります。

サブクエリと比較分析

NRQLでは、サブクエリを使用して過去のデータとの比較や、複数の期間にわたる分析が可能です。これは、トレンド分析や異常検知において特に有用でしょう。

sql
SELECT average(duration) as 'Current Average',
       (SELECT average(duration) 
        FROM Transaction 
        WHERE appName = 'MyApp' 
        SINCE 7 days ago UNTIL 6 days ago) as 'Week Ago Average',
       ((average(duration) - 
         (SELECT average(duration) 
          FROM Transaction 
          WHERE appName = 'MyApp' 
          SINCE 7 days ago UNTIL 6 days ago)) /
         (SELECT average(duration) 
          FROM Transaction 
          WHERE appName = 'MyApp' 
          SINCE 7 days ago UNTIL 6 days ago)) * 100 as 'Percentage Change'
FROM Transaction
WHERE appName = 'MyApp'
SINCE 1 hour ago

この複雑なクエリでは、現在のパフォーマンスを1週間前と比較し、変化率をパーセンテージで表示しています。定期的にこのようなクエリを実行することで、システムの長期的な傾向を把握できるでしょう。

データ相関分析とJOIN操作

New Relicでは、複数のデータソースを組み合わせた相関分析が可能です。アプリケーションパフォーマンスとインフラストラクチャメトリクスの関係を分析する例を見てみましょう。

sql
SELECT average(apm.duration) as 'App Response Time',
       average(infra.cpuPercent) as 'CPU Usage',
       average(infra.memoryUsedPercent) as 'Memory Usage'
FROM Transaction as apm, SystemSample as infra
WHERE apm.appName = 'CriticalApp'
  AND infra.entityName = 'web-server-01'
  AND apm.timestamp = infra.timestamp
SINCE 4 hours ago
TIMESERIES 5 minutes

このクエリでは、アプリケーションの応答時間とサーバーのリソース使用率を時系列で対比しています。相関関係が見える場合は、リソース不足がパフォーマンス劣化の原因である可能性が高いと判断できます。

ウィンドウ関数と移動平均

トレンド分析では、ノイズを除去した滑らかなデータが必要になることがあります。NRQLでは、移動平均やウィンドウ関数を使用してデータを平滑化できます。

sql
SELECT average(duration) as 'Current Value',
       slidingwindow(average(duration), 5) as '5-Period Moving Average',
       lag(average(duration), 1) as 'Previous Value',
       lead(average(duration), 1) as 'Next Value'
FROM Transaction
WHERE appName = 'MyApp'
SINCE 6 hours ago
TIMESERIES 10 minutes

slidingwindow()関数で移動平均を計算し、lag()lead()関数で前後の値を参照することで、より安定した傾向分析が可能になります。

パフォーマンス最適化のベストプラクティス

高度なNRQLクエリを効率的に実行するためには、いくつかの最適化技法を理解しておくことが重要です。

まず、適切な時間範囲の指定が基本となります。長すぎる期間を指定すると、クエリの実行時間が長くなり、場合によってはタイムアウトすることもあります。

sql
-- 効率的な時間範囲指定
SELECT count(*)
FROM Transaction
WHERE appName = 'MyApp'
  AND timestamp >= 1 hour ago
  AND timestamp <= NOW

WHERE句でのフィルタリングを適切に行うことで、処理対象のデータ量を削減できます。特に、高カーディナリティな属性(ユーザーIDなど)でのフィルタリングは効果的です。

また、LIMIT句を使用して結果セットのサイズを制限することも重要です。

sql
SELECT name, count(*)
FROM Transaction
WHERE appName = 'MyApp'
SINCE 1 day ago
FACET name
ORDER BY count(*) DESC
LIMIT 20

まとめ

NRQL の高度な機能を活用することで、単純な監視を超えた深いシステム分析が可能になります。統計関数、サブクエリ、相関分析といった技法を組み合わせることで、パフォーマンスの問題を早期発見し、システムの最適化に役立つ洞察を得ることができます。

これらの高度なクエリ技法は、日常的な監視業務だけでなく、障害調査や容量計画においても強力なツールとなるでしょう。継続的な学習と実践により、New Relicの真価を最大限に活用できるようになります。


関連記事: NRQL基礎関連記事: カスタムダッシュボード作成