優れたNRQLクエリを記述するには、当社のさまざまなNRQL句と関数がどのように機能するかを理解すると有益です。このドキュメントには、NRQL句と関数の定義、およびその使用方法の例が記載されています。
基本的なNRQL構文ルールをお探しですか? NRQLの使用方法を参照してください。チュートリアルについては、NRQL入門チュートリアルを参照してください。
クエリの構成要素
基本的なNRQL構文ドキュメントに記載されているように、すべてのNRQLクエリにはSELECT
句とFROM
句が含まれています(他の句はすべてオプション)。以下の句の定義には、NRQLクエリの例も含まれます。
必要な句
SELECT attribute ...
SELECT function(attribute) ...
SELECT
は、属性または関数を指定することによって、データ型のどの部分をクエリするかを指定します。その後、カンマ区切りの1つ以上の引数が続きます。各引数では、以下を実行できます。
- ワイルドカードとして
*
を使用することで、利用可能なすべての属性値を取得。例:SELECT * from Transaction
。 - 指定した属性、または カンマ区切りのリストで指定した複数の属性に関連する値を取得。
- 集計関数を選択することで、指定した属性から集計値を取得。
AS
句で、各引数で返された結果にラベル付け。
基本的な数学関数とともにSELECT
を使用することもできます。
このクエリは、直近1週間の平均応答時間を返します。
SELECT average(duration) FROM PageView SINCE 1 week ago
SELECT ...FROM data type...
FROM
句を使用して、クエリするデータ型を指定します。クエリはFROM
またはSELECT
で開始できます。カンマ区切りのリストの複数のデータタイプにまたがる同じ属性の値をマージできます。
このクエリは、直近7日間のAPMトランザクションの全カウント数を返します。
SELECT count(*) FROM Transaction SINCE 7 days ago
このクエリは、直近3日間のAPMトランザクションとブラウザイベントの全カウント数を返します。
SELECT count(*) FROM Transaction, PageView SINCE 3 days ago
lookup()
をご覧ください。
オプション句
SELECT ...AS 'label'...
AS
句を使用して、シングルクォート区切りの文字列で属性、集計、ファネル内のステップ、または数学関数の結果にラベルを付けます。このラベルは結果のチャートで使用されます。FACET
句が使用されている場合、時系列グラフのAS
句のラベルは表示されないことに注意してください。
このクエリはセッションごとのページ数を返します。
SELECT count(*)/uniqueCount(session) AS 'Pageviews per Session'FROM PageView
このクエリは、過去1週間でサイトのメインページと採用情報ページの両方を訪れた人の数を返します。
SELECT funnel(SESSION, WHERE name='Controller/about/main' AS 'Step 1', WHERE name = 'Controller/about/careers' AS 'Step 2')FROM PageView SINCE 1 week ago
SELECT ... (SINCE or UNTIL) (integer units) AGOCOMPARE WITH (integer units) AGO...
COMPARE WITH
句を使用すると、2つの異なる時間範囲の値を比較できます。
COMPARE WITH
にはSINCE
またはUNTIL
文が必要です。COMPARE WITH
で指定された時間は、SINCE
またはUNTIL
で指定した時間に相対します。たとえば、SINCE 1 day ago COMPARE WITH 1 day ago
昨日を一昨日と比較します。
COMPARE WITH
値の時間範囲は、常にSINCE
またはUNTIL
で指定されたものと同じになります。たとえば、SINCE 2 hours ago COMPARE WITH 4 hours ago
は午後3時〜5時までと午前11時〜午後1時までを比較できます。
COMPARE WITH
結果は、折れ線グラフまたはビルボードで表示できます。
TIMESERIES
を使用すると、COMPARE WITH
は比較内容を経時的にマッピングした折れ線グラフを作成します。TIMESERIES
がない場合、COMPARE WITH
は現在値とCOMPARE WITH
値からの増減率でビルボードを生成します。
Exampleこのクエリは、過去1週間の95パーセンタイルと1週間前の同じ範囲の比較を表示する折れ線グラフでデータを返します。最初は単一値、次は折れ線グラフです。
SELECT percentile(duration, 95) FROM PageViewSINCE 1 week ago COMPARE WITH 1 week AGO
SELECT percentile(duration, 95) FROM PageViewSINCE 1 week ago COMPARE WITH 1 week AGO TIMESERIES AUTO
重要
COMPARE WITH
を使用するFACET
クエリの場合、結果のファセットは、比較される前の時間範囲ではなく、SINCE
およびUNTIL
を使用して指定された時間範囲に基づいて選択されます。以前の時間範囲のみに対するFACET
クエリの結果には、別のファセットのセットが含まれる場合があります。
この句は以下のデータ型で使用できます。
Transaction
TransactionError
エージェントAPIで報告されたカスタムイベント
EXTRAPOLATE
の目的は、クエリ結果がシステム内のアクティビティ全体をより厳密に表現できるよう、イベントデータのAPMエージェントサンプリングの影響を数学的に補うことです。この句は、APMエージェントが収集サイクルの報告限度をしばしば超過する多くのイベントを報告する際に便利です。その場合、エージェントはイベントのサンプリングを開始します。
EXTRAPOLATE
に対応したNRQLクエリでこれを使用する場合、reported eventsとtotal eventsの比率で、合計未サンプルデータの近似を推定します。この句に未対応であるか、サンプルデータを使用していないNRQLでこれを使用する場合、結果に影響を与えません。重要
EXTRAPOLATE
は、(スループットまたはエラー率など)同種データに対して最も有用である点に注意してください。(uniqueCount()
またはuniques()
など)特徴的なものの数を外挿する際には有効ではありません。この句は、以下のいずれかの集計関数を使用するNRQLクエリでのみ機能します。
apdex
average
count
histogram
sum
percentage
(引数として取る関数がEXTRAPOLATE
に対応している場合)rate
(引数として取る関数がEXTRAPOLATE
に対応している場合)stddev
interestingApplication
という名前のサービスの推定スループットを示すクエリ。SELECT count(*) FROM Transaction WHERE appName='interestingApplication' SINCE 60 minutes ago EXTRAPOLATEトランザクション名ごとに、時系列として表示する
interestingApplication
という名前のサービスの推定スループットを示すクエリ。SELECT count(*) FROM Transaction WHERE appName='interestingApplication'SINCE 60 minutes ago FACET name TIMESERIES 1 minute EXTRAPOLATE
SELECT ...FACET attribute...
FACET
を使用すると、結果を属性値で分割してグループ化できます。たとえば、PageView
データでdeviceType
別にFACET
を行い、トラフィックの何割が携帯電話、タブレット、およびデスクトップデバイスから発生しているかを把握することができます。
LIMIT
句を使用して、表示するファセットの数を指定します(デフォルトは10)。より複雑なグループ化に関しては、FACET CASES
を使用します。FACET
句は、カンマで区切られた最大5つの属性をサポートします。
ファセットは、SELECT
句で指定した最初のフィールドの降順で並べ替えられます。5,000件以上のユニーク値を持つ属性をファセットに指定した場合、ファセット値のサブセットを選択し、それらをクエリタイプに従って並べ替えます。時系列グラフがデータを返さない場合(NRQLが一致するデータがない、無効なNRQLなど)、 FROM
句の最初のテーブルに一致するラベルを持つ平坦な線のみが表示されることに注意してください。
min()
、max()
、percentile()
、average()
、またはcount()
を選択すると、FACET
はこれらの関数を使用してファセットの選択方法とソート方法を決定します。その他の関数を選択すると、FACET
はファセット対象の属性の発生頻度に基づいて、ファセットの選択方法とソート方法を決定します。
このクエリは、ページビュー数が最も多い都市を表示します。このクエリは、都市ごとのページビューの合計数を使用してファセットの選択方法と並べ替え方法を決定します。
SELECT count(*) FROM PageView FACET city
このクエリは、最も多数のユニークURLにアクセスしている都市を表示します。このクエリは、特定の都市が結果に表れる合計回数を使用して、ファセットの選択方法と並べ替え方法を決定します。
SELECT uniqueCount(pageUrl) FROM PageView FACET city
高度なセグメンテーションやコホート分析では、バケット機能でファセットすることでデータをより効率的に分割することができます。
コホート分析は、タイムスタンプに基づいて結果をグループ化する方法です。指定範囲日時に対応するバケットに結果を分割することができます。
重要
関数を使用して属性値を集計する場合、クエリの最初の関数で集計される属性にnull以外の値が含まれていることを確認してください。ファセットは、最初の関数の属性のnull以外の値を含む行に対してのみ選択されます。
例:
FROM Event SELECT average(attribute) FACET name
名前は、nullでない属性の行からのみ選択されます。
次のクエリを実行して、関数で使用している属性にnull以外の値が含まれているかどうかを確認します。
FROM Event SELECT attribute, name WHERE attribute IS NOT NULL
FACET ... AS
句では、クエリでAS
キーワードを使用してファセットに名前を付けます。この句は、結果のファセットに明確な名前または簡略化された名前を追加するのに役立ちます。ネスト構造の集計クエリで、ファセットの名前を変更するためにも使用できます。
FACET ... AS
クエリでは、結果のファセット名が変更されますが(たとえば、テーブルのヘッダーとして表示される場合)、実際のファセット名自体は変更されません。
FROM Transaction SELECT count(*) FACET response.headers.contentType AS 'content type'
SELECT ...FACET CASES ( WHERE attribute operator value, WHERE attribute operator value, ...)...
FACET
で可能な条件よりも複雑な条件でデータを分類するには、 FACET CASES
を使用します。複数の条件はカンマ,
で区切ります。 たとえば、PageView
データをクエリして、1秒未満、1秒から10秒、10秒を上回るといったカテゴリにFACET CASES
を行うことができます。ケース内の複数の属性を組み合わせ、AS
セレクタでケースにラベルを付けることができます。データポイントは、最大で1つのファセットケースに追加されます。つまり、一致する最初のファセットになります。
また、属性とともに時間関数を使用することもできます。また、OR
演算子を使用して、指定したどのケースにも一致しないファセット結果を表示することもできます。
SELECT count(*) FROM PageView FACET CASES ( WHERE duration < 1, WHERE duration > 1 AND duration < 10, WHERE duration > 10)
この例は、トランザクション名にlogin
が含まれる1つのバケットと、URLにlogin
が含まれ、かつカスタムアトリビュートがユーザーが有料ユーザーであったことを示すもう1つのバケットに結果をグループ化します。
SELECT count(*) FROM Transaction FACET CASES ( WHERE name LIKE '%login%', WHERE name LIKE '%feature%' AND customer_type = 'Paid')
この例は、結果に人間が読める名前をつけるためにAS
セレクタを使います。
SELECT count(*) FROM Transaction FACET CASES ( WHERE name LIKE '%login%' AS 'Total Logins', WHERE name LIKE '%feature%' AND customer_type='Paid' AS 'Feature Visits from Paid Users')
この例では、OR
演算子を使用して、どのケースにも一致しないファセット結果を表示しています。
SELECT count(*) FROM Transaction FACET CASES ( WHERE name LIKE '%login%', WHERE name LIKE '%feature%' AND customer_type='Paid') OR name
NRQLでは、デフォルトはSELECT
句の最初の集計で、クエリ内のファセットの選択をガイドします。FACET ... ORDER BY
では、ORDER BY
修飾子で集計関数を追加し、ファセットの選択方法を指定することで、このデフォルト動作をオーバーライドできます。具体的には、LIMIT
句によって制限される前に、最終結果に含めるファセットの優先度をオーバーライドします。この句はクエリには使用できますが、アラートやストリーミングには使用できません。
この例では、FACET ... ORDER BY
を使用してアプリトランザクションの平均期間を見つける方法を示し、応答サイズが最大のアプリによる上位10(デフォルトの制限)の最大期間を示しています。この場合、FACET ... ORDER BY
が使用されていない場合、クエリ結果には、アプリの選択とは関係のない応答サイズで、期間が最も長い上位10件が代わりに表示されます。
FROM Transaction SELECT average(duration) TIMESERIES FACET appName ORDER BY max(responseSize)
FACET ... ORDER BY
句を使用する場合、ASC
修飾子とDESC
修飾子を追加して、並べ替え順序を変更することはできません。デフォルトでは、この句はDESC
を使用します。
ヒント
LIMIT
句が適用される前に操作が実行されるため、FACET ... ORDER BY
は、最終的なクエリ結果の種類に影響を与えません。これは、非時系列クエリの結果で特に顕著になります。
重要
この場合のORDER BY
修飾子は、ORDER BY
句とは機能が異なります。FACET attribute1 ORDER BY attribute2
の形式に従うクエリを構文解析する場合、New RelicはこれらのクエリをFACET ... ORDER BY
クエリとして読み取りますが、ORDER BY
がFACET
の直後に表示される場合に限定されます。それ以外の場合、ORDER BY
はNew Relicによって句として解釈されます。
JOIN
句を使用して、1つのイベントタイプのデータを共通の属性またはキーに基づくサブクエリの結果と結合します。
FROM Event [INNER|LEFT] JOIN (SELECT... FROM...) ON [key =] key SELECT ...
サブクエリ結合には、簡単なルールがいくつかあります。
JOIN
句は、常にFROM
句の直後に置く必要があります。- 結合タイプ(
INNER
またはLEFT
)の接頭辞はオプションです。省略した場合、結合タイプはデフォルトでINNER
になります。 - サブクエリを含む括弧は、
JOIN
の直後に置く必要があります。 ON
句はサブクエリの直後に置く必要があります。
Join types | |
---|---|
| 結果には、結合されたサブクエリの結果に一致する値を持つ、外部クエリの値のみが含まれます。これはデフォルトの結合タイプです。 |
| 結果には、結合されたサブクエリと一致しない外部クエリのイベントが含まれます。 |
Join | |
---|---|
| サブクエリと外部クエリで比較するキーの値を定義します。使用できる唯一の比較演算子は等価です。
|
| これは、キー識別子が両方のコンテキストで同じ場合の簡略構文です。 |
考慮すべき制限事項:
- 結合されたサブクエリのデフォルトの
LIMIT
は10で、最大LIMIT
は5,000です。外部クエリのLIMIT
は内部クエリに影響を及ぼしません。 - 結合サブクエリでの
TIMESERIES
の使用はサポートされていません。外部クエリでTIMESERIES
を使用する場合、結合されたサブクエリはクエリの全期間に単一の結果を提供することに注意してください。 - すべてのサブクエリと同様に、結合されたサブクエリはアラート条件では使用できません。
SELECT *
は親クエリではサポートされていますが、結合されたサブクエリではサポートされていません。- 結合のカーディナリティは1:100に制限されています。つまり、1つの結合キーはサブクエリ結果の100行以上にマップできません。
JOIN
句の詳細については、NRQLサブクエリ結合チュートリアルを参照してください。
このクエリは、PageView
イベントタイプのbrowserTransactionName
によってファセットされたイベント数を検索し、次にPageAction
イベントタイプのcurrentUrl
によってファセットされたイベント数を検索します。これにより、共通のsession
属性値に基づいて2つのイベントタイプが結合されます。
FROM PageViewJOIN ( FROM PageAction SELECT count(*) FACET session, currentUrl) ON sessionSELECT count(*) FACET browserTransactionName, currentUrl
ファセット
INNER JOIN
の例
この例では、ファセットINNER JOIN
の例と同じデータをクエリしますが、LEFT JOIN
クエリとして、結果にはPageAction
サブクエリの結果に一致するsession
値を持たない項目がPageView
テーブルに含まれます。
FROM PageViewLEFT JOIN ( FROM PageAction SELECT count(*) FACET session, currentUrl) ON sessionSELECT count(*) FACET browserTransactionName, currentUrl
ファセット
LEFT JOIN
の例
ここでは、非集計の行単位サブクエリを実行します。外部クエリでは、PageAction
イベントタイプのcurrentUrl
によってファセットされたイベント数を検索し、次にPageView
イベントタイプのbrowserTransactionNamed
によってファセットされたイベント数を検索します。これにより、共通のsession
属性値に基づいて2つのイベントタイプが結合されます。
session
値34d5ce6acf4c60be
には、サブクエリのPageView
イベントタイプからの2つのbrowserTransactionName
値があり、結果に行が追加されます。
FROM PageActionLEFT JOIN ( FROM PageView SELECT session, browserTransactionName LIMIT MAX) ON sessionSELECT count(*) FACET session, currentUrl, browserTransactionName LIMIT MAX
非集計
INNER JOIN
の例
SELECT ...LIMIT count...
LIMIT
句を使用して、FACET
クエリで返されるファセット値の最大数、またはSELECT *
クエリで返される項目の最大数を制御します。この句は、単一の整数値を引数に取ります。LIMIT
句が指定されない、または値が提供されない場合、リミットのデフォルト設定は、FACET
クエリの場合は10、SELECT *
クエリの場合は100となります。
LIMIT
句で許容される最大値は5,000です。クエリでは、特定の値の代わりにLIMIT MAX
句を使用できます。これにより、デフォルトで現在の最大値が自動設定されます。これを使用すると、将来的に変更される場合でも、常に最大数の結果を投稿できます。クエリの動作を変更しないようにするには、LIMIT MAX
を使用する代わりに明示的な値を指定します。
このクエリはセッション数上位20カ国を表示し、各国のWindowsユーザー限定でレスポンスタイムの95パーセンタイルを提供します。
SELECT uniqueCount(session), percentile(duration, 95)FROM PageView WHERE userAgentOS = 'Windows'FACET countryCode LIMIT 20 SINCE YESTERDAY
SELECT ...LIMIT count OFFSET count...
OFFSET
句とLIMIT
句を使用して、SELECT *
またはSELECT column
クエリによって返される行の一部を制御します。LIMIT
句と同様に、OFFSET
は引数として単一の整数値を取ります。OFFSET
は、クエリで選択された行が返される前に、スキップされる行数を設定します。これはLIMIT
によって制約されます。
OFFSET
行はスキップされ、直近のレコードから開始されます。
たとえば、クエリSELECT interestingValue FROM Minute_Report LIMIT 5 OFFSET 1
は、最新の値を除き、Minute_Report
から最後の5つの値を返します。
ORDER BY
句を使用すると、行でイベント属性を選択するクエリで結果を並べ替える方法を指定できます。
このクエリは、2つの特定のトランザクション属性を期間別に並べ替えます。
FROM Transaction SELECT appName, duration ORDER BY duration
デフォルトの並べ替え順序は昇順ですが、ASC
またはDESC
の修飾子を追加することで変更できます。
このクエリは、すべてのトランザクション属性を期間別の降順に並べ替えます。
FROM Transaction SELECT * ORDER BY duration DESC
重要
ORDER BY
句はFACET
クエリには適用されません。ファセット選択の指針となるFACET ... ORDER BY
句と混同しないでください。詳細については、FACET ... ORDER BY
を参照してください。
SHOW EVENT TYPES...
SHOW EVENT TYPES
は、特定の時間範囲内にアカウントに存在するすべてのデータ型のリストを返します。これは、SELECT
の代わりにクエリの最初の句として使用されます。
重要
この文脈において、「イベントタイプ」はNRQLクエリでアクセス可能なデータ型を指します。
このクエリは、直近1日のすべてのデータ型を返します。
SHOW EVENT TYPES SINCE 1 day ago
SELECT ...SINCE [numerical units AGO | phrase]...
default値は1 hour agoです。
SINCE
句を使用して、返されたデータに対する時間範囲の包括的な開始を定義します。タイムゾーンは結果ではなく、クエリに対して指定できます。NRQLの結果はシステム時間に基づきます。
NRQLを使用する場合、UTCタイムスタンプ、相対時間、またはDateTime
文字列を設定できます。時間の指定を参照してください。
以下も参照してください。
SLIDE BY
句は、スライディングウィンドウと呼ばれる機能をサポートしています。スライディングウィンドウを使用すると、SLIDE BY
データは、互いに重複する時間の「ウィンドウ」に収集されます。これらのウィンドウは、移動集計(移動平均など)が狭い時間枠からの集計よりも重要である場合に、変動の多い折れ線グラフを滑らかにするのに役立ちます。
SLIDE BY
を使用するには、TIMESERIES
句の後のクエリにこの句を配置します。たとえば、このクエリは1分のSLIDE BY
間隔で5分間のウィンドウにデータをプルします。つまり、各ウィンドウは5分間続きますが、ウィンドウ1は0分後に開始し、ウィンドウ2は1分後に開始し、ウィンドウ3は2分後に開始します。
SELECT average(duration) FROM Transaction TIMESERIES 5 minutes SLIDE BY 1 minute
SLIDE BY
をいつ、どのように使用できるかについての詳細は、スライディングウィンドウを使用してよりスムーズなグラフを作成するを参照してください。または、この短いビデオをご覧ください(約3分20秒)。
スライディングウィンドウは、MAX
またはAUTO
と組み合わせて使用できます。ただし、MAX
またはAUTO
をTIMESERIES
とSLIDE BY
の間に配置することはできません。
このクエリは、SLIDE BY
ウィンドウ間隔を自動的に決定します。
SELECT average(duration) FROM Transaction TIMESERIES 5 minutes SLIDE BY AUTO
このクエリは、 SLIDE BY
ウィンドウを最大の間隔粒度に設定します。
SELECT average(duration) FROM Transaction TIMESERIES 5 minutes SLIDE BY MAX
重要
AUTO
またはMAX
によって決定されるSLIDE BY
値は、ウィンドウサイズよりも大きいステップ間隔を生成する可能性があり、ギャップや予期しない結果を引き起こす可能性があります。
SELECT ...TIMESERIES integer units...
TIMESERIES
句を使用して、指定期間単位の時系列としてデータを返します。TIMESERIES
は特定のチャートを表示するために使用されるため、デフォルト値はありません。
時間範囲を指定するには、integer units
を使用します。例:
TIMESERIES 1 minute
TIMESERIES 30 minutes
TIMESERIES 1 hour
TIMESERIES 30 seconds
TIMESERIES
以下の例に示すように、MAX
、AUTO
、SLIDE BY
などの引数と組み合わせると、クエリ結果をさらに調整できます。
重要
average()
またはpercentile()
などの関数では、集計ウィンドウを大きく設定することで、外れ値に対して大幅なスムージング効果が得られます。これは、クエリがスライディングウィンドウを使用するかどうかに関係なく当てはまります。
指定された値は、グラフを分割する単位を示します。たとえば、以下のようにして1日のグラフを30分刻みで表示します。
SELECT ... SINCE 1 day AGO TIMESERIES 30 minutes
TIMESERIES
はAUTO
に設定することもでき、これによってグラフが適切な数の区分に分割されます。たとえば、1日のチャートは30分間隔で分割され、1週間のチャートは6時間間隔で分割されます。
このクエリは、6時間間隔のデータ点で、1週間のクライアントサイドのトランザクションタイムの50パーセントタイルと90パーセンタイルを示す折れ線グラフを返します。
SELECT average(duration), percentile(duration, 50, 90)FROM PageView SINCE 1 week AGO TIMESERIES AUTO
TIMESERIES
をMAX
に設定することで時間枠が自動的に調整され、指定された期間に許可された間隔数を最大にできます。これによって、TIMESERIES
バケットを手動で更新することなく時間枠を更新でき、認められた最大インターバル数に時間枠を分割できます。返されるTIMESERIES
バケットの最大数は366です。
たとえば、以下のクエリでは4分間の間隔を作成していますが、これは1日のチャートの上限となります。
SELECT average(duration) FROM Transaction SINCE 1 day ago TIMESERIES MAX
SELECT ...UNTIL integer units AGO...
UNTIL
句を使用して、クエリする時間範囲の終了を定義します。この値は排他的です。つまり、時間範囲は指定された瞬間までになりますが、その瞬間は含まれません。
default値はNOWです。 UNTIL
は、デフォルト以外の終了点を指定するためのみに使用してください。
以下も参照してください。
WHERE
句を使用して、結果をフィルタリングします。NRQLは、句で指定する条件を満たす結果を返します。
SELECT function(attribute) ...WHERE attribute [operator 'value' | IN ('value' [, 'value']) | IS [NOT] NULL ][AND|OR ...]...
- 複数の条件を指定する場合は、条件を演算子
AND
またはOR
で区切ります。
Operators that the | Description |
---|---|
| NRQLは標準的な比較演算子を受け付けます。例: ブール値を持つ属性の場合、 |
| 2つの条件の論理積を定義するために使用します。 |
| 2つの条件の論理和を定義するために使用します。 |
| 属性がnull値を持つかどうかを判定します。 |
| 属性がnull値を持たないかどうかを判定します。 |
| 属性が |
| 属性が |
| 属性の文字列値が指定したセットに存在するかどうかを判断します。この方法を使用すると、複数の 例:
|
| 属性の文字列値が指定したセットに存在しないかどうかを判断します。この方法を使用すると、複数の 値は括弧で囲み、カンマで区切る必要があります。例:
|
| 属性に指定のサブ文字列が含まれるかどうかを判断します。
以下の点に留意してください。
|
| 属性に指定のサブ文字列が含まれないかどうかを判断します。 |
| 属性に特定のRegexサブ文字列が含まれるかどうかを判断します。RE2構文を使用します。 Examples:
|
| 属性に指定のRegexサブ文字列が含まれないかどうかを判断します。RE2構文を使用します。 |
このクエリは、過去24時間、米国およびカナダ国内のSafariユーザーについて、URLにcheckout
が含まれるページのブラウザレスポンスタイムを返します。
SELECT histogram(duration, 50, 20) FROM PageViewWHERE countryCode IN ('CA', 'US') AND userAgentName='Safari' AND pageUrl LIKE '%checkout%'SINCE 1 day ago
メトリックデータのクエリに関する情報については、メトリクスのクエリを行うを参照してください。
FROM ...WITH function(attribute) AS varSELECT var...
WITH ... AS
句を使用してNRQL環境変数を定義し、クエリ内のどこでも参照できる環境変数として値を格納します。いくつかのルールとヒント:
WITH ... AS
句は、FROM
/SELECT
句の前、間、直後に実行できます。- 環境変数として設定できるのは、行単位の関数(
capture()
など)のみです。集計関数(average()
など)はサポートされていません。 WITH
は1つしか使用できませんが、コンマで区切られている限り、複数のNRQL環境変数を使用できます。- 定義されたNRQL環境変数が既存の属性と同じ名前を使用する場合、環境変数が優先されます。
- 環境変数名に
%
記号を含めることはできません。
重要
イベント対メトリクスルールは、NRQLクエリのWITH ... AS
句をサポートしません。
以下にいくつかクエリを示します。
FROM TransactionWITH duration * 1000 AS millisecSELECT millisec
FROM LogWITH aparse(message, '%itemId":"*","unitPrice":*}%') AS (itemId, unitPrice)SELECT itemId, unitPrice
アンカー解析(aparse()
)の詳細をご覧ください。
この例では、NRQL環境変数unitPrice
を使用して、抽出された文字列を数値に変換する別の環境変数unitPriceNum
を作成します。この環境変数は、SELECT
、WHERE
およびFACET
句で使用されます。
FROM LogWITH aparse(message, '%itemId":"*","unitPrice":*}%') AS (itemId, unitPrice), numeric(unitPrice) AS unitPriceNumSELECT sum(unitPriceNum)FACET itemIdWHERE unitPriceNum < 100
SELECT ... WITH TIMEZONE (selected zone)...
WITH TIMEZONE
句を使用すると、タイムゾーンが未指定のクエリ内で日付や時刻のタイムゾーンを選択できます。
日時にタイムゾーンを指定せずにWITH TIMEZONE
句を含めると、since
句とuntil
句は指定されたタイムゾーンを保持します。
WITH TIMEZONE
句を含めなくても、日時文字列にタイムゾーンを含めると、日時文字列のタイムゾーンが保持されます。
重要
タイムゾーンが指定されていない場合、デフォルトのタイムゾーンは常にUTCです。結果の生のタイムスタンプ値(JSONビューで表示)は常にUTCです。UIには、アカウント設定で指定したタイムゾーンで結果が表示されます。タイムスタンプ文字列のタイムゾーンは常に機能します。これは、WITH TIMEZONE
ゾーンより優先されます。
たとえば、クエリ句SINCE Monday UNTIL Tuesday WITH TIMEZONE 'America/New_York'
は、米国/ニューヨーク時間の月曜日の午前0時から、米国/ニューヨーク時間の火曜日の午前0時までに記録されたデータを返します。
クエリのタイムスパン句の例をいくつか紹介します。
WITH TIMEZONE
句を使用した日時文字列にタイムゾーンがありません。SINCE today UNTIL '2022-05-19T12:00' WITH TIMEZONE 'America/Los_Angeles'これは、
"beginTime": "2022-05-19T07:00:00Z"
と"endTime": "2022-05-19T19:00:00Z"
として解決されます。WITH TIMEZONE
句を使用しない日時文字列のタイムゾーン:SINCE today UNTIL '2022-05-19T12:00-0500'これは、
"beginTime": "2022-05-19T00:00:00Z"
と"endTime": "2022-05-19T17:00:00Z"
として解決されます。夏時間の-0700である米国/ロサンゼルスという
WITH TIMEZONE
句を使用した、日時文字列のタイムゾーン:SINCE today UNTIL '2022-05-19T12:00-0500' WITH TIMEZONE 'America/Los_Angeles'これは、
"beginTime": "2022-05-19T07:00:00Z"
と"endTime": "2022-05-19T19:00:00Z"
として解決されます。
利用可能なゾーンIDのリストを参照してください。
詳細な情報と例については、ダッシュボードとチャートで時間範囲を設定するを参照してください。
メトリックデータをクエリ
メトリックデータはその他のデータ型より複雑です。それをうまくクエリする特定のヒントがあります。メトリックデータには2つの型があり、それぞれに以下の独自のクエリガイドラインがあります。
- ディメンションメトリクスをクエリします。これは、当社のメトリクスAPIとそのAPIを使用するソリューションの一部(たとえば、Dropwizard インテグレーションまたはMicrometerインテグレーション)により報告されます。
- クエリメトリックタイムスライスデータ、当社のAPM、モバイルモニタリング、 によって報告されるオリジナルのメトリックデータ型です。
メトリックデータのレポート方法の詳細は、メトリックデータタイプを参照してください。
関数
このセクションでは、NRQL関数、集計関数と非集計関数の両方について説明します。
集計関数
集計関数を使用して、データをフィルタリング、集計します。以下を使用するためのヒント:
- New Relic Universityのフィルタークエリ、Apdexクエリ、およびパーセンタイルクエリのチュートリアルを参照してください。または、完全なWriting NRQLクエリのオンラインコースにアクセスしてください。
- 同じクエリで集計関数を複数回使用している場合(例:
SELECT median(one_metric), median(another_metric)
)、結果の表示に問題が生じることがあります。この問題を解決するには、AS
関数を使用します。例:SELECT median(one_metric) AS 'med-a', median(another_metric) AS 'med-b' - データ型「型強制」には対応していません。利用可能なデータ型変換関数の詳細を参照してください。
- 時間の経過に伴う結果の表示方法については、時間の経過に伴う結果のグループ化を参照してください。
例:
SELECT histogram(duration, 10, 20) FROM PageView SINCE 1 week ago
aggregationendtime()
関数を使用して、関連集計の時刻を返します。より具体的には、aggregationendtime()
関数は、指定した集計の、集計期間終了のタイムスタンプを提供します。たとえば、時系列クエリでは、1時間分のデータを含むデータポイントの場合、関数はその時間の終わりのタイムスタンプを返します。
apdex
関数を使用して、単一のトランザクションまたはすべてのトランザクションのApdexスコアを返します。デフォルトのApdexスコアは0.5秒です。属性には、duration
またはbackendDuration
などのレスポンスタイムに基づく任意の属性を指定できます。t:
引数は、選択した属性と同じ時間単位でApdex T
閾値を定義します。たとえば、属性が秒単位で測定される場合、t
が秒単位の閾値になります。
apdex()
関数が返すApdexスコアは、実行時間のみに基づくものです。APMエラーは考慮していません。もしトランザクションにエラーが含まれていても、それがApdex T以下で完了する場合、そのトランザクションはapdex ()
関数によって満足と評価されます。
定義済みカスタム属性がある場合は、それらの属性に基づいて絞り込むことができます。たとえば、特に重要な顧客のApdexを監視することができます。
SELECT apdex(duration, t: 0.4) FROM TransactionWHERE customerName='ReallyImportantCustomer' SINCE 1 day ago
name
属性を使用して特定のトランザクションのスコア、またはname
を省略して総合的なApdexを返します。このクエリは、直近1時間のController/notes/indexトランザクションのApdexスコアを返します。
apdex
関数は、あなたのサイトに対するユーザーの満足度を測定するApdexスコアを返します。引数は、秒単位のレスポンスタイムの属性とApdex Tの閾値です。
SELECT apdex(duration, t: 0.5) from TransactionWHERE name='Controller/notes/index' SINCE 1 hour ago
このクエリの例では、直近3週間のアプリケーション全体のApdexを返します。
SELECT apdex(duration, t: 0.08) FROM Transaction SINCE 3 week ago
average()
関数を使用して、属性の平均値を返します。引数として単一の属性名を取得します。属性の値が数字でない場合、集計の際に無視されます。クエリの条件に合うデータが見つからない場合、またはクエリにより数値が返されない場合は、null値を返します。
bucketPercentile()
関数は、Prometheusのhistogram_quantile
関数のNRQL版です。次元メトリックデータとともに使用します。分位数の代わりにNew Relicパーセンタイルを返します。これは分位数*100です。
bucketPercentile()
関数を使用して、Prometheus形式のヒストグラムデータから分位数を計算します。
バケット名を引数として取得し、バケットの境界とともにパーセンタイルをレポートします。
SELECT bucketPercentile(duration_bucket) FROM Metric SINCE 1 day ago
オプションで、引数としてパーセンタイル指定を追加できます。
SELECT bucketPercentile(duration_bucket, 50, 75, 90) FROM Metric SINCE 1 day ago
複数のメトリックスを使用してPrometheusヒストグラムデータを構成しているため、関連する<basename>
に関して特定のPrometheusメトリックスのクエリを行う必要があります。
たとえば、<basename>
prometheus_http_request_duration_seconds
が、NRQLを使用してPrometheusヒストグラムからパーセンタイルを計算するには、bucketPercentile(prometheus_http_request_duration_seconds_bucket, 50)
を使用します。_bucket
がサフィックスとして<basename>
の最後に追加されていることに注意してください。
詳細については、Prometheus.ioドキュメントを参照してください。
cardinality()
関数を使用して、メトリック上のすべてのディメンション(属性)の組み合わせの数を取得します。
次の3つの引数を取りますが、すべてオプションです。
- メトリック名:ある場合は、
cardinality()
は指定したメトリックのみを計算します。 - インクルード:ある場合、Includeリストは濃度計算をこの属性に制限します。
- エクスクルード:ある場合、Excludeリストによりこの属性は濃度計算で無視されます。
cdfPercentage()
は累積分布関数の実装であり、attribute
値のパーセンテージ(値が1以下またはthresholds
を超える)を返します。
cdfPercentage()
attribute
引数に基づいて集計され、数値属性または分布メトリクス属性のいずれかになります。1つのクエリ内の混合型が受け入れられます。他の型(文字列など)は無視されます。最大10個の閾値を指定できます。
このクエリは、firstPaint
が0.5秒以下のイベントの割合と、firstPaint
が1秒以下のイベントの割合を返します。
FROM PageView SELECT cdfPercentage(firstPaint, 0.5, 1.0)
count()
関数を使用して、使用可能レコード数を返します。これは単一の引数を受け入れます (*
、属性、または定数値のいずれか)。現在、一般的なSQL動作に従い、その引数に対する値を持つすべてのレコードを計上します。
count(*)
は特定の属性を示すものではないため、結果はデフォルトの「humanize」形式でフォーマットされます。
derivative()
は、所定のデータセットの変化率を検索します。線形最小二乗回帰を使用して変化率を計算し、微分係数を近似します。この計算では複数のデータポイントの比較が必要であるため、評価範囲にデータポイントが1つしかない場合、解が求められず、結果はnull
値になります。
time interval
は、変化率を計算する期間です。たとえば、derivative(attributeName, 1 minute)
は1分あたりの変化率を返します。
earliest()
関数を使用して、指定された時間範囲における属性の最も古い値を返します。
単一の引数を取ります。
FACET
と併用する場合、この関数は得られた各ファセットの属性の最新値を返します。
このクエリは、PageView
イベントからユーザーエージェントごとに最も古い国コードを返します。
SELECT earliest(countryCode) FROM PageView FACET userAgentName
filter()
関数を使用して、SELECT
文内の集計関数の1つに結果を制限します。filter()
は、FACET
やTIMESERIES
とともに使用できます。フィルターは、次のような複数の異なる集計を選択する場合にのみ役立ちます。
SELECT filter(sum(x), WHERE attribute='a') AS 'A', filter(sum(x), WHERE attribute='b') AS 'B' ...
それ以外の場合は、標準WHERE
句を使用するのが良いでしょう。
funnel()
関数を使用して、ファネルチャートを生成します。属性を最初の引数として取ります。その後、カンマで区切られたWHERE
句(オプションでラベル付け用にAS
句を含める)としてステップを指定します。
詳細な情報と例については、 ファネルのドキュメントを参照してください。
histogram()
関数を使用して、ヒストグラムを生成します。これは、データセットのディストリビューションの可視化に役立ちます。データセットを指定された数のバケットに分割し、各バケットに含まれるデータポイントの数をカウントします。
引数:
attribute
1番目の引数は必須で、各ヒストグラムのバケット範囲内の値をカウントする属性を指定します。width:
サンプル範囲の幅を示します。範囲の最大値は、start
引数値にこのwidth
値を加えた値になります。- 位置引数(ラベルなし)を使用する場合、
width
が2番目の引数になります。 - デフォルト:
10
- 位置引数(ラベルなし)を使用する場合、
buckets:
バケットの合計数(1
~500
の間)。- 位置引数(ラベルなし)を使用する場合、
buckets
が3番目の引数になります。 - デフォルト:
40
- 位置引数(ラベルなし)を使用する場合、
start:
ヒストグラム範囲の開始値。- 位置引数(ラベルなし)を使用する場合、
start
が4番目の引数になります。 - デフォルト:
0
注意
定義されたヒストグラムの範囲外の値は、最初または最後のバケットに含められます。最初のバケット数にはヒストグラム範囲より小さい値が含まれ、最後のバケット数にはヒストグラム範囲より大きい値が含まれます。ヒストグラムの結果からこれらの値を除外するには、クエリのwhere句にフィルターを含めます。(例:
WHERE attribute >= [start] AND attribute <= [start + width]
)このクエリは、40バケットにわたって10秒以内のレスポンスタイムのヒストグラムを生成します。すなわち、各バケットが0.25秒の範囲の値をカバーします。(10/40=0.25)。10秒を超える期間の値は最後のバケットに含められます。期間がゼロ未満になるような場合があれば、その値は最初のバケットに含まれます。
SELECT histogram(duration) FROM PageView SINCE 1 week agoこれらの同様のクエリは、10バケットにわたって5秒以内のレスポンスタイムのヒストグラムを生成します。
SELECT histogram(duration, 5, 10) FROM PageView SINCE 1 week agoSELECT histogram(duration, width: 5, buckets: 10) FROM PageView SINCE 1 week agoこれらの同様のクエリは、3バケットにわたって1~4秒のレスポンスタイムのヒストグラムを生成します。
バケットの構成は次のとおりです。
バケット1
バケット2
バケット3
バケットの範囲
1〜2
2〜3
3〜4
カウントされる値
2未満
2以上3未満
3以上
SELECT histogram(duration, 3, 3, 1)FROM PageView SINCE 1 week agoSELECT histogram(duration, width: 3, buckets: 3, start: 1)FROM PageView SINCE 1 week agohistogram()
Prometheusヒストグラムバケットを受け取ります。SELECT histogram(duration_bucket, 10, 20)FROM Metric SINCE 1 week agohistogram()
ディストリビューションメトリックを入力として受け取ります。SELECT histogram(myDistributionMetric, 10, 20)FROM Metric SINCE 1 week agoFACET
句とともにhistogram()
を使用し、ヒートマップチャートを生成します。SELECT histogram(duration)FROM PageView FACET appName SINCE 1 week ago- 位置引数(ラベルなし)を使用する場合、
keyset()
を使用すると、所定の時間範囲における所定のデータ型に対するすべての属性を表示できます。この関数は引数を取りません。文字列型キー、数値型キー、ブール型キー、およびすべてのキーをグループ化したJSON構造体を返します。
このクエリは、最終日からのPageView
イベントで見つかった属性を返します。
SELECT keyset() FROM PageView SINCE 1 day ago
latest()
関数を使用して、指定された時間範囲における属性の最新値を返します。
単一の引数を取ります。
FACET
と併用する場合、この関数は得られた各ファセットの属性の最新値を返します。
このクエリは、PageView
イベントからユーザーエージェントごとに最新の国コードを返します。
SELECT latest(countryCode) FROM PageView FACET userAgentName
latestrate()
関数を使用して、最後の2つのデータポイントに基づく値の変化率を返します。問題となる属性を最初の引数として受け取り、結果である変化率の時間の単位を2番目の引数として受け取ります。この関数は結果をchange in attribute/time interval
の単位で返します。
この関数は、最先端の傾向を確認するために、属性の最新の変化率を提供するのに役立ちます。
このクエリは、最後の2つのデータポイントに基づいて期間の変化率を返します。1 SECOND
引数であるため、duration/second
の単位で返されます。
SELECT latestrate(duration, 1 SECOND) FROM PageView
max()
関数を使用して、指定された時間範囲内に記録された数値属性の最大値を返します。引数として単一の属性名を取得します。属性の値が数字でない場合、集計の際に無視されます。クエリの条件に合うデータが見つからない場合、またはクエリにより数値が返されない場合は、null値を返します。
median()
関数を利用して、属性の中央値あるいは50パーセンタイルを返します。パーセンタイルクエリの詳細に関しては、percentile()
を参照してください。
ヒント
median()
クエリは、クエリビルダーを利用する場合にのみ利用できます。
このクエリは、中央値に関する折れ線グラフを生成します。
SELECT median(duration) FROM PageView TIMESERIES AUTO
JOIN
句の中央値:
中央値は単に
percentile(attribute, 50)
のショートカットであるため、結合サブクエリからのmedian()
の結果は複合データ型であり、50パーセンタイル値をその計算値にマップします。getField()
関数を使用すると、外部クエリの実際の中央値を参照できます。マップされたキーは二重値の文字列表現であるため、median()
の場合は'50.0'
になります。
min()
関数を使用して、指定された時間範囲内に記録された数値属性の最小値を返します。引数として単一の属性名を取得します。属性の値が数字でない場合、集計の際に無視されます。クエリの条件に合うデータが見つからない場合、またはクエリにより数値が返されない場合は、null値を返します。
percentage()
関数を使用して、いくつかの条件に一致する目的のデータセットの割合を返します。
最初の引数には、目的の属性に対する集計関数が必要です。必ず2つの引数を使用してください(最初の2つ以外の引数は無視されます)。属性が数値でない場合、この関数は100%を値として返します。
FROM Transaction SELECT percentage(count(*), WHERE error is true ) AS 'Error Percent' WHERE host LIKE '%west%' EXTRAPOLATE
percentile()
関数を使用して、所定の指定パーセンタイルでの属性の概算値を返します。この関数は属性が必須であり、パーセンタイル点を表す引数はいくつでも指定できます。percentile()
関数は、小数点以下3桁までの表示を可能にすることで、より厳密な内容を提供できます。パーセンタイルの閾値は小数点値として指定される場合があるものの、大半のデータセットにおいて、互いに0.1よりも近いパーセンタイルは解決されない点に注意してください。
パーセンタイルの表示例
TIMESERIES
を使用して、時系列でマッピングされたパーセンタイルで折れ線グラフを生成します。
TIMESERIES
を省略して、パーセンタイルの集計値を示すビルボードと属性シートを生成します。パーセンタイルが指定されていない場合、デフォルトで95番パーセンタイルとなります。50パーセンタイル値、つまり中央値のみを返すには、
median()
を使用することもできます。このクエリは、5、50、95パーセンタイルの折れ線を表示する折れ線グラフを生成します。
SELECT percentile(duration, 5, 50, 95) FROM PageView TIMESERIES AUTOJOIN
句のパーセンタイル:結合サブクエリでパーセンタイルを使用する場合、サブクエリの結果は複合データ型であり、各パーセンタイルをその計算値にマップします。
getField()
関数を使用して、外部クエリで個々のパーセンタイル値を参照できます。マップされたキーは二重値の文字列表現であるため、整数に.0
を追加する必要があります。たとえば、95パーセンタイル値のキーは'95.0'
です。
predictLinear()
はderivative()
関数の拡張機能です。同様の方法の最小2乗線形回帰を使用して、データセットの将来値を予測します。
time interval
は、クエリでどの程度将来まで扱うかを表します。たとえば、predictLinear(attributeName, 1 hour)
は、1時間の線形予想をクエリの時間枠の将来に当てはめます。- 一般に、
predictLinear()
は、ディスクスペースのような増加が続く値や大きなトレンドの予想などで有用です。 predictLinear()
は線形回帰のため、クエリを行っているデータセットに習熟していると、正確な長期的な予想を行えます。- 指数的または対数的、その他の非線形的に増加するデータセットでは、非常に短期的な予想でのみ有効な可能性が高いと言えます。
- New Relicでは、
TIMESERIES
クエリでpredictLinear
を使用することを推奨していません。これは、各バケットがクエリ内の相対的な期間に基づき個別に予想を行う、つまり、そうしたクエリは時系列終了以後の予想は示さないためです。
rate()
関数を使用して、時間間隔ごとに所定のクエリの頻度またはレートを可視化します。たとえば、1時間の1分あたりのページビュー数や1日間の1時間あたりのサイトのユニークセッション数を把握する必要がある場合があります。
TIMESERIES
を使用して、時系列でマッピングされた評価を示す折れ線グラフを生成します。TIMESERIES
を省略して、時間で平均化された単一の評価値を示すビルボードを生成します。過去6時間にわたる10分あたりのAPMトランザクションのスループット評価を示す折れ線グラフを生成する基本的なクエリを以下に示します。
SELECT rate(count(*), 10 minute) FROM TransactionSINCE 6 hours ago TIMESERIESここでは、さまざまな時間枠でデータを比較するために
rate
を使用する方法を説明する短いビデオ(3分21秒)を紹介します。
stdvar()
関数を使用して、指定された時間範囲内に記録された数値属性の標準分散を返します。
単一の引数を取ります。属性が数値でない場合は、ゼロを値として返します。
sum()
関数を使用して、指定された時間範囲内に記録された数値属性の合計値を返します。
単一の引数を取ります。属性が数値でない場合は、ゼロを値として返します。
uniqueCount()
関数を使用して、指定された時間範囲内に記録された属性のユニーク値の数を返します。
ヒント
クエリのパフォーマンスを最適化するため、この関数は256個以上のユニーク値を検査するクエリのおおよその結果を返します。
uniques()
関数を使用して、指定された時間範囲内に記録された属性のユニーク値のリストを返します。facet
句と共に使用すると、各ファセット値ごとにユニーク属性値リストが返されます。
limit
パラメーターはオプションです。提供されない場合は、ファセットあたり1,000のユニーク属性値のデフォルトlimitが適用されます。最大10,000までの、別のlimit
値を指定できます。uniques()
関数は、limitに達するまで、発見したユニーク属性値の最初のセットを返します。このため、データセットに5,000のユニーク属性値があり、リミットが1,000に設定されている場合は、演算子はその頻度に関わらず、発見した最初の1,000のユニーク値を返します。
クエリ結果で返すことのできる最大数は、uniques()
上限とfacet
上限を掛け合わせたものになります。以下のクエリでは、論理的に返すことができる値の最大数は500万です(5,000 x 1,000)。
クエリするデータセットとクエリの複雑性に応じて、メモリ保護limitで非常に大きなクエリの実行が阻止される場合があります。
From Transaction SELECT uniques(host,5000) FACET appName LIMIT 1000
少数の属性の独自の組み合わせを知りたい場合、SELECT uniques(tuple(x, y, ... z)) ...
形式でクエリを構築することで、値の独自のタプルをすべて取得して、それらの関係を維持することができます。以下のクエリでは、tuple
がindex
とcellName
で一緒に使用され、これらの2つの値が組み合わせで発生する一意の要素を見つけます。
FROM NodeStatus SELECT uniques(tuple(index, cellName), 5)
非集計関数
NRQLクエリ内の非数値データには非集計関数を使用します。
accountId()
関数を使用して、クエリされたデータに関連するアカウントIDを返します。この関数は引数を取りません。以下にいくつかクエリを示します。
このクエリは、返された各Transaction
イベントに関連するアカウントIDを返します。
SELECT accountId() FROM Transaction SINCE 1 day ago
このクエリは、各アカウントIDに関連する最終日のTransaction
イベント数を返します。
SELECT count(*) FROM Transaction FACET accountId() SINCE 1 day ago
このクエリは、アカウントIDが、特に1
、2
、3
のいずれかである最終日のTransaction
イベント数を返します。
SELECT count(*) FROM Transaction WHERE accountId() IN (1,2,3) SINCE 1 day ago
アンカー解析関数、aparse()
を使用して、文字列から特定の値を抽出します。これはcapture()
の代替手段です。
aparse()
次の2つの引数が必要です。
文字列属性
アンカー文字列と抽出文字を含むパターン文字列。たとえば、
www.*.com
を使用して、URLからドメインを抽出できますaparse()
を使用する場合、パターン文字列には、上記のwww.
や.com
のようなアンカーを含めて、目的の抽出文字列(*
で示される)の場所を識別する必要があります。aparse()
はパターン文字列で次の文字を使用します。%
:LIKE
句に表示されているように、非キャプチャワイルドカード*
: 正規表現キャプチャの使用に似たワイルドカードのキャプチャ実際には、アンカー文字列は文字列属性の中央に発生し、先頭や末尾には発生しません。
この場合、
%
のワイルドカードを使用して、不要な値(%www.*.com%
など)を無視します。capture()
と同様に、aparse()
の結果はすべて文字列です。これらの結果を数学関数で使用するには、numeric()
関数でキャストする必要があります。注:
aparse()
は大文字と小文字を区別しません。FROM PageViewSELECT aparse(browserTransactionName, 'website.com/*')文字列の中央から値を抽出するには、パターン文字列の先頭と末尾で非キャプチャワイルドカード
%
を使用します。例:FROM LogSELECT count(*)FACET aparse(string, '%"itemId":"*"%')複数の値を環境変数として抽出する場合は、順序が重要であることに注意してください。例:
FROM LogWITH aparse(string, 'POST: * body: {"itemId":"*","unitPrice":*}\n') AS (url, itemId, unitPrice)SELECT url, itemId, unitPrice環境変数の詳細については、NRQL環境変数を参照してください。
BLOBタイプ属性でblob()
関数を使用して、その属性のBase-64エンコード文字列を返します。
この機能には次の制限があります。
blob()
への呼び出しを含むクエリの最大LIMIT
値は20ですblob()
クエリのWHERE
句では呼び出すことができませんblob()
ファセットクエリや時系列クエリでは使用できませんこれがログでどのように使用されるかについて詳しくは、長いログ(BLOB)内のデータの検索を参照してください。
Base-64でエンコードされたBLOBをデコードするには、
decode()
関数を参照してください。SELECT message, blob(`newrelic.ext.message`)FROM Log WHERE newrelic.ext.message IS NOT NULL
buckets()
関数を使用して、FACET
句ごとに分割されたデータを、範囲に基づきバケットに集計します。New Relicデータベースの数値として保存される属性ごとにバケットにまとめることができます。
この関数は、以下の3つの引数を取ります。
属性名
サンプル範囲の最大値(外れ値は最終バケットに表示されます)
バケットの合計数
詳細と例については、データをバケットに分割を参照してください。
concat()
関数を使用して、引数を連結した結果の文字列を返します。
数値、ブーリアン、タプル、または配列型の引数を20個まで指定できます。Null引数とサポートされていないタイプの引数は無視されます。引数が指定されていない場合、結果は空の文字列になります。
浮動小数点数値を連結する際に含まれる小数点以下の桁数を制限するために、オプションの精度引数を提供することができます。
結果の文字列の長さは最大4096文字です。
このクエリは、1つの文字列として小数点以下2桁とラベルで書式設定されたPageView
イベントから、バックエンドとネットワーク期間を返します。
FROM PageView SELECT concat('Backend Duration: ', backendDuration, ', Network Duration: ', networkDuration, precision: 2)
これにより、次のような形式で回答が返されます。
Backend Duration: 0.69, Network Duration: 0
このクエリは、ユーザーの都市、地域、国で構成される文字列でファセット化された、 PageView
イベントからの平均接続セットアップ時間を返します。
FROM PageView SELECT average(connectionSetupDuration) FACET concat(city, ', ', regionCode, ' ', countryCode) WHERE countryCode IN ('US', 'CA')
convert()
関数を使用して、指定された入力値に対して指定された単位間の単位変換を実行します。
時間、長さ、重量、体積、データの一般的な単位と略語は、OpenTelemetry仕様に合わせてUCUM 標準を使用してサポートされています。便宜上、標準化された略語は、ft_us
、kilobytes
、およびµs
に加えて、ft
などの自然言語の代替手段によって強化されています。
単位では大文字と小文字が区別されます。仕様で大文字が要求されない限り、すべての単位は小文字です。たとえば、データ単位'bits'
はビットに対して有効ですが、'By'
のバイトに対しては大文字のB
が必要です。
最大の時間単位はユリウスyear
で、常に365.25日です。
FROM Transaction SELECT convert(duration, 'ms', 'min') AS durationMin
FROM Product SELECT convert(sum(itemWeight), 'grams', 'lbs')
このクエリでは、イベント自体に文字列属性として単位情報が格納されており、値を秒に標準化したいと想定しています。
FROM Metric SELECT average(convert(apm.mobile.external.duration, unit, 's')) WHERE appName = 'my-application'
capture()
を使用して、RE2構文の正規表現を使用して属性から値を抽出します。
2つの引数が必要です。
属性名
キャプチャ構文を使用した正規表現(NRQLの正規表現はPythonのような構文
r'...'
を使用します)キャプチャする場合は、RE2名前付きキャプチャ構文
...(?P<name> pattern )...
は、指定された名前で、含まれるパターンをキャプチャします。複数の値をキャプチャするには、正規表現で追加のキャプチャグループを指定します。例:
...(?P<name1> pattern1)...(?P<name2> pattern2)...
注:複数の値をキャプチャする場合、各キャプチャ文では最大16個のキャプチャグループ、各NRQLクエリでは最大5個のキャプチャ文を持つことができます。
正規表現キャプチャを使用してクエリ結果を改善する方法をお読みください。
ヒント
正規表現は入力全体と一致する必要があります。キャプチャ式が期待される結果を抽出しない場合は、最初または最後に
.*
が必要かどうかを確認します。これは、部分一致正規表現のパターンです。ただし、部分一致正規表現は、クエリの実行を遅らせることがあります。capture()
を使用して、ダッシュボードの読みやすさを向上する方法を紹介する短いビデオ(3分05秒)もあります。詳しくは、以下の例をご覧ください。
以下では、ウェブサイトのドメイン名を選択し、
https://
とに続くパスを削除します。.com
SELECT capture(pageUrl, r'https://(?P<baseUrl>.*.com)/.+')FROM PageView SINCE 1 day ago以下では、エラーメッセージの最初のワードのみがキャプチャされます。
SELECT capture(errorMessage, r'(?P<firstWord>\S+)\s.+')FROM TransactionWHERE errorMessage IS NOT NULLSINCE 1 hour agoキャプチャしたHTTPメソッドによって、以下がファセットされます。
SELECT count(*) FROM LogWHERE message LIKE '%HTTP%'FACET capture(message, r'.* "(?P<httpMethod>[A-Z]+) .*')以下は、キャプチャされたジョブ名が
ExampleJob
である正規表現と一致するmessage
属性を持つログイベントに基づいて、結果をフィルター処理します。SELECT message FROM LogWHERE capture(message, r'.*Job Failed: (?P<jobName>[A-Za-z]+),.*') = 'ExampleJob'SINCE 10 minutes ago以下では、ログラインからCPU時間の合計をキャプチャします。数学演算を実行するには、明示的に数値にキャストする必要があります。
SELECT sum(numeric(capture(message, r'.*CpuTime:\s(?P<cpuTime>\d+)')))FROM LogWHERE message LIKE '%CpuTime:%' SINCE 1 hour agoこの例では、NRQL環境変数を使用して、ログメッセージからキャプチャした複数の値を格納します。
FROM LogWITH capture(message, r'POST to carts: (?P<URL>.*) body: {"itemId":"(?P<UUID>.*)","unitPrice":(?P<unitPrice>.*)}.*')AS (URL, UUID, unitPrice)SELECT URL, UUID, unitPriceWHERE URL IS NOT NULLNRQL環境変数の詳細については、こちらをご覧ください。
decode()
を使用して、文字列とBLOBに対してBase-64変換を実行します。入力値(最初の引数)は、エンコーディング(2番目の引数)で指定されたBase-64標準を使用してデコードされます。
次の文字列値は、サポートされているエンコードパラメーターです。
「base64」:RFC4648 Base-64標準を使用
「base64mime」:RFC2045 Base-64 標準(MIME)を使用
「base64url」:URLおよびファイル名に安全なアルファベットを用いたRFC4648 Base-64標準を使用
blob()
WHERE
またはFACET
句では許可されないため、BLOBタイプのdecode()
、WHERE
句またはファセットクエリではサポートされません。文字列をエンコードするには、
encode()
関数を参照してください。FROM Span SELECT entity.guid, decode(entity.guid, 'base64')WHERE entity.guid IS NOT NULLFROM Span SELECT count(*)WHERE entity.guid IS NOT NULLFACET entity.guid, decode(entity.guid, 'base64')FROM Span SELECT count(*)WHERE entity.guid IS NOT NULLAND decode(entity.guid, 'base64') NOT LIKE '%APM%'FROM LogWITH blob(`newrelic.ext.message`) AS encodedBlob,decode(encodedBlob, 'base64') AS decodedBlobSELECT encodedBlob, decodedBlobWHERE newrelic.ext.message IS NOT NULLLIMIT 10
dimensions()
関数を使用して、データ型のすべての次元値を返します。
オプションの引数を使用して、以下の特定の属性を明示的に含めたり、除外したりできます。
include
:存在する場合、includeリストの属性はdimensions()
に限定されます。exclude
:存在する場合、dimensions()
の計算ではそれらの属性は無視されます。FROM Metric SELECT count(node_filesystem_size)TIMESERIES FACET dimensions()FACET
句とともに使用する場合、dimensions()
は、未集計クエリでのPrometheusの動作と同様に、イベントタイプで使用できるすべてのファセットについて一意の時系列を生成します。
encode()
を使用して、文字列に対してBase-64変換を実行します。入力値(最初の引数)は、エンコーディング(2番目の引数)で指定されたBase-64標準を使用してエンコードされます。
次の文字列値は、サポートされているエンコードパラメーターです。
「base64」:RFC4648 Base-64標準を使用
「base64mime」:RFC2045 Base-64 標準(MIME)を使用
「base64url」:URLおよびファイル名に安全なアルファベットを用いたRFC4648 Base-64標準を使用
文字列またはBLOBをデコードするには、
decode()
関数を参照してください。encode()
はBLOBではサポートされていません。FROM PageView SELECT session, encode(session, 'base64')
cidrAddress()
関数を使用して、CIDR IPアドレスからベースネットワークアドレスを取得します。
cidrAddress()
次の引数を取ります。
attribute
- IPアドレスそのもの、またはCIDR表記のプレフィックス長を含む文字列値。- これには、文字列属性または引用符で囲まれた文字列リテラルを指定できます
- IPアドレスはIPv4アドレスである必要があります
number
- プレフィックスの長さを表す整数値。- これは、整数属性または整数値です
- 属性パラメーターがCIDR表記である場合、このパラメーターはオプションであり、CIDR文字列で指定されたプレフィックス長よりも優先されます
cidrFormat
- ネットワークアドレス出力をCIDR表記形式にするかどうかを決定するために使用されるオプションのブール値。これはデフォルトでtrueになります。cidrAddress()
関数は、属性パラメーターと数値パラメーターに有効なIPアドレスとプレフィックス長が含まれている限り、値を返します。パラメーター入力が無効な場合、cidrAddress()
null
を返します。次のクエリは、 SyntheticRequestイベントタイプからのほとんどのリクエストを処理しているサブネットを返します。
FROM SyntheticRequest SELECT count(*) FACET cidrAddress(serverIPAddress, 24)これにより、次のような形式で回答が返されます。
Cidr Address of Server IPAddress
Count
10.0.0.0/24
6k
10.10.1.0/24
4k
10.0.14.0/24
1k
このクエリは、10.0.0.0~10.0.0.255のCIDR範囲内に存在する、
serverIPAddress
属性のすべてのIPアドレスを返します。FROM SyntheticRequest SELECT uniques(serverIPAddress)WHERE cidrAddress(serverIPAddress, 24) = '10.0.0.0/24'このクエリは、CIDR範囲10.0.0.0/24または10.10.1.0/24に該当する
serverIPAddress
値を含むレコードを除外しながら、すべてのレコードの数を返します。FROM SyntheticRequest SELECT count(*)WHERE cidrAddress(serverIPAddress, 24) NOT IN ('10.0.0.0/24', '10.10.1.0/24')
...WHERE eventType() = 'EventNameHere'......FACET eventType()...
FACET句でeventType()
関数を使用し、選択したデータ型別に結果を取り出し、またはWHERE句で特定のデータ型に結果をフィルタリングします。これは filter() や percentage() 関数で特定のデータ型を対象とする際に特に便利です。
重要
この文脈において、「イベントタイプ」はNRQLクエリでアクセス可能なデータ型を指します。
このクエリは、合計Transaction
の結果あたりの合計TransactionError
の結果の割合を返します。eventType()
関数を使用して、filter()
関数で特定のデータ型をターゲットにすることができます。
SELECT 100 * filter(count(*), WHERE eventType() = 'TransactionError') / filter(count(*), where eventType() = 'Transaction') FROM Transaction, TransactionError WHERE appName = 'App.Prod' TIMESERIES 2 Minutes SINCE 6 hours ago
このクエリは、各データ型(Transaction
およびTransactionError
)が返すレコード数を表示します。
SELECT count(*) FROM Transaction, TransactionError FACET eventType() TIMESERIES
getField()
関数を使用して、ディメンションメトリックデータなどの複合データ型からフィールドを抽出します。
次の引数を取ります。
メトリックタイプ | サポートされているフィールド |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
例:
SELECT max(getField(mySummary, count)) FROM Metric
SELECT sum(mySummary) FROM Metric where getField(mySummary, count) > 10
getCdfCount()
は累積分布関数の実装であり、threshold
以下のattribute
の値の数を返します。
許可される閾値は1つだけです。Attribute
は、数値属性または分布メトリクス属性のいずれかです。1つのクエリ内の混合型が受け入れられます。
数値型の場合、属性が閾値以下の場合は1を返し、それ以外の場合は0を返します。分布の場合は、分布によって表されるデータセット内のカウントを返します。他のすべての型では、0を返します。
このクエリは、firstPaint
が1秒以下のイベント数を返します。
FROM PageView SELECT sum(getCdfCount(firstPaint, 1.0))
if()
を使用して、クエリ全体でif-then-elseコントロールフロー操作を実行します。
if()
次の3つの引数が必要です。
condition
-true
またはfalse
で評価できる式。trueValue
- ブール式がtrue
の場合、この値が返されます。falseValue
- ブール式がfalse
の場合にこのオプション値が返され、そうでない場合はNULL
が返されます。FROM LogSELECT count(*)FACET if(level_name = 'ERROR', 'ERROR', 'NOT_ERROR')FROM LogSELECT count(*)FACET if(level_name = 'INFO' OR level_name = 'WARNING', 'NOT_ERROR', 'ERROR')ネストされたif()関数を使用して、条件付きロジックを追加します。
FROM Transaction SELECT count(*)FACET if(appName LIKE '%java%', 'Java',if(appName LIKE '%kafka%', 'Kafka', 'Other'))
JSON解析関数jparse()
を使用して文字列値を解析し、NRQLの他のファーストクラスの値型と同様に処理できる値のマップ/リスト(またはネストされた構造)を生成します。
jparse()
次の2つの引数が必要です。
attribute
- JSON文字列値。path
-attribute
パラメーター内のJSONの特定の部分を直接参照するために使用されるオプションの文字列値。以下のJSON解析パス構文リファレンスのセクションを参照してください。jparse()
関数は、RFC 8259形式に従って JSON値を解析します。jparse()
関数をpath
パラメーターなしで使用すると、逆シリアル化されたJSON値が返されます。角括弧を使用すると、キー/インデックスを介して
jparse()
の結果から個々の値を抽出し、WITH
句を使用してJSONキーを属性に直接マッピングできます。Referencing a key
次のクエリは、
jsonString
属性内のキーuserNames
を参照し、['abc', 'xyz']
を返します。WITH '{"userNames": ["abc", "xyz"]}' AS jsonString SELECT jparse(jsonString)[userNames]Referencing an index
次のクエリは、
jsonString
属性内のインデックス0
を参照し、'abc'
を返します。WITH '["abc", "xyz"]' AS jsonString SELECT jparse(jsonString)[0]次のクエリでは、
WITH
句でjparse()
を使用してJSONキーuserName
とid
をNRQL変数にマップし、クエリの残りの部分で使用できるようにします。WITH '{"userName": "test", "unused": null, "id": 100}' AS jsonString, jparse(jsonString) AS (userName, id) SELECT userName, idJSON文字列から特定の値を解析するには、
path
パラメーターを使用できます。JSONデータは、単純ではない形状で複数のレイヤーにネストされるのが一般的です。パス構文を使用すると、JSONデータの特定の部分を直接参照できます。
データ例:
{"valueA": "test","valueB": {"nestedValue1": [1, 2, 3],"nestedValue2": 100},"valueC": [{ "id": 1, "label": "A", "other": 7 },{ "id": 2, "label": "B", "other": 9 },{ "id": 3, "label": "C", "other": 13 }]}上記のデータを使用したパス構文の例:
Path Syntax Example
Result Description
Result
valueA
キーの値を返します
"test"
["valueA"]
キーの値を返します
"test"
[valueA, valueC]
キー値のリストを返します
["test", [{"id": 1…}, {"id": 2…}], {"id": 3…}]]
valueB.nestedValue2
キーの値を返します
100
valueC[0]
インデックス
0
のリスト値を返します。{"id": 1…}
valueC[0,2]
インデックス
0
および2
のリスト値を返します。[{"id": 1…}, {"id": 3…}]
valueC[0:2]
2番目のインデックスの値を除いた、最初のインデックスから2番目までのリスト値の範囲を返します。この場合、インデックス
0
と1
のリスト値が返されます。[{"id": 1…}, {"id": 2…}]
valueC[:2]
2番目のインデックスの値を除いた、先頭から2番目のインデックスまでのリスト値の範囲を返します。この場合、インデックス
0
と1
のリスト値が返されます。[{"id": 1…}, {"id": 2…}]
valueC[:-2]
最後のnを除くすべてのリスト値を返します。ここで、nはコロンの後の負の数です(つまり
[:-n]
)。この場合、インデックス0
のリスト値が返されます。[{"id": 1…}]
valueC[1:]
指定されたインデックスからリストの末尾までのリスト値の範囲を返します。この場合、インデックス
1
と2
のリスト値が返されます。[{"id": 2…}, {"id": 3…}]
valueC[-1:]
*最後のn個のリスト値を返します。ここで、n*はコロンの前の負の数です(つまり、
[-n:]
)。この場合、インデックス2
のリスト値が返されます。[{"id": 3…}]
valueC[*]
すべてのリスト値を返します
[{"id": 1…}, {"id": 2…}, {"id": 3…}]
valueC[*].id
すべてのリストメンバーから指定されたキー値を返します。この場合、「
id
」キーの値です。[1, 2, 3]
valueC[*]["label", "other"]
すべてのリストメンバーから指定されたキーを返します。この場合、「
label
」キーおよび「other
」の値です。[["A", 7],…]
例:
次のクエリは、
jsonString
属性内のJSON文字列を解析します。WITH '{"user": {"name": "John", "id": 5}}' AS jsonString SELECT jparse(jsonString)このクエリは、逆シリアル化されたJSON文字列を返します。
{ "user": { "name": "John", "id": 5 } }よくある問題は、ログメッセージ内に構造化された豊富なデータが隠れていることです。
aparse()
とjparse()
を利用してノイズを取り除き、特定の値を見つけることができます。次のクエリ:
aparse()
を呼び出して、logMessage
属性からJSONデータを抽出します。jparse()
とuser.name
パスパラメーターを使用して、抽出されたJSONデータからuser.name
フィールドを解析します。WITH '1693242121842: value=\'{"user": {"name": "John", "id": 5}}\', useless=stuff' AS logMessage, aparse(logMessage, '%: value=\'*\'%') AS jsonString SELECT jparse(jsonString, 'user.name')
次のクエリは、
jsonString
属性内のオブジェクトのリストから各id
フィールドを解析し、これらの値を配列として出力します。WITH '{"users": [{"name": "A", "id": 5}, {"name": "B", "id": 10}]}' AS jsonString, jparse(jsonString, 'users[*].id') AS ids SELECT ids上記のクエリは
[5, 10]
を返します。関連関数:
mapKeys()
、mapValues()
length()
関数を使用して、文字列値の長さまたは配列値の要素数を返します。
単一の引数を取ります。
このクエリは、PageView
イベントから各URL文字列の長さを返します。
SELECT length(pageUrl) FROM PageView
ルックアップテーブルをアップロードした場合、テーブル名でこの機能を使用すると、クエリ内テーブルのデータにアクセスできます。クエリの例を以下に示します。
FROM LogSELECT count(*)WHERE hostname IN (FROM lookup(myHosts) SELECT uniques(myHost))
詳細については、ルックアップテーブルデータのクエリ方法を参照してください。
lower()
関数を使用して、文字列値のアルファベット文字をすべて小文字に変更します。
引数:
str
- 小文字にする文字列値。- これは、引用符内のリテラル文字列、クエリされた文字列属性、文字列を返す関数、または単一の文字列値を返すサブクエリなどの文字列に評価されるものなら何でもかまいません。
- この引数がnullと評価される場合は、
lower()
関数はnullを返します。
関連機能:
upper()
attribute
パラメーター内の入力としてマップが指定された場合、mapKeys()
関数を使用してキーのリストを返します。
WITH '{"userResult1": 100, "userResult2": 200, "userResult3": 4}' AS jsonString SELECT mapKeys(jparse(jsonString)) AS keys
上記のクエリ:
jparse()
関数を使用して、jsonString
属性内のJSON文字列をマップに逆シリアル化するmapKeys()
関数を呼び出して、このマップ内のすべてのキーのリストを抽出する- このキーのリストを
keys
属性にバインドする
上記のクエリを実行すると、keys
にはリスト['userResult1', 'userResult2', 'userResult3']
が含まれます。
WITH '{"value1": "test", "value2": {"nestedValue1": [1, 2, 3], "nestedValue2": 100}}' AS jsonString SELECT mapKeys(jparse(jsonString)) AS keys
上記のクエリは、jsonString
属性内のJSON文字列から最も外側のキーのみを抽出します。クエリを実行すると、keys
にはリスト['value1', 'value2']
が含まれます。
attribute
パラメーター内の入力としてマップが指定された場合、mapValues()
関数を使用して値のリストを返します。
WITH '{"userResult1": 100, "userResult2": 200, "userResult3": 4}' AS jsonString SELECT mapValues(jparse(jsonString)) AS values
上記のクエリ:
jparse()
関数を使用して、jsonString
属性内のJSON文字列をマップに逆シリアル化するmapValues()
関数を呼び出して、このマップ内のすべての値のリストを抽出する- この値のリストを
values
属性にバインドする
上記のクエリを実行すると、values
にはリスト[100, 200, 4]
が含まれます。
WITH '{"value1": "test", "value2": {"nestedValue1": [1, 2, 3], "nestedValue2": 100}}' AS jsonString SELECT mapValues(jparse(jsonString)) AS values
上記のクエリは、jsonString
属性内のJSON文字列から最も外側の値を抽出します。クエリを実行すると、values
には"test"
文字列とネストされたオブジェクトのリストが含まれます。
これはJSONビューで確認できます。
"contents": [ { "function": "alias", "alias": "values", "contents": { "constant": [ "test", { "nestedValue1": [ 1, 2, 3 ], "nestedValue2": 100 } ] } }],
minuteOf()
関数を使用して、有効なタイムスタンプ値を持つ属性の分の部分(つまり、0〜59分)のみを抽出します。これは、hourOf()
、weekOf()
などの関数でも機能します。時間ベースの関数の完全なリストについては、時間範囲で結果をグループ化のドキュメントの表を参照してください。
与えられた数値属性の値(最初の引数、すなわち被除数)を数値(2つ目の引数、すなわち除数)で割った後、mod()
関数を使用してfloor係数を返します。このモジュロ演算は、WHERE
句の条件内で使用して結果の任意のサブセットにフィルターしたり、FACET
句で結果セットをさらに分割したりする方法として使用できます。
FROM Transaction SELECT * WHERE mod(port, 2) = 1
FROM NrConsumption SELECT uniques(hostId, 10000) SINCE 1 day AGO FACET mod(hostId, 10)
position()
関数を使用して、文字列内の部分文字列の位置を見つけます。一致では大文字と小文字が区別されます。
引数:
str
- 部分文字列を検索する文字列。- これは、引用符内のリテラル文字列、クエリされた文字列属性、文字列を返す関数、または単一の文字列値を返すサブクエリなどの文字列に評価されるものなら何でもかまいません。
substr
- 文字列内で検索する文字列。occurrence
- 部分文字列の出現する位置を返します。デフォルト:
0
正の場合、ゼロベースで文字列の先頭からn番目に出現する部分文字列を検索します。
負の場合、文字列の末尾からn番目に出現する部分文字列を検索します。最後に出現する部分文字列は-1になります。
Alias:
indexOf(str, substr [, occurrence])
-indexOf()
はposition()
関数の代替名です戻り値:
文字列内での部分文字列の開始文字の0ベースのインデックス
strがnull、substrがnull、または参照されたsubstrが見つからない場合は、Nullが返されます。
このクエリは、
position()
関数を使用して文字列内のさまざまな部分文字列の位置インデックスを検索する方法を示します。ここでは、position()
関数の引数内でのsubstring()
関数の使用も示します。FROM PageViewWITH position(pageUrl, ':') AS FirstColon,position(pageUrl, '/', 1) + 1 AS DomainBegin,position(pageUrl, '/', 2) AS DomainEnd,DomainEnd - DomainBegin AS DomainLengthSELECT pageUrl, FirstColon, substring(pageUrl, 0, FirstColon) AS Protocol,DomainBegin, DomainEnd, DomainLength, substring(pageUrl, DomainBegin, DomainLength) AS Domain,position(pageUrl, '/', -1) AS LastSlash,substring(pageUrl, position(pageUrl, '/', -1)) AS PathEndposition(str, substr [, occurrence])
例
round()
関数を使用して、属性の丸め値を返します。
オプションで、round()
は2番目の引数to_nearest
を取り、最初の引数を2番目の引数の最も近い倍数に切り上げます。to_nearest
は分数にすることができます。
SELECT round(n [, to_nearest])
stddev()
関数を使用して、指定された時間範囲内に記録された数値属性の標準偏差値を返します。単一の引数を取ります。属性が数値でない場合は、ゼロを値として返します。
string()
関数を使用して、数値、ブーリアン値、タプル値、または配列値を文字列値に変換します。
次の2つの引数を取り、1つはオプションです。
属性名
精度:存在する場合、浮動小数点数値を変換する際に含まれる小数点以下の桁数に制限を適用します。
このクエリは、PageView期間を小数第2位までの文字列として返します。
FROM PageView SELECT string(duration, precision: 2)このクエリは、PageView期間の平均を小数第2位までの文字列として返します。
FROM PageView SELECT string(average(duration), precision: 2)string()
を使用して、小数点以下の桁数を失うことなく浮動小数点値でファセットします。FROM PageView SELECT count(*)FACET string(tuple(asnLatitude, asnLongitude), precision: 2)
substring()
関数を使用して文字列の一部を抽出します。
引数:
str
- 部分文字列を抽出する文字列。- これは、引用符内のリテラル文字列、クエリされた文字列属性、文字列を返す関数、または単一の文字列値を返すサブクエリなどの文字列に評価されるものなら何でもかまいません。
- この引数がnullと評価される場合は、
substring()
関数はnullを返します。
start
- 抽出を開始する文字列内の位置。- 文字列の最初の文字位置は0です。
- 負の値は、文字列の末尾の文字位置が-1で、文字列の末尾に相対的な位置を検索します。
- startが文字列の長さより長いか等しい場合、
substring()
関数は空の文字列を返します。 - startが負で、その絶対値が文字列の長さより長い場合、抽出された部分文字列の位置は0から開始されます。
length
- 文字列から抽出する部分文字列の長さまたは文字数。- オプション - 長さが指定されていない場合、解決された開始位置の後の文字列のすべての文字が含まれます。
position()
とsubstring()
を一緒に使用する例については、position()
関数を参照してください。
toDatetime()
関数を使用して、タイムスタンプを書式設定されたdatetime文字列に変換します。
toDatetime()
次の引数を取ります。
timestamp
- datetime文字列に変換される数値タイムスタンプ。これは数値または属性にすることができ、内部的にlong
に変換されます。pattern
- 結果のフォーマットに使用されるオプションの日時パターン。パターン文字列の構築方法については、DatetimeFormatterドキュメントの書式設定と解析のパターンのセクションを参照してください。- これは定数文字列値である必要があり、パターンが指定されていない場合はデフォルトの
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
になります
- これは定数文字列値である必要があり、パターンが指定されていない場合はデフォルトの
timezone
- datetime文字列を解釈するために使用されるオプションのタイムゾーン値(例:UTC)。- これは定数文字列値である必要があり、デフォルトはUTC、または利用可能な場合は
WITH TIMEZONE
で指定された値になります
入力が有効な数値である限り、
toDatetime()
関数は常に値を返します。Alias:
fromTimestamp()
はtoDatetime()
関数の代替名です。例:
次のクエリは、デフォルトのパターン
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
を使用してtimestampValue
属性を変換します。これにより、datetime文字列1970-01-01T00:20:34.567Z
が返されます。WITH 1234567 AS timestampValue SELECT toDatetime(timestampValue)次のクエリは、タイムゾーンが「America/Los_Angeles」に設定されたパターン文字列
yyyy-MM-dd
を使用して、timestampValue
属性を変換します。これにより、datetime文字列1969-12-31
が返されます。WITH 1234567 AS timestampValue SELECT toDatetime(timestampValue, 'yyyy-MM-dd', timezone:'America/Los_Angeles')次のクエリは、
WITH TIMEZONE
句で指定されたタイムゾーンを使用してtimestampValue
属性を変換します。これにより、datetime文字列1969-12-31
が返されます。WITH 1234567 AS timestampValue SELECT toDatetime(timestampValue, 'yyyy-MM-dd') FROM Event WITH TIMEZONE 'America/Los_Angeles'- これは定数文字列値である必要があり、デフォルトはUTC、または利用可能な場合は
toTimestamp()
関数を使用して、datetime文字列からタイムスタンプをエポックミリ秒単位で解析します。
toTimestamp()
次の引数を取ります。
datestring
- タイムスタンプ(エポックミリ秒)に変換されるdatetime文字列。これには、文字列属性または引用符で囲まれた文字列リテラルを指定できますpattern
- datestringパラメーターの解析に使用されるオプションの日時パターン。パターン文字列の構築方法については、DatetimeFormatterドキュメントの書式設定と解析のパターンのセクションを参照してください。- これは定数文字列値である必要があり、パターンが指定されていない場合はデフォルトの
yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX]
になります
- これは定数文字列値である必要があり、パターンが指定されていない場合はデフォルトの
timezone
- datestringパラメーターを解釈するために使用されるオプションのタイムゾーン値(例:PST)。- これは定数文字列値である必要があり、デフォルトはUTC、または利用可能な場合は
WITH TIMEZONE
で指定された値になります
Alias:
fromDatetime()
はtoTimestamp()
関数の代替名です。ヒント
見つかった文字列が指定されたパターンと一致しない場合は、
null
が返されます。さまざまなパターンのdatetime文字列がある場合は、OR
を使用して値の 1 つがnull以外になるまでカスケードすることにより、結果を結合できます。オプションのパターンセグメントを使用することもできます。デフォルトのパターンでは、角括弧を使用して、ミリ秒とゾーンオフセットの部分をオプションにします。シナリオ
詳細
サンプルパターン
サンプル日時
解決後
タイムゾーンがありません
タイムゾーン引数、または
WITH TIMEZONE
値を使用します。デフォルトはUTC
です。yyyy-MM-dd HH:mm:ss.SSS
2023-10-18 15:27:03.123
2023-10-18T15:27:03.123Z
日時フィールドがありません
欠落している時刻フィールドは0に置き換えられます。欠落している日付フィールドは1に置き換えられます。フィールドが存在する場合は、より優先順位の高いフィールドもすべて存在する必要があります。
注:日付と四半期のパターンがサポートされています。yyyy-MM-dd HH:mm:ss
2023-10-18 15:27:03
2023-10-18T15:27:03.000Z
yyyy-MM-dd HH:mm
2023-10-18 15:27
2023-10-18T15:27:00.000Z
yyyy-MM-dd HH
2023-10-18 15
2023-10-18T15:00:00.000Z
yyyy-MM-dd
2023-10-18
2023-10-18T00:00:00.000Z
yyyy 'day' D
2023 day 291
2023-10-18T00:00:00.000Z
yyyy-MM
2023-10
2023-10-01T00:00:00.000Z
yyyyqqq
2023 Q4
2023-10-01T00:00:00.000Z
yyyy
2023
2023-01-01T00:00:00.000Z
時間のみ
日付なしで時刻パターンが使用された場合、ミリ秒単位のUnixタイムスタンプが計算されます。
注:タイムゾーンの調整は引き続き適用されます。HH:mm
00:30
1971-01-01T00:30:00.000Z
HH:mm O
00:30 GMT-1
1971-01-01T01:30:00.000Z
HH:mm O
00:30 GMT+1
1969-12-31T23:30:00.000Z
12時間
12時間パターン(小文字のh)が使用される場合は、am/pmのパターン(a)も使用する必要があります。
注:datetime文字列内ではAM/PMは大文字である必要があります。yyyy-MM-dd h:mm a
2023-10-18 3:27 PM
2023-10-18T15:27:00.000Z
yyyy-MM-dd h:mm
2023-10-18 3:27
サポートされていないパターン
yyyy-MM-dd h:mm a
2023-10-18 3:27 pm
null(pmが小文字のため)
フィールドの優先順位
フィールドが存在する場合は、より優先順位の高いフィールドもすべて存在する必要があります。
yyyydd
2023 18
サポートされていないパターン(ddは月の日であり、月が欠落しています)
例:
次のクエリは、デフォルトのパターン
yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX]
を使用して、datetime文字列「2023-10-18T15:27:03.123Z」を解析します。これにより、タイムスタンプ値1697642823123
が返されます。SELECT toTimestamp('2023-10-18T15:27:03.123Z')FROM Event次のクエリは、タイムゾーンを「America/Los_Angeles」に設定してdatetime文字列「2023-11-03 11:00:32」を解析します。これにより、タイムスタンプ値
1699034432000
が返されます。SELECT toTimestamp('2023-11-03 11:00:32', 'yyyy-MM-dd HH:mm:ss', timezone:'America/Los_Angeles')FROM Event次のクエリは、
WITH TIMEZONE
句で指定されたタイムゾーンを使用して、datetime文字列「2023-11-03 11:00:32」を解析します。これにより、タイムスタンプ値1699034432000
が返されます。SELECT toTimestamp('2023-11-03 11:00:32', 'yyyy-MM-dd HH:mm:ss')FROM Event WITH TIMEZONE 'America/Los_Angeles'重要
UIは、
toTimestamp()
値をタイムスタンプとして自動的に検出し、日時値としてフォーマットします。実際の数値タイムスタンプを表示するには、toTimestamp()
関数をstring()
関数でラップします。- これは定数文字列値である必要があり、デフォルトはUTC、または利用可能な場合は
upper()
関数を使用して、文字列値のアルファベット文字をすべて大文字に変更します。
引数:
str
- 大文字にする文字列値。これは、引用符内のリテラル文字列、クエリされた文字列属性、文字列を返す関数、または単一の文字列値を返すサブクエリなどの文字列に評価されるものなら何でもかまいません。
この引数がnullと評価される場合は、
upper()
関数はnullを返します。関連関数:
lower()
データ型変換
NRQLは「型強制」をサポートしていません。つまり、文字列として保存されたフロートは文字列として取り扱われ、フロート値を要求する関数に渡しても操作できません。
以下に示す関数で、数値を伴う文字列、または文字列を伴うブーリアン値を同等の数値またはブーリアン値に変換したり、文字列以外の値を文字列値に変換したりできます。
numeric()
関数を使用して、文字列形式の数値を数値に変換します。この関数は、クエリ結果に数学関数を使用するクエリ、またはaverage()
などのNRQL集計関数に組み込むことができます。boolean()
関数を使用して、"true"
または"false"
の文字列値を対応するブーリアン値に変換します。string()
関数を使用して、数値、ブーリアン値、タプル値、または配列値を文字列値に変換します。詳細については、上記のstring()
を参照してください。
コメント
NRQLクエリを記述する際にコメントを追加すると、チームメンバーがクエリをさらに理解して使用できるようになります。
構文の詳細は以下のとおりです。
--
2つのダッシュは、同じ行にあるこのインジケーターの右側にあるすべてのテキストをコメントアウトします。//
2つのスラッシュは、同じ行にあるこのインジケーターの右側にあるすべてのテキストをコメントアウトします。/* */
これらの文字セットの間にあるテキストはすべてコメントアウトされます。このインジケーターは複数の行に適用できます。
コメントはどこにでも表示されるわけではありません。「最近のクエリ」や「クエリを表示」などの一部のビューにはコメントは表示されません。
コメントを含むクエリの例:
FROM Transaction SELECT uniqueCount(appId) -- This will return the number of unique App IDs
FROM TransactionErrorSELECT count(*) SINCE 1 day ago // Transaction Error for the past day
FROM TransactionTrace /* This data may be incomplete;If so, run a query of Transaction */SELECT count(*)
関連ドキュメント
NRQL構文とルールを理解するためのその他の人気リソースには、以下が含まれます。
- New Relic UniversityのNRQL教育コース
Metric
データ型のクエリ方法を習得- サブクエリを使用
- ファネルを使用して一連の関連データを評価する