Analytics の関数
関数は、SELECT 句の引数として機能します。ADQL の関数タイプは次のとおりです。
- メトリック関数
- バケット関数
- 文字列関数
- ファネル関数
- データ型変換関数
- 他の関数を変更する関数
多くの関数では、数値フィールドのみ有効です。「すべての」データ型とは、整数、浮動小数点、日時、および文字列を意味します。
関数は、ゼロまたは空のデータフィールドによる整数除算の結果の NULL 値など、NULL 値を無視します。
WHERE 句をクエリに追加するには、コントローラ分析検索 UI の [データ(data)] タブのクエリボックスを使用します。検索を実行すると、テーブルウィジェットの [可視化(visualization)] タブにメトリック関数の結果が表示されます。
次の各セクションで、関数のタイプについて 1 つずつ説明します。
メトリック関数
メトリック関数:
- フィールドの値のセットに対して計算を実行します。
- カウントや合計など 1 つの結果、またはパーセンタイルなどの結果のセットを返します。
- SELECT 句内でのみ使用できます。
- フィールド名が存在する場合は常にそれをフォローします。存在しない場合は、一部の視覚化が機能しない場合があります。
| 機能 | 戻り値 | 有効なフィールドタイプ | ADQL クエリの例 |
|---|---|---|---|
| avg(numeric_field_name) |
数値フィールドの平均値。 | 整数、浮動小数点、日時 |
SELECT |
| count(field_name) |
イベントの数。 |
all count(*) という形式も有効です。 |
SELECT 次のクエリは、アプリケーションに HTTP 要求を送信している上位 10 個の IP アドレスを返します。
|
| distinctcount(field_name) |
フィールドに対して記録された一意の値の数。 | all | SELECT distinctcount(field_name) FROM logs |
| max(numeric_field_name) |
数値フィールドの最大記録値。 |
整数、浮動小数点、日時 1 つのフィールドのみを指定します。 |
(numeric_field_name) max nodeName, |
| min(numeric_field_name) |
数値フィールドの最小記録値。 |
整数、浮動小数点、日時 1 つのフィールドのみを指定します。 | min(numeric_field_name) transactions |
| stdev(numeric_field_name) |
数値フィールドの母集団標準偏差。 | 整数、浮動小数点 | SELECTstdev (numeric_field_name)FROMtransactions |
| sum(numeric_field_name) |
数値フィールドの値の合計。 |
整数、浮動小数点、日時 1 つのフィールドのみを指定します。 | SELECT sum(numeric_field_name) FROM transactions |
| percentile(numeric_field_name, percent) |
0 ~ 100 の間の指定したパーセンタイル値 |
整数、浮動小数点、日時 1 つまたは複数のパーセンタイルを指定します。 | SELECT percentile(responseTime, 50, 75, 90, 95) FROM transactions |
| stats(numeric_field_name) |
フィールドの統計:count,min,max,average,sum | 整数、浮動小数点、日時 | SELECT stats(numeric_fieldName) FROM transactions WHERE application='yourApp' |
| totalResultCount() | イベントの合計数。 | フィールドを受け入れません。 |
次のクエリでは、最初に「ECommerce」アプリケーションのすべてのエラートランザクションを選択します。次に、一意のトランザクション名ごとに、そのトランザクション名のインスタンス数とエラートランザクションの合計数の比率を計算します。(所定のトランザクション名を複数のエラートランザクションに表示できることを前提としています。)
SELECT |
バケット関数
SELECT series(eventTimestamp, '1h'), count(*) FROM transactions WHERE application='yourAppName'
結果の大規模なデータセットを含めるには、Controller Analytics Search UI の右上隅にある時間範囲セレクタを使用します。
日付は日時値とは異なります。次のように週からミリ秒までの単位がサポートされています。
- 「1w」 (1 週間)
- 「10d」(10 日間)
- 「2h」 (2 時間)
- 「5m」(5 分間)
- 「36s」(36 秒)
- 「800ms」(800 ミリ秒)
バケットを定義するために日付を使用する場合は、定義によって生成されるバケットの数を考慮してください。series() のバケット数は 2000 を超えることはできず、これよりもずっと少ない数のバケットが標準です。
| 機能 | 戻り値 | 有効なフィールドタイプ | ADQL クエリの例 |
|---|---|---|---|
range(field_name, n|(n1, n2), n3|(n4, n5), ...) |
1 つ以上のバケット。 |
整数、浮動小数点、日付 単一の値 x(x,y)を使用します バケットの定義方法の詳細については、以下を参照してください。 |
次に range クエリの例を示します。 range SELECT |
series(field_name, interval_size) series(field_name, interval_size, lower_extended_bound, upper_extended_bound, [offset],[rangeStyleBucketKeys],[strictEndpoints]) 範囲を指定すると、すべてのバケットが返されるか、空になるか、または返されません。 範囲を指定しない場合は、次のようになります。
|
指定した間隔に基づく一連のバケット。 |
整数、浮動小数点、日付 数値フィールドでは、間隔を整数として指定します。 オプションのキーワード引数 offset、 rangeStyleBucketKeys、および strictEndpointsの説明については、以下を参照してください |
SELECT SELECT |
range() のバケットの定義
各バケットは、2 つの単一値による範囲として定義されます。バケットには最初の値が含まれ、2 番目の値は除外されます。
値のペア(x、y)によって、x(この値は含まれる)から y(この値は含まれない)までの明示的なバケットが定義されます。
単一値では、range() の引数間のどこに値が配置されているかに基づいたルールに従いバケットが暗黙的に定義されます。
- バケットを定義する単一値を使用するためのルールは次のとおりです。
- フィールドの直後(つまり、2 番目の引数として):バケットは負の無限大で始まります。
- 別の単一値の後:バケットは前の引数(この引数は含まれる)から開始され、x (これは含まれない)まで拡張されます。
- 値のペアの後、かつ別の単一値の前:バケットは x(これは含まれる)から開始され、次の引数(これは含まれない)まで拡張されます。
- パラメータリストの末尾:バケットは正の無限大で終わります。これは、x が 2 つの引数の 2 番目であるという前提の例外の 1 つです。
- 2 つの値のペアの間:バケットを定義できず、値は無視されます。
range クエリの例
ここでは、上記のルールのほとんどを実行する range クエリを示します。
SELECT range(segments.transactionTime, 0, (10, 20), 30, (40, 50), 60, 70) FROM transactions
クエリによって、次のバケットが生成されます。
- [-Inf, 0]:ルール a が 0 に適用されるため
- [10, 20]:(10, 20) によってこのバケットが明示的に定義されるため
- 30 に対してはバケットなし:ルール e が適用されるため、30 は無視されます
- [40, 50]:(40, 50) によってこのバケットが明示的に定義されるため
- [60, 70]:ルール c が 60 に適用されるため
- [70, +Inf]:ルール d が 70 に適用されるため
series()のオプションのキーワード引数: offset 、rangeStyleBucketKeys、および strictEndpoints
series は、次のオプションのキーワード引数をサポートしています。
offset
指定の正(+)または負(-)のオフセット期間によって各 series の開始値を 0 から変更します(1 時間の場合は 1h、1 日の場合は 1d など)。値 alignStart および alignEnd によって、拡張範囲引数の先頭と末尾にそれぞれバケットを配置します。この関数には、これらの特別な値を使用するために指定された拡張範囲が必要です。デフォルトは 0 です。整数と文字列の両方の値を受け入れます。
例
SELECT series(responseTime, 1, 1, 10, offset="alignStart"), count(*) FROM transactions
SELECT series(responseTime, 100, 1, 1000, offset=1), count(*) FROM transactions
rangeStyleBucketKeys
数値シリーズの開始値と終了値を文字列型として「bucketStart - bucketEnd」形式に変換します。たとえば、「0-10」、「10-20」などです。この引数が返すこの出力は、range 関数によって返されたものと似ています。このキーワード引数を使用するには、series 関数を数値型で動作させる必要があります。デフォルトは false です。ブール値のみを受け入れます。
例:
SELECT series(responseTime, 100, 1, 1000, rangeStyleBucketKeys=true), count(*) FROM transactions
strictEndpoints
クエリにフィルタを追加し、最小の拡張範囲で開始し、最大の拡張範囲まで拡張します。これにより、拡張範囲外のバケットは結果に存在しなくなります。デフォルトは false です。ブール値のみを受け入れます。拡張範囲によって、ヒストグラム集約で、特定の最小値に基づいて間隔の作成が開始され、所定の最大値まで間隔が拡張されます。
例:
SELECT series(responseTime, 2, 1, 5, strictEndpoints=true, rangeStyleBucketKeys=true), count(*) FROM transactions
時系列クエリでの上位 n 件の結果の選択
導入サポート
上位 n 件の結果は、SaaS デプロイでのみ使用できます。
SELECTseries(eventTimestamp, '1m'), transactionName, count(*) FROM transaction LIMIT 1, 12。series 関数は、期間全体にわたって全体の上位 n 件を計算できます。上位 n 件の制限を設定するには、クエリの末尾に LIMIT 句を追加します。
- series 関数の前に選択が含まれる:SELECT application,
series(eventTimestamp, '1m'), transactionName, ... - 追加のバケット関数がある:SELECT
series(eventTimestamp, '1m'),range(responseTime, 0, 60, 120), transactionName, ... - HAVING 句が含まれる:SELECT
series(eventTimestamp, '1m'), transactionName,avg(responseTime), ...HAVING a >15
文字列関数
ADQL 文字列操作関数:
- SQL の対応物に似ています。
- 大文字と小文字が区別されます。
- 引数が NULL の場合、NULL を返します。
- 0 ベースではなく、1 ベースのインデックス作成を使用します。
- たとえば、
indexOf()関数は、文字列の最初の文字のインデックスを 0 ではなく 1 として指定します。 - このため、0 は整数引数の有効な値ではありません。
- たとえば、
文字列関数は、Analytics イベントサービスに存在するすべてのイベントデータを変換できます。重要な使用例の 1 つは、データが収集された構造、シリアル化、または形式を変更する必要がある場合に、アドホックデータ変換を実行することです。
文字列関数を使用して、次の操作を実行できます。
- 文字列の length()、文字列内の indexOf() 文字、またはこれらの両方を処理することで、substring() に焦点を合わせることができます
- たとえば、URL からドメイン名を抽出できます
- concat() 演算子を使用して複数の文字列を連結できます
- たとえば、複数のフィールドの値を 1 つの値に結合することができます
- trim() でフィールドの先頭と末尾から空白をトリミングできます。
-
substring() 関数の出力と別の関数の出力を項目ごとにペアリングすることができます
-
この暗黙的集約は、SQL の GROUP BY に相当する ADQL です
-
次の暗黙的な集約の例を参照してください。
-
| 機能 | 戻り値 | 有効なフィールドタイプ | ADQL クエリの例 |
|---|---|---|---|
concat(inputString1, string inputString2, ... inputStringN) |
入力文字列を結合する単一の文字列。 |
string 2 つ以上の文字列を指定します。 |
関数: concat('foo', 'bar') 結果: 'foobar' |
indexOf(inputString, substring, [occurrence]) |
| inputString substringstringfor 正または負の intforoccurrence |
関数: indexOf('www.wikipedia.org', '.', 1) 結果: 4 関数: indexOf('www.wikipedia.org', '.', -1) 結果: 14 関数(関数の連結と結合の例): substring('www.wikipedia.org', indexOf('www.wikipedia.org', '.', 1)+1, indexOf('www.wikipedia.org', '.', -1) - indexOf('www.wikipedia.org', '.', 1) -1)SELECT FROMtransactions 結果: 'wikipedia' |
length(inputString) |
入力文字列の空白を含む文字の数。 | string |
関数: length(' foo bar ')
結果: 9 |
substring(inputString, startIndex, numChars) |
(1 ベースの)startIndex で開始する inputString の部分文字列。 startIndex が負の場合、文字列の末尾からその文字数を開始します。 numChars が指定された場合は、その長さの部分文字列が返されます。 が文字列の末尾を超える場合、文字列の末尾までが返されます。 startIndex または numChars が無効の場合、空の文字列が返されます。 |
stringfor inputString 正または負の intfor startIndex 正の numCharsintfor numChars |
この例では、URL からドメイン名を抽出します。 関数: substring('https://example.com/home.htm', 9, indexOf('https://example.com/home.htm','/',3) - 9)
結果: 'example.com' |
trim(inputString) |
先頭と末尾の空白文字が削除された入力文字列のコピー。 | string |
関数: trim(' foo bar ')
結果: 'foo bar' |
暗黙的な集約の例
次のデータを考慮してください。
| Application ID | responseTime (ms) |
|---|---|
| SJC-001 | 500 |
| SJC-002 | 600 |
| SJC-003 | 700 |
| LAX-001 | 200 |
| LAX-002 | 300 |
| LAX-003 | 400 |
次の ADQL クエリは、substring() の出力の各項目と、avg() の出力の対応する項目をペアにします。
SELECT substring(application, 1, 3), avg(responseTime) FROM transactions
次のような結果をもたらします。
SJC, 600
LAX, 300
2 番目の関数 substring() の適用先のグループを処理するために、ADQL で avg() をどのように使用しているかに注目してください。
ファネル関数
ファネル関数を使用すると、ADQL クエリからファネルウィジェットを作成できます。次のクエリの例では、通常のトランザクションのファネルウィジェットを作成します。
SELECT funnel(transactionName, responseTime < 90, showHealth=true, health="NORMAL") FROM transactions
ファネルウィジェットを表示するには、クエリを入力し、[Search] を選択します。検索結果が表示されたら、クエリの右上にある [Basic] を選択します。
「Splunk AppDynamics コミュニティ」を参照してください。
データ型変換関数
データ型変換関数は、SELECT 句または WHERE 句で使用できます。使用可能なデータ型変換関数を以下に示します。formatString の要件については、「クラス」セクションの Joda の「DateTimeFormat」のドキュメントを参照してください。
| 機能 | 戻り値 | ADQL クエリの例 |
|---|---|---|
ifNull(object value, object replacementValue) | 値が NULL 以外の場合は 1 つの値。値が NULL の場合、replacementValue が返されます。 |
SELECT 戻り値
戻り値 値が null でない場合の |
| round(float value, int decimalPlaces) | 日時としてフォーマットされた整数値。 |
toDate(12341234) transactionsSELECT FROM 返り値 Dec 31 1969 19:25:41 GMT-0800 |
toString(datetime value, [string formatString]) | 文字列としてフォーマットされた日時値。 |
toString(field_name, "MMM dd, yyyy") transactionsSELECT FROM 戻り値 field_name に「Jan 15, 2019」 |
toString(float/int/bool value) | 文字列としてフォーマットされた値。 |
toString(123.123) transactionsSELECT FROM 返り値 「123.123」 |
toInt(datetime/float/string/bool value) |
次のようにフォーマットされた整数値。
|
toInt(123.4) transactionsSELECT FROM 返り値 123 |
toFloat(int/string value) | 浮動小数としてフォーマットされた整数または文字列値。 |
toFloat(123123) transactions SELECT FROM 返り値 123123.0 |
round(float value, int decimalPlaces) | decimalPlaces に丸められた値。decimalPlaces は必ず負ではない整数になります。 |
round(123.123123, 3)SELECT FROMtransactions 返り値 123.123 |
ifNull(object value, object replacementValue) | 値が NULL 以外の場合は 1 つの値。値が NULL の場合、replacementValue が返されます。 |
ifNull(field_name, 10) transactionsSELECT FROM 戻り値 field_name の値の場合は 10 戻り値 field_name の値 |
日時に対する数学関数と now() 関数の使用
日時値および長整数値に対して、加算および減算の数学関数を実行できます。次に例を示します。
この関数は日時値を返します。乗算、除算、および剰余の数学関数はサポートされていません。加算関数と減算関数を、浮動小数と組み合わせて使用することはできません。
now() を使用できます。
上記の関数は、field_name がどれくらい前のものであるかを判定します。
他の関数を変更する関数
| 機能 | 戻り値 | 有効なフィールドタイプ | ADQL クエリの例 |
|---|---|---|---|
|
filter(metric_function (field_expression), ...) [WHERE] condition_expression) |
1 つのメトリック関数の入力にフィルタを適用することによって計算された、データの特定サブセットの集約。 |
メトリック関数は、1 つの値を返す次のいずれかにする必要があります。 { count | avg | max | min | sum | distinctcount} 2 番目の引数の構文は WHERE 句と同じで、オプションで WHERE キーワードを指定して開始します。次に例を示します。 avgSELECTfilter(WHEREresponseTime > 1)FROMtransactionsWHEREapplication = "Travel" |
filter( sum count countSELECT100.0 * filter(FROMtransactionsWHEREapplication = "yourApp" AND transactionName = "yourValue" |
さまざまなタイプの関数の組み合わせ
異なるタイプの関数を組み合わせる際に考慮すべき特殊なケースを次に示します。
- distinctcount() がバケット関数の後に続く場合、distinctcount() の最大精度が低下します。
distinctcount()クエリをネストすると、メモリ節約の精度がそれと引き換えになります。これは、前の関数によってバケットが確立され、distinctcount() によって、前の関数の各バケット内に一連のバケットが作成され、Elasticsearch の実行時にこのトレードオフが自動的に行われるためです。- たとえば、次の 2 つのクエリ例の最初の例では、2 番目よりも精度の低い結果が返されます。
SELECTtransactionName, distinctcount(userId)FROMtransactionsSELECTdistinctcount(userId)FROMtransactions
- たとえば、次の 2 つのクエリ例の最初の例では、2 番目よりも精度の低い結果が返されます。
stdev(numeric_field_name)の戻り値を使用して、結果をソートまたはフィルタすることはできません。