New Relic Now Learn about New Relic’s most transformative platform update yet with 15 product launches.
Save your seat.

NRQLの集計関数で変化率を計算する関数としてderivative()及びそれから派生したpredictLinear()があります。それらは少し特殊な関数のため、集計が表示されないアラートで使えないというお問い合せがたまにあります。そのため、本ブログにて注意点をご紹介します。

注意点1
データの間隔を確認する

これらの関数に関して、複数のデータポイントを使って値を算出しており、集計には複数のデータが必要となります。そのため、まず、データポイントの間隔を確認してください。

基本的には、derivative()を利用する対象のデータは、Transactionのような定期的に大量のイベントが保存されるようなデータではなく、MetricSystemSampleなどのインフラストラクチャイベント、定期的に保存するように実装されたカスタムイベントに適用されるかと思います。

例えば、1分に1回、数値データを保存するようなMyTestEventというカスタムイベントを例に記載します。

データの確認には、All CapabilitiesにあるMetrics & Eventsで確認してみてください。Metrics & Eventsを表示後、Eventsを選択し、MyTestEventを選択します。

その後、右側の表示形式で「Raw data」を選択すると生のデータが確認できます。

表示されている内容を確認していただくとtimestampが1分ごとにデータが存在していることがわかります。前述しましたが、derivative()を利用するためには、複数のデータポイントが必要となります。そのため、時系列で表示するためにTIMESERIES句を利用する場合は、2分以上を指定する必要があります。

試しに1分を指定すると、以下のようにチャートが表示されません。

また、TIMESERIESの間隔を2分に変更すると、こちらのようにチャートが表示されることが確認できます。

また、NRQLアラートコンディションで利用する場合は、Window durationの設定がTIMESERIESの値に相当します。そのため、アラートコンディションで利用する場合は、Window durationの値にて調整してください。

注意点2
データの形式を確認する

MetricInfrastructureのデータに対して、derivative()predictLinear()を適用する場合、上記のデータ間隔を確認したうえでも、期待通りに動作しない場合があります。

例えばAWSのCloudWatch MetricからMetricStream経由で転送されたMetricに関してはDimensional Metricになります。Dimensional Metricは、各属性に単純に数値が保存されているわけではないため、こちらのドキュメントに記載の通り、直接適用できる集計関数が限定されています。また、Infrastructureのデータも対応が完了している場合、こちらのように保存形式が、gaugeタイプに変更されています。

実際にMetricStream経由で送られた、aws.apigateway.LatencyというMetricにてMetrics & Eventsを使って確認してみます。いかが実際の確認結果がですが、1分ごとにMetricが記録されていることがわかります。

また、aws.apigateway.Latencyの属性に保存されている値にも注目します。

見て分かる通り、{"type":"summary","count":5,"sum":1100.0,"min":97.0,"max":365.0}
のように数値ではなく、JSON形式で各種値が保存されていることがわかります。こちらの場合は、typesummaryとなっているのでsummaryタイプのMetricということになり、先に記載したドキュメントを確認すると、直接利用可能な集計関数は、min(), max(), sum(), count(), average() のみであることがわかります。
この場合は、getField()関数を組み合わせていただくことができます。先に記載した通り、JSON形式で、type, count, sum, min, maxという名前で各値が保存されていますが、この値をgetField()を使って取得することができます。例えば、maxに格納された値を使って、derivative()を適用したい場合、以下のように記載ができます。
 

SELECT derivative(getField(`aws.apigateway.Latency`, max), 1 minute) FROM Metric …..

実際にクエリーを実行していただくと以下のように問題なくチャートが表示されることがご確認いただけます。

その他の注意点

ドキュメントでも記載されていますが、derivative()及びpredictLinear()は、各期間に含まれるデータのみを使って、線形最小二乗回帰を使って変化率を使っています。そのため、期間に含まれるデータ数が少ないと、近似線が極端な数値を示します。1分に1回データがあるから2分で十分というわけではなく、最低限計算ができる期間として捉え、対象のデータの傾向を確認し、必要十分な長さを検討・設定していただくのをおすすめしております。