最初の NRQL チュートリアルでは、クエリ構築の基礎を学びました。基本的なクエリ構造、時間枠の定義、観察する特定の属性を選択する方法について説明しました。また、グラフやその他の視覚化を使用してデータの集計と表示を開始する方法も学びました。
このチュートリアルでは、さらに深く掘り下げて、有用な集計を作成するための関数をさらに検討していきます。ここでは、返されたデータを以前の期間と比較し、データを特定の時間枠にグループ化する方法を学習します。また、 SINCE
とUNTIL
機能をさらに活用したり、フィルタでのワイルドカードの使用について調べたりすることもできます。具体的には、次の方法を学びます。
- を使用して一意の値をクエリします。
uniques(attributeName)
- 次を使用して、属性内に存在する一意の値の数を確認します。
uniqueCount(attributeName)
- 特定の時間枠内で
earliest(attributeName)
とlatest(attributeName)
を取得します - 修飾子またはその他のデータ ポイントに基づいてパーセンテージを計算します。
percentile()
- 属性と集計関数、または両方の組み合わせを使用して基本的な計算を実行します。
- 属性名をカスタムで読みやすいものにキャストします
LIKE
/NOT LIKE
のワイルドカードを使用して検索を含めたり除外したりするか、結果をリストまたはリストに限定しますNOT IN
IN
- 日付、エポック、および
WITH TIMEZONE
- 時間ベースのコホートを使用して、データを興味深い時間枠にグループ化します。
それでは始めましょう。
集計関数
最初の最初の NRQL チュートリアルを完了した後、 count()
、 average()
、 sum()
、 max()
およびmin()
を使用して、有意義な方法でデータを変換しました。しかし、一意の値を見つけてカウントしたい場合はどうすればよいでしょうか?指定された時間範囲にわたって属性に対して記録された一意の値の数を確認するには、 uniqueCount() function
を使用できます。検査する属性を引数として指定するだけです。たとえば、すべての一意のパブリック API 呼び出しを表示するクエリは次のとおりです。
SELECT uniqueCount(http.url) FROM Public_APICall SINCE 1 day ago
クエリのパフォーマンスを最適化するために、上記の関数は 256 を超える一意の値を検査するクエリのおおよその結果を返します。指定された時間範囲における属性の一意の値の実際のリストを返すには、 uniques()
関数を使用できます。
SELECT uniques(http.url) FROM Public_APICall SINCE 1 day ago
2 番目の制限パラメータを指定して、デフォルトの 1,000 とは異なる制限値を指定する場合。これを行うには、 uniques(attribute[,limit])
を使用します。これにより、制限が最大 10,000 までの任意の値に変更されます。
指定した時間範囲における属性の最新の値を取得するには、 latest()
関数を使用します。このサンプル クエリでは、過去 1 日の API 呼び出しの最新の応答時間を見つけることができます。これは、断続的にレポートされるトランザクションまたはサービスの最新の値を見つけるのに役立ちます。
SELECT latest(duration) FROM Public_APICall WHERE awsAPI = 'sqs' SINCE 1 day ago
逆に、 earliest()
関数を使用すると、その逆のことを実現できます。指定された時間範囲内に記録された属性の最も古い値を返します。このサンプル クエリでは、過去 1 日の API 呼び出しの最も早い応答時間を取得できます。データが一貫してレポートされている場合、過去 24 時間の最も古いイベントのデータ ポイントがレポートされます。
SELECT earliest(duration) FROM Public_APICall WHERE awsAPI = 'sqs' SINCE 1 day ago
数、合計、平均ではなくパーセンテージが必要な場合があります。percentage()
関数を使用すると、指定した条件に一致するデータセット内の値の割合を計算できます。この関数は 2 つの引数を取ります。1 つ目は、目的の属性の集計関数 ( count()
など) です。2 番目は、クエリするデータのサブセットを指定するためのWHERE
条件です。
このサンプル クエリでは、過去 1 日の期間 (または応答時間) が 100 ミリ秒を超えた API 呼び出しの割合を見つけることができます。
SELECT percentage(count(*), WHERE duration > 0.1) FROM Public_APICall SINCE 1 day ago
アプリケーションのパフォーマンスや顧客エクスペリエンスのデータを、平均ではなくパーセンタイルを使用して表示するのが非常に一般的です。percentile()
関数を使用すると、n 番目のパーセンタイルのエクスペリエンスを理解できます。
たとえば、過去 1 日の顧客エクスペリエンスの 98% のうち、最悪のエクスペリエンス (最長期間) を知りたいとします。過去 24 時間から NRDB にpercentile(duration, 98)
を要求できます。
SELECT percentile(duration,98) FROM Public_APICall SINCE 1 day ago
ご覧のとおり、集約は強力な方法でデータを操作できます。uniqueCount()
を使用すると、特定の属性の一意のエントリをカウントできます。ただし、これを使用して、一意のマシン、レポートコンテナの数、または New Relic に送信されるカスタム データ ポイントの数を特定することもできます。また、クエリに使用できる一意の値を知りたい場合は、いつでもuniques()
を使用してリストを要求できます。
latest()
/ earliest()
関数は、スパース データを処理する場合、または何かのレポートがいつ開始または停止されたかを調査する場合に特に価値があります (New Relic がまだデータを保存していると仮定します)。percentage()
関数は、結果セット全体と比較して、修飾子に一致したイベントの割合を表示できます。最後に、すべてのエンド ユーザー トランザクションの 90% が指定された期間を超えるようにするという目標を設定することで、 percentile()
を主要業績評価指標として使用できます。
データの制御がさらに進化しています。次のステップでは、NRQL を使用して基本的な数学を実行する方法を学びます。
算術演算子を使用する
NRQL は基本的な数学演算子をサポートします。数値属性値と集計関数の結果の両方に対して、加算 ( +
)、減算 ( -
)、乗算 ( *
)、および除算 ( /
) を実行できます。
たとえば、トランザクション イベントを記録するときに、合計応答時間 ( duration
として) とデータベース応答時間 ( databaseDuration
として) の両方をキャプチャします。しかし、データベース処理以外に費やされる平均時間を知りたい場合はどうすればよいでしょうか?このようなクエリを使用して、データ セット内の各イベントの値を計算することから始めることができます。
SELECT GigabytesIngestedBillable - GigabytesIngestedFree, metric FROM NrMTDConsumption WHERE productLine IS NOT NULL
素晴らしい!基本的な計算を実行しました。これは、個々のイベントをリストするのに役立ちます。しかし、データベース時間を使わずにトランザクションの平均継続時間を知りたい場合はどうすればよいでしょうか?便利なことに、関数内で算術演算を行うことができます。
SELECT average(GigabytesIngestedBillable - GigabytesIngestedFree) FROM NrMTDConsumption WHERE GigabytesIngestedBillable IS NOT NULL
さて、同じクエリ内で減算、除算、乗算をさらに複雑にして、データベース時間を除いた時間を全体時間のパーセンテージとして計算したい場合はどうすればよいでしょうか?さて、次の計算を追加できます。
SELECT average(GigabytesIngestedBillable - GigabytesIngestedFree) / unitPrice * 100 FROM NrMTDConsumption WHERE GigabytesIngestedBillable IS NOT NULL
New Relic はイベントの一部としてタイミングをレポートするため、それらを使用して意味のあるデータ ポイントを計算したり、パーセンテージの結果を生成したりすることもできます。カスタム アクションやイベントのタイミングを調整したり、カスタム データを送信したりすることで、基本的な数学の力をさらに最大限に活用できます。たとえば、注文サイズと支払い方法に関するデータをレポートする電子商取引プラットフォームは、数学を使用して、注文のコンバージョン率と個別の顧客訪問数などを計算できます。
次のステップでは、NRQL を使用して属性にラベルを付ける方法を学習します。
ラベルの属性
より複雑な NRQL 関数を実行し始めると、特に NRQL を知らない人にとって、クエリ属性に表示される名前をもっと便利にできないか疑問に思うかもしれません。前のチュートリアルで学んだ内容を使用した例を考えてみましょう。
SELECT average(duration-externalDuration) FROM Transaction
関数または属性の後にAS
句を使用すると、結果に読みやすく意味のある名前を付けることができます。これにより、あなたとあなたのチームは、グラフが何を表しているのかを正確に理解しやすくなります。
SELECT average(duration-externalDuration) AS 'Non-External Response Time' FROM Transaction
これは純粋に美的であるように思えるかもしれませんが、詳細なダッシュボードを構築するときは、データに明確にラベルを付けることが重要です。これにより、ウィジェット、看板、折れ線グラフ、または表を閲覧する人にとって曖昧さがなくなります。
これについては、今後のグループ化に関するレッスンで再度参照し、より高度なシナリオでもAS
クリーンな結果セットを作成する方法を検討します。次に、さまざまな時間枠でデータを比較する方法を学びます。
時間枠を比較する
ここまでで、 SINCE
とUNTIL
句で時間範囲を使用する練習をしました。しかし、異なる時間範囲の値を比較したい場合はどうすればよいでしょうか?これは、 COMPARE WITH
句を使用して実現できます。
NRQL は、 SINCE
とUNTIL
を使用して対象期間を定義します。次に、相対オフセット値を含むCOMPARE WITH [time period] AGO
句を使用して、比較する期間を指定できます。
たとえば、以下のサンプル クエリでは、1 週間前の相対オフセットを使用して、前日のデータと前の週のデータを比較できます。
SELECT average(duration) FROM Public_APICall SINCE 1 day ago COMPARE WITH 1 week ago
時間の経過に伴う値の比較をマッピングするには、 TIMESERIES
を追加します。これにより、比較の折れ線グラフが作成され、この期間が最近のデータとどのように比較されるかを視覚化し、長期にわたって追跡できるようになります。
SELECT average(duration) FROM Public_APICall SINCE 1 day ago COMPARE WITH 1 week ago TIMESERIES
UNTIL
と同様に、同じ形式でさまざまな相対期間を指定することもできます。たとえば、 4 WEEKS AGO
または6 HOURS AGO
を指定できます。
SELECT average(duration) FROM Public_APICall SINCE 1 hour ago COMPARE WITH 6 hours ago TIMESERIES
比較すると、アプリケーションで何が起こっているかに関する質問にすぐに答えることができます。さまざまな売上、パフォーマンス、MTTR、エラー値は先週と比較して増加していますか?また、問題を調査している場合は、問題のあるパフォーマンスの期間と通常のパフォーマンスの期間を比較すると便利です。
ワイルドカードフィルターを使用する
これで、 WHERE
句を使用してクエリの結果をフィルタリングする方法がわかりました。標準の比較演算子を使用する以外に、属性に指定された部分文字列が含まれているかどうかを確認する場合は、 LIKE
とNOT LIKE
を使用することもできます。これを実現するには、文字列内の任意の場所でパーセント ( %
) 記号をワイルドカードとして使用できます。
このサンプル クエリでは、名前の任意の場所 (先頭、中間、または末尾) に「amazonaws」という用語が含まれるトランザクションの数を取得できます。
SELECT count(*) FROM Public_APICall WHERE http.url LIKE '%amazonaws%' FACET http.url SINCE 1 day ago
代わりにNOT LIKE
を使用するようにクエリを変更すると、選択した単語 (以下の「google」など) が名前に含まれないトランザクションの数が取得されます。
SELECT count(*) FROM Public_APICall WHERE http.url NOT LIKE '%google%' FACET http.url SINCE 1 day ago
最初と最後にワイルドカードとして%
を使用できます。つまり、テキスト内のどこかに「Web」などの用語が含まれているかどうか、選択した属性の値が New Relic によってチェックされます。同様に、 %Web
またはWeb%
を使用して、それぞれ「Web」で終わるか「Web」で始まるものと一致させることができます。
より絞り込んだ検索を行うために、文字列の間にワイルドカードを追加することもできます。このクエリは、「amazon」という単語の後に任意のテキストが続き、その後に「.com」という単語も含まれるトランザクション名をチェックします。その後に任意の数の文字が続きます。したがって、結果は名前に「amazon」と「.com」が含まれるトランザクションのみになります。
SELECT count(*) FROM Public_APICall WHERE http.url NOT LIKE '%amazon%.com' FACET http.url SINCE 1 day ago
極端な特異性が必要で、ワイルドカードを使用して一致できる共通の文字列が名前にない場合はどうすればよいでしょうか?IN
演算子とNOT IN
演算子を使用すると、属性に対してチェックする値のセットを指定できます。AND
演算子またはOR
演算子を使用して複数のWHERE
句を指定する代わりに、括弧内の値をカンマで区切ってリストすることで条件を簡素化できます。
このサンプル クエリでは、サブタイプが「graph.microsoft.com」または「s3.amazonaws.com」であるトランザクションの数をカウントできます。代わりにNOT IN
を使用するようにクエリを変更すると、サブタイプが "graph.microsoft.com" ではないトランザクションの数が取得されます。「s3.amazonaws.com」でもありません。
SELECT count(*) FROM Public_APICall WHERE http.url IN ('graph.microsoft.com', 's3.amazonaws.com') SINCE 1 day ago
データを制御し、必要な操作を行うことができるようになり、強力で意味のあるダッシュボードやアラートを構築できるようになります。次に、NRQL を使用して時間範囲を指定する方法を学びます。
時間範囲を指定する
SINCE
とUNTIL
句は、相対的な時間範囲に関する情報を提供するだけではなく、特定の日付や時刻を指定することもできます。次のサンプル クエリでは、 SINCE
日付をYYYY-MM-DD
形式で使用できます。
SELECT average(duration) FROM Public_APICall SINCE '2023-10-28' TIMESERIES MAX
これを使用して、指定した期間の SLA レポートを作成できます。YYYY-MM-DD HH:MM
の形式で特定の時刻を含めることもできます。このクエリでは、データが午後 6 時に設定されていることがわかります。
SELECT average(duration) FROM Public_APICall SINCE '2023-10-28 18:00' TIMESERIES MAX
場合によっては、イベント時間をエポック (UNIX) 時間で受け取ることがあります。便利なことに、エポック タイムスタンプをSINCE
とUNTIL
句で使用できるため、これらの値を別の日付形式に手動で変換する必要がありません。
SELECT average(duration) FROM Public_APICall SINCE 1698525489519 UNTIL 1698698289519 TIMESERIES MAX
NRDB は、一定期間にわたるデータを表示する場合、ユーザーがタイムゾーンの観点からデータを表示することを想定しています。しかし、国際チームが分散している場合、チームメイトの所在地に応じて、あなたの今日が明日、あるいは昨日になる可能性があります。WITH TIMEZONE
句を使用して、データを表示するタイムゾーンを定義できます。これは、 SINCE
とUNTIL
句の値の解釈に影響します。
以下の 2 つのグラフの例を考えてみましょう。各クエリには、 WITH TIMEZONE
を使用して指定されたタイムゾーンがあります。両者の時差は8時間です。データのパターンは同じですが、それぞれのタイムゾーンに合わせて 8 時間オフセットしていることに注目してください。
SELECT count(*) FROM Public_APICall SINCE yesterday UNTIL today WITH TIMEZONE 'America/Los_Angeles' TIMESERIES
SELECT count(*) FROM Public_APICall SINCE yesterday UNTIL today WITH TIMEZONE 'Europe/London' TIMESERIES
このレッスンが始まるまでは、時間制御メカニズムはすべて、今からの相対時間に依存していました。これで、世界の誰かの位置に応じてビューを調整できるようになりました。おそらく、アメリカ東海岸の顧客が西海岸にあるエンジニアリング チームに問題を報告するとします。チームはダッシュボードを構築し、顧客が引用するタイムゾーンにマップするようにビューを変換できます。そのため、顧客が東海岸の午前 9 時に問題についてアドバイスした場合、午前 9 時にその違いを頭の中で解釈する必要がないことを確認できます。
インシデントの特定の日付にデータを集中させる必要があり、現在時刻に対して移動する時間枠を使用せずにデータを調査したい場合、これは静的な時間枠でデータを取得するのに役立ちます。次の最後のレッスンでは、時間ベースのコホーティングを使用してレポートに時間を使用する方法を引き続き学習します。
時間ベースのコホートの使用
複雑に聞こえるかもしれませんが、時間ベースのコホートは、単にデータをminuteOf
、 hourOf
、 weekOf
などの時間ベースのグループに整理する方法を意味します。
期間にSINCE
句を使用すると、クエリされた時間全体の長さを取得します。しかし、そのデータが常にすべてを物語っているとは限りません。一定期間内のパフォーマンスをより詳しく分析する必要がある場合はどうすればよいでしょうか?時間ベースのコホートを使用すると、データをさらに論理的な時間ベースのグループに分類できます。
FACET
と多くの時間ベースの関数 ( hourOf(timestamp)
など) の 1 つを組み合わせて使用すると、1 週間分のデータを取得し、発生した特定の時間に基づいてパフォーマンスを把握できます。これにより傾向が明らかになり、アプリケーションにとって最もクリティカルな時期が特定されます。
SELECT average(duration) FROM Public_APICall FACET hourOf(timestamp) SINCE 1 week ago
上記のクエリを実行すると、時間帯に基づいて最も遅い応答時間がわかります。New Relic は、時間に基づいてファセットするためのさまざまなオプションを提供します。前の例では時間ごとにグループ化していますが、曜日ごとにグループ化して、応答時間が最も良い日と最も悪い日を特定することもできます。
SELECT average(duration) FROM Public_APICall FACET weekdayOf(timestamp) SINCE 1 week ago
特定の日のアプリケーションの最も遅い期間を確認できるようになりました。これを使用して、「製品が最も多く売れるのはいつですか?」などのビジネスクリティカルな質問に答えることができます。または「サインアップまたはログインが最も多いのはいつですか?」
結果を特定の日付でグループ化することもできます。これは、SLA レポートを検討する場合や、一定期間のパフォーマンスの変化を分析する場合に役立ちます。
SELECT average(duration) FROM Public_APICall FACET dateOf(timestamp) SINCE 1 week ago
データを掘り下げるのはいつでも楽しいものです。時間ベースのコホーティングは、特定の分、時間、日、または週に発生する問題を明らかにする簡単な方法です。New Relic に送信するデータに関係なく、NRQL を使用すると、必要に応じてデータをスライス、ダイス、整理、視覚化できます。
データ保持に応じて、週、月、年など、グループ化に使用できる他のオプションも多数あります。完全なリストを確認するには、 「グループ結果の期間別ドキュメント ページ」にアクセスしてください。
次は何ですか?
ここで得た知識を利用して、ダッシュボードの視覚化を作成し、データの最も関心のある側面を制御できます。これらの強力なテクニックを使用して、より詳細で特定のアラートに焦点を絞り、より興味深い視覚化を作成できます。準備ができたら、 3 番目のチュートリアルに進むことができます。ここでは、フィルター、ファセット ケース、ヒストグラム、apdex、eventType へのフィルター処理、値のオーバーライド、外挿など、さらに興味深い NRQL スキルを学びます。