本記事はConnect data across your stack with new NRQL subqueriesの抄訳記事です。

メトリクス、イベント、トレース、ログなどのすべてのテレメトリーデータを1か所にまとめることは、スタック全体のオブザーバビリティを実現するための最初のステップです。しかし、アプリケーションやシステムの健全性、パフォーマンスを把握するために、データを簡単に理解し調査することができなければ、世界中の優れた計測、メトリクスのためのデータベースツールはどれも役に立ちません。

最近強化されたNew Relic Query Language(NRQL)では、データを多角的に分析することで、データからより多くの気づきを得ることができます。サブクエリによって複数のソースおよび時間範囲からのデータを単一のクエリ内で結び付けることができます。ビデオをご覧いただき、また以下のサブクエリを使用して、スタック全体のより深い洞察を得る方法について学んでください。

サブクエリとは何か?

サブクエリとは、NRQLクエリの中に組み込まれる別のクエリのことです。各サブクエリがまず評価され、その結果が外部クエリの実行時に使用されます。サブクエリは最大3レベルまでネストできます。たとえば、以下のクエリは、応答時間が平均値を超えるトランザクションの数を検索します。

FROM Transaction SELECT count(*) WHERE duration > (FROM Transaction SELECT average(duration))

平均応答時間が30分であった場合、実質的なクエリは以下のようになります。

FROM Transaction SELECT count(*) WHERE duration > 30

以前は、まずクエリを実行して平均値を求め、その平均値を2番目のクエリに手入力する必要がありました。

データの結び付け:サブクエリの例

現代のオブザーバビリティには、すべてのサービスにわたるテレメトリが必要です。しかし、モニタリングツールに送信するデータソースが多ければ多いほど、アプリケーションのパフォーマンスについて、1つの意味あるストーリーを得ることが難しくなります。その問題を解決するためのサブクエリのユースケースをいくつかご紹介します。

エンティティデータの結び付けによる、アプリのエラーおよびパフォーマンスの関連付け

エンティティとは、一意のエンティティIDを持ち、New Relicにデータを送信しているか、 New Relicがアクセスできるデータを含むものです。ほとんどのエンティティでは、IDは属性entityGuidで示されます。

このNRQLサブクエリの例では、最近エラーが発生した、さまざまなアプリケーションの平均応答時間を比較し、トランザクションエラーがアプリの実行時間に与えている影響を明らかにします。この例では、IN句を利用して、2つの異なるデータソースからの識別子を結び付ける方法を紹介します。

以下はサンプルのクエリです。

FROM Transaction SELECT average(duration) WHERE entity.guid IN (FROM TransactionError SELECT uniques(entity.guid))FACET appName TIMESERIES

複数の時間範囲におけるトレンドの検索

サブクエリが持つ他の強力な機能は、さまざまな時間範囲からのデータを比較できることです。COMPARE WITH機能だけを使っていた以前よりも、より興味深く詳細な比較を行うことができます。ここでひとつ、例をあげて解説しましょう。

FROM Transaction SELECT average(duration)-(FROM Transaction SELECT average(duration)SINCE 1 day AGO) TIMESERIES 5 minutes SLIDE BY MAX

このクエリでは過去1日の全トランザクションの平均継続時間を計算し、次に、直近1時間の時系列で差分を求めています。SLIDE BYはチャートを平滑化するために使用しています。このクエリは、昨日と比べてシステムがどのように動作しているかを示し、最近の傾向についての洞察を提供しています。スクリーンショットの例では、システムは比較的安定していて、ほんの数ナノ秒の誤差しかありませんが、毎回こうであるとは限りません。

データとログの結び付け

ログは非常に便利な情報を提供しており、またNew RelicのLogs in Contextによって、アプリケーション、サーバーレス、およびKubernetesクラスターから関連のあるログ詳細に素早くドリルダウンすることができます。新たに、NRQLサブクエリを使用して、トランザクションとログの関係を分析することもできます。

FROM Log SELECT * WHERE hostname = (FROM Transaction SELECT latest(host) WHERE containerId = 'insertcontainerid') AND level = 'ERROR'

前の例では、特定のcontainerIdを、関連するエラーログを含むホストと関連付けるために、トランザクションにクエリを発行しています。サブクエリによって、値を手動でクエリおよびコピーすることなく、このようなタイプの関連付けを簡単に行うことができます。また、以下のクエリに示されているように、エラーログが発生したホストからのトランザクションを発見することができます。

FROM Transaction SELECT * WHERE hostname = (FROM Log SELECT latest(host) WHERE level = 'ERROR')

ネストしたサブクエリでのトランザクションとスパンの結び付け

スパンとトランザクションはそれぞれ、システム内を横断するリクエストの一部を示しますが、それらを結び付けることは難しい場合もあります。次のクエリは、ネストした複数のサブクエリを利用することで、全スパンの99%よりも遅いスパンを含む各サービス内のトランザクションの合計数を把握することができます。このクエリはシステム内のボトルネックを見つけるのに役立ちます。

FROM Transaction SELECT count(*) WHERE entity.guid IN (    FROM Span SELECT latest(entity.guid)WHERE duration > (        FROM Span SELECT percentile(duration, 99)    ) FACET entity.guid ORDER BY average(duration) LIMIT 100) FACET appName

FROM Event SELECT latest(attribute) FACET attribute ORDER BY average(numAttribute) というサブクエリの構文は非常に有用です。この場合は、平均応答時間の上位100個のエンティティGUIDを取得し、それら100個の値を親クエリで使用することできます。これは前出のクエリにおけるサブクエリ第二レベルに相当します。

サブクエリを使用する際のヒント

サブクエリの使用には少し練習が必要です。以下は役立ついくつかのヒントです。

  • サブクエリを使用せずにクエリをテストする。テスト値で親クエリを実行し、サブクエリを導入する前にそれが期待通りに機能することを確認します。
  • サブクエリだけをテストする。サブクエリを実行し、親クエリで使用する前に結果を確認します。
  • サブクエリの制限を理解する。詳細については、NRQLサブクエリに関する文書をご覧ください。
  • クエリ体験をData Plusでアップグレードする。Data Plusユーザーは、最大クエリ制限が最大3倍、そして最大クエリ時間が最大2倍になります。Data Plusによって、30秒ごとに最大1兆のデータポイント、1分ごとに最大1,000億のデータポイントを検査することができます(従来のデータオプションでは、30秒ごとに最大3,000億のデータポイント、1分ごとに最大100億のデータポイント)。
  • サブクエリの結果タイプを確認する。これはサブクエリを使用することができるのタイプに影響を与えます。
    • サブクエリが多くの値から成るテーブルの結果を返す場合、それはFACETクエリやuniques(...)クエリなどのIN句内でのみ機能します。
    • 等値(=)または数式(+、-など)などのその他のコンテキストでは、FACETまたはクエリが機能するにはLIMIT 1が必要です。
    • 単一の値を返すクエリについては、数字やテキスト文字列など、標準のリテラル値を使用できる場所ならどこでも使用できます。ヒストグラム関数に選択されるバケット数など、現在サポートされていない一部のケースもあります。通常、サブクエリシステムは、正しくない場合にはわかりやすいエラーを提供します。

サブクエリはデータ調査のための強力な新ツールで、さまざまなデータソースおよび時間範囲においてより高度なクエリを可能にします。このブログで取り上げたのはほんの一例ですが、無限の可能性があります。私たちは、NRQLサブクエリを深く掘り下げて、皆さんがどのようなものを作成するかに興味があります。ぜひ多くのクエリ作成に挑戦してみてください。