ここまでは、NRQL の使用の基本、NRQL を使用してデータを制御する方法、NRQL を使用してダッシュボードを拡張する方法を学習しました。この最後のチュートリアル シリーズでは、データから必要なものをすべてクエリできるようにする最も高度な NRQL テクニックを学びます。このチュートリアルでは、追加の集計手法、高レベルの数学関数、正規表現フィルタリングやネストされた集計などの高度な機能について説明します。具体的には、以下の使用方法を学びます。
stddev()
集計関数、およびbuckets()
関数を使用して集計データをグループ化する方法。- NRQL 内でデータの平滑化、クランプ、操作を行うための高度な数学関数を使用できます。
- 特定の期間内のデータ内で利用可能なイベント タイプと属性を検出する方法。
RLIKE
を使用して正規表現でデータをフィルタリングする方法。- ネストされた集計とサブクエリの使用方法。
これらの機能が非常に貴重であることがお分かりいただけると思います。始めましょう!
集計でバケット化を使用する
標準偏差は、一連の値内の変動または分散の量を測定します。低 (平均に近い値) から高 (平均から遠い値) までのスケールが使用されます。stddev()
関数を使用すると、平均線の間を調べて、報告された値をより深いレベルで理解できます。この例では、前日と前日のトランザクション応答時間 (「期間」) の標準偏差を比較します。
SELECT stddev(duration) FROM Transaction SINCE 24 hours ago COMPARE WITH 24 hours ago TIMESERIES
stdvar()
関数はstddev()
と同様に機能しますが、数値属性の標準分散を返します。
前のレッスンでは、 FACET cases()
を使用してデータをバケットの特定の構成にグループ化する方法を学習しました。FACET buckets()
を使用して、特定の属性ごとにデータを自動的にバケット化することもできます。この関数は、任意の集計関数のデータのグループ化を簡素化し、次の 3 つの引数を受け取ります。
buckets(attribute, ceiling, number-of-buckets)
。
バケット化する属性。
サンプル範囲の最大値 (外れ値は最終バケットに表示されます)。
必要なバケットの総数。
このクエリ例では、NRQL を使用してトランザクション全体の平均継続時間を見つけます。 ただし、そのパフォーマンスを、特定の量のデータベース呼び出しを行うトランザクションにグループ化します。 したがって、バケット属性を
databaseCallCount
として指定し、上限を 400 呼び出しに設定し、それを 10 個のバケットにグループ化します。 これにより、0 ~ 40、40 ~ 80、80 ~ 120、120 ~ 160、160 ~ 200、200 ~ 240、240 ~ 280、280 ~ 320、320 ~ 360、および >360 のデータベース呼び出しを行うトランザクションのパフォーマンスが向上します。透明なバケツを天井まで均等に10個。SELECT average(duration)FROM TransactionSINCE 12 hours agoFACET buckets(databaseCallCount, 400, 10)
これで、NRQL に現在存在するすべての集計関数を学習したことになります。プロのようにデータを細かく分割できます。NRQL に集約機能が欠けていると思われる場合は、アカウント チームに知らせてください。私たちは、お客様が必要とする可能性のある次のキラー機能を常に探しています。
高度な数学関数を使用する
NRQL は、データを深く理解する必要がある人のために、より高度な数学関数もサポートしています。 これらの関数は、値を X 乗に外挿したり、平方根を見つけたり、クランプを適用して上限と下限を課したり、Y 軸の値を正の値に維持したりすることさえできます。
NRQL には、何らかの方法で値を操作する多くの数学関数があります。この例では、いくつかのデモが同時に行われていることがわかります。
abs(n)
関数は n の絶対値を返します。負でない n 値の場合は「n」を返し、負の n 値の場合は正の数「n」を返します。たとえば、 abs(2)
= 2、 abs(-4)
= 4 です。
floor()
、 ceil()
、およびround()
を使用して、10 進数を整数に丸めることもできます。floor()
は最も近い整数を切り捨てて返し、 ceil()
はその逆を切り上げて返します。round()
は双方向であり、最も近い完全な整数に切り上げまたは切り下げられます。
SELECT abs(duration), round(duration), ceil(duration), floor(duration) FROM Transaction SINCE 1 day ago
属性にクランプを使用すると、その値に上限または下限を設定できます。 これは、極端な外れ値によって時系列グラフのスケールが歪まないようにするなどの目的で使用されます。 clamp_max(duration, 10)
、10 を超えない限り継続時間を返します。10 を超える場合は 10 を返します。 簡単に言えば、10 より大きい値はすべて 10 として返されます。 clamp_min(duration,1)
はその逆を行い、期間が 1 未満の場合は 1 として報告します。
SELECT clamp_max(average(duration), 10), clamp_min(average(duration), 1) FROM Transaction SINCE 1 day ago TIMESERIES
ここで、多くの人が使用するのが難しいと感じる高度な数学に進むことができます。前と同様に、これらの関数をすべて 1 つのクエリ例で示すことができます。
pow()
関数は、最初の引数を 2 番目の引数で累乗します。この例では、期間を 2 乗します。値の平方根が必要な場合は、 sqrt()
関数を使用するとすぐにこれを取得できます。そして、 exp()
関数はその引数の自然指数関数を計算します。
最後に、NRQL は、多くの同様の関数に対応した対数も提供します。
このレッスンでは、イベント データの平滑化について学びました。round()
/ ceil()
/ floor()
を使用すると、好きな方法で丸められます。クランプを使用すると、データに境界を設けることができ、対数、平方根、べき乗、指数関数などの高度な数学ツールはすべて、必要に応じてデータを操作するためのさらなる制御を提供します。次に、イベントと属性を検出する方法について学びます。
イベントと属性を検出する
イベントと属性を検出すると、利用可能なデータをクエリする前に質問に答え、自動化を支援できます。この強力なユーティリティを少し見てみましょう。
これらの機能は、イベントのタイプと属性の変更を検出するのに役立ちます。より多くの DevOps エンジニアがこれらの機能を使用してジョブを完了したり、ジョブを迅速に自動化したりしています。次に、正規表現を使用してデータをフィルターする方法を学習します。
正規表現でフィルタリングする
簡単なマッチングも可能です。 たとえば、特定の文字または単語で始まる値を一致させたい場合。
SELECT count(*) FROM Transaction WHERE name RLIKE 'W.*|O.*' FACET name
正規表現エンジンは RE2 構文を使用します。 文字を削除する必要がある場合は、二重のバックスラッシュのエスケープ シーケンスを使用する必要がある場合があります。 (例えば \\
)。
RLIKE
本質的にLIKE
よりも複雑でパフォーマンスが低いことに注意してください。 LIKE
やその他のフィルタリング機能がニーズに合わない場合にのみ使用してください。
正規表現のサポートにより、ほぼ無限のパターン マッチングが可能になります。 すでに正規表現の専門家であれば、これが NRQL にどれほどの力を加えるかを知っているでしょう。 しかし、そうでない場合でも、心配しないでください。 Regex には、オンラインで参照できるリソースが多数あります。 NRQL で正規表現を使用する方法を学習したので、次はネストされた集計の使用です。
ネストされた集計を使用する
NRQL を使用して、クエリを親クエリのFROM
として使用するネストされた集計クエリを作成できます。これにより、次のような質問に答えることができます。
- 私のアプリケーションは 1 分あたり何件のトランザクションを処理しましたか?また、過去 1 時間の 1 分あたりの最大リクエスト速度はいくらでしたか?
- すべてのサーバーの平均 CPU 使用率はどれくらいですか? また、90% を超えている特定のサーバーはどれですか?
- すべてのユーザー セッションのうち、すぐにバウンスした割合は何パーセントですか (つまり、セッション内の PageView は 1 つだけですか)?
これらの各ユースケースをさらに詳しく見てみましょう。
例 1: 過去 1 時間の最大 API 呼び出し数
まず、過去 1 時間の 1 分あたりの API 呼び出し数をカウントできます。これにより、グラフ上に 60 個のデータ ポイントが返されます。
SELECT count(*) AS apicallsFROM Transaction TIMESERIES 1 MINUTE
ここで、その期間にわたって報告された最大値を見つけるために、クエリを括弧で囲み、次のようにSELECT ... FROM
を使用します。 SELECT z FROM (SELECT x AS z FROM y)
SELECT max(apicalls) FROM ( SELECT count(*) AS apicalls FROM Public_APICall TIMESERIES 1 minute )
例 2: CPU 負荷が高いサーバー
この例では、 New Relic Infrastructureのデータを使用します。 CPU が平均して特定のパーセンテージを超えているホストのみを表示したい場合があります。 NRQL にaverage(cpuPercent)
を要求すると、平均 CPU パーセントが最も高いホストのリストが取得されます。 ただし、単純にWHERE cpuPercent > 90
を追加して 90% 以上で実行されているホストのみに制限することはできません。平均を計算する前にデータが削除されてしまうためです。
しかし、ネストされた集計を使用すると、これを解決できます。サブクエリでaverage(cpuPercent)
を要求すると、ホストとその平均 CPU のリストが取得されます。これで、外側のクエリで、 > x%
! であった結果のみをフィルタリングできるようになりました。 (ヒント: ホストの CPU で動作するには、このクエリのしきい値を調整する必要がある場合があります。ここでは 20% に設定しています。)
SELECT hostname, cpu FROM (SELECT average(cpuPercent) AS cpu FROM SystemSample FACET hostname) WHERE cpu > 20
例 3 - セッションのバウンス
フロントエンド監視の直帰率をどのように計算すればよいか疑問に思う人がよくいます。これは、単一のページを表示し、さらに多くのページにアクセスする前に「バウンス」するセッションを指します。ネストされた集計を使用すると、これを簡単に実現できます。内部クエリはPageViews
をカウントし、セッションごとにグループ化します。外部クエリに渡される結果セットには、すべてのセッションと各セッションが表示されたページ数がリストされます。次に、外側のクエリは、カウントが 1 のセッションの割合を計算します (これは、単一ページしか表示されないため、「バウンスされたセッション」を示します)。
SELECT percentage(count(*), WHERE sessionLength = 1) FROM (SELECT count(*) AS sessionLength FROM PageView FACET session)
このレッスンでは、クエリを別のクエリのFROM
として使用して、より複雑な質問に答える方法を学習しました。最後に学ぶべきことは 1 つだけです、それはサブクエリの使用方法です。
サブクエリを使用
NRQL のサブクエリはネストされた集計に似ており、別のクエリ内にネストされたクエリを使用できます。サブクエリの場合、ネストされたクエリはSELECT
ステートメントとWHERE
句に入りますが、ネストされた集計はFROM
句に入ります。
これらのさまざまなタイプのサブクエリの例をいくつか見てみましょう。
IN条件
サブクエリから複数の値が返される場合は、親クエリにIN
条件を使用して各値と比較します。この例では、 entity.guid
属性はトランザクション エラーのある一意のエンティティごとにデータを提供し、これがトランザクションのentity.guid
値と照合されて、エラーが発生したエンティティの平均期間が決定されます。
SELECT average(duration) FROM Transaction WHERE entity.guid IN (SELECT uniques(entity.guid) FROM TransactionError) FACET appName TIMESERIES
このチュートリアルが完了しましたこと、おめでとうございます。 追加の集計テクニック、高レベルの数学関数、正規表現フィルタリング、ネストされた集計、サブクエリなどの高度な機能について学習しました。 これまでの 3 つのチュートリアルを完了している場合は、使用できる NRQL のほぼすべての側面を操作したことになります。
NRQL がデータの探索に役立つことを願っています。さらに質問がある場合や問題が発生した場合は、お気軽にNew Relic サポート までお問い合わせください。または、ご希望であれば、オンライン コミュニティであなたの経験を共有することもできます。