NRQLの挙動にアップデートがありましたのでお知らせします!「New Relic Query Language Enhancements: Wildcards, Empty Strings, Null, Empty Sets, and More」の翻訳です👏


ウィザード級NRQLエンジニアを目指している方は、New Relic Query Language (NRQL) にさらに強力な機能が追加されたことをご存じのことでしょう。NRQL は New Relic Database (NRDB) のクエリ言語であり、テレメトリデータの探索に威力を発揮します。New Relicのダッシュボードや分析機能を使えば、データをグラフに変換して一目でわかるようにすることができ、結果に基づいてより効率的な意思決定を行うことができます。

ユーザーの皆様により良いサービスを提供するために、最近、NRQLの大幅な機能強化を行いました。これはすべてのNew Relicユーザーの皆様にご利用いただけます。

ワイルドカードを使用したメトリクスの分析

新しいNRQLワイルドカードによって、複数のメトリクスにまとめてクエリを実行したり、チャートを作成したりするのが、より速く簡単になりました。また、ワイルドカードを使用することで、似たような命名パターンであれば、新しいメトリクスが作成されたとしても、個々のメトリクスを手動でクエリに追加する必要がなくなります。

例えば、階層的な命名パターンは、メトリックデータに構造を追加し、メトリックが何を測定しているかを一目で理解しやすくするために一般的に使用されます。例えば、以下のようになります。

  • memory.heap.used
  • memory.heap.committed
  • A.duration
  • B.duration

以前のNRQLでは、アルゴリズムAとBの平均値をチャート化するには次のような記述が必要でした。

FROM Metric SELECT average(algorithm.A.duration), average(algorithm.B.duration) TIMESERIES<

上記は特に難しいことではありませんが、ユーザーがこのメトリックのバリエーションを追加し続けたり、時間の経過とともに値が変化すると、メトリック名を個別に明示的にリストアップする手間が煩わしくなり、エラーが発生しやすくなります。

新しいメトリックを追加したり、既存のメトリックを変更したりする場合、この特定のメトリックを使用するダッシュボード、チャート、アラート、および保存されたクエリをすべてを、手動で更新する必要がありました。

ワイルドカードがあなたを救う!

1つのプロセスに関連する異なるアルゴリズムの処理時間を示す、以下のようなメトリクスがあるとします。

  • algorithm.A.duration
  • algorithm.B.duration
  • algorithm.C.duration

これが、ワイルドカードを使用して、3つのアルゴリズムを簡単に問い合わせたり、クエリの構造に応じてFACETすることができるようになりました。

シナリオ 1: 平均処理時間を1つの値として集計する

FROM Metric SELECT average(algorithm.%.duration) TIMESERIES

シナリオ 2: 平均処理時間をメトリックでFACETして集計する

FROM Metric SELECT average(algorithm.%.duration) FACET metricName TIMESERIES

どちらのシナリオでも、ワイルドカード (%) は変数として処理されます。したがって、algorithm で始まり .duration で終わる metricName を持つ任意のメトリックが返されます。

Null, 空文字, 空集合, そしてNaN

NRDB は、メトリクス、イベント、ログ、トレースを含む毎分 10 億以上のデータポイントを取り込み続けています(「Telemetry Data 101」もご覧ください!)。NRDBに送信するテレメトリは、無数のデータ型と値で構成されています。現在、NULL、空文字、空集合、および NaN (not-a-number: 数値ではない) の処理方法が強化されており、期待通りの結果が得られるようになっています。

空文字と空集合

空文字とは、ただの空の文字列です。これはNULLではありませんし、NRDBは常に空の文字列を別個のエンティティとして格納してきました。しかし、クエリ時にNRQLは空文字列をNULLとして返していたため、予期しない結果になっていました。例えば、ユーザーが「タグ」を表現する方法として空の値を持つ属性を利用したい場合、「WHERE `label.node-role.kubernetes.io/master` IS NOT NULL」のような条件を指定すると、タグが存在するかどうかに関わらずFALSEを返していました。

NRQLをアップデートして、ストレージ形式の空文字=クエリ時に空文字になるようにしました。これで、ユーザーは前述の「タグ」を統合データ上で利用することもできるようになりました。

空集合の最小値と最大値はNaNであり、0ではない

お客様が最初にNRDBにデータを送信し始めると、そのデータには値が欠けていることがあります。これは、空集合として知られているものです。

NRDBは、このような空の集合の最小値や最大値をNaNとして扱います。以前のNRQLでは、minまたはmaxを'NaN'ではなく'0'として返していました。

これで、例えばコンテナをスピンアップ(またはダウン)しても、テレメトリデータが NRDB に報告される前に '0' の値が表示されることはなくなりました。これらのシナリオはエッジケースですが、空集合にクエリするときに NRQL が適切な値 'NaN' を返すようになりましたので、ご安心ください!

NRQL クエリのブラッシュアップに興味がある方は、ドキュメントサイトをご覧になるか、New Relic Explorers Hub でこれらのアップデートについての考えを共有してください。