関数は、SELECT 句の引数として機能します。ADQL の関数タイプは次のとおりです。

  • メトリック関数
  • バケット関数
  • 文字列関数
  • ファネル関数
  • データ型変換関数
  • 他の関数を変更する関数

多くの関数では、数値フィールドのみ有効です。「すべての」データ型とは、整数、浮動小数点、日時、および文字列を意味します。 

関数は、ゼロまたは空のデータフィールドによる整数除算の結果の NULL 値など、NULL 値を無視します。 

WHERE をクエリに追加するには、[Controller Analytics search UI] の [data] タブのクエリボックスを使用します。検索を実行すると、テーブルウィジェットの [visualization] タブにメトリック関数の結果が表示されます。

次の各セクションで、関数のタイプについて 1 つずつ説明します。

メトリック関数

メトリック関数:

  • フィールドの値のセットに対して計算を実行します。
  • カウントや合計など 1 つの結果、またはパーセンタイルなどの結果のセットを返します。
  • SELECT 句内でのみ使用できます。
  • フィールド名が存在する場合は常にそれをフォローします。存在しない場合は、一部の視覚化が機能しない場合があります。

distinctcount() 関数は、最大 3000 の一意の戻り値に対して正確です。一意の戻り値が 3000 を超える場合、distinctcount() は、パフォーマンスの最適化によって概算となります。

関数返り値有効なフィールドタイプADQL クエリの例
avg(numeric_field_name)

数値フィールドの平均値。

整数、浮動小数点、日時

SELECT avg(btdata.estimatedtime) FROM browser_records WHERE appkey = 'your_appkey'

count(field_name)

イベントの数。

all

count(*) という形式も有効です。

SELECT count(orderID) AS 'Sales' FROM logs WHERE method='GET'


次のクエリは、アプリケーションに HTTP 要求を送信している上位 10 個の IP アドレスを返します。

SELECT ip, count(*) FROM web_session_records WHERE appkey = "yourApp" LIMIT 10

distinctcount(field_name)

フィールドに対して記録された一意の値の数。

all

SELECT distinctcount(field_name) FROM logs

max(numeric_field_name)

数値フィールドの最大記録値。

整数、浮動小数点、日時

1 つのフィールドのみを指定します。

SELECT max(numeric_field_name) FROM transactions

SELECT nodeName, max(eventtimestamp) FROM logs

min(numeric_field_name)

数値フィールドの最小記録値

整数、浮動小数点、日時

1 つのフィールドのみを指定します。

SELECT min(numeric_field_name) FROM transactions

stdev(numeric_field_name)

数値フィールドの母集団標準偏差。

整数、浮動小数点SELECT stdev(numeric_field_name)FROM transactions
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)

フィールドの統計情報:countminmaxaverage、および sum

整数、浮動小数点、日時

SELECT stats(numeric_fieldName) FROM transactions WHERE application='yourApp'

totalResultCount()イベントの合計数。フィールドを受け入れません。

次のクエリでは、最初に「ECommerce」アプリケーションのすべてのエラートランザクションを選択します。次に、一意のトランザクション名ごとに、そのトランザクション名のインスタンス数とエラートランザクションの合計数の比率を計算します。(所定のトランザクション名を複数のエラートランザクションに表示できることを前提としています。)


SELECT transactionName, count ( * ) / totalResultCount() FROM transactions WHERE application = 'ECommerce' AND userExperience = 'ERROR'

バケット関数

バケット関数はフィールドで動作し、データをバケットにグループ化します。多くの場合、バケット内のデータは別の関数でさらに集約します。たとえば、次のクエリは、1 時間ごとにアプリケーションのトランザクションをグループ化するバケットを作成し、各バケット(hour)内のトランザクション数をカウントします。


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 クエリの例を示します。

SELECT range(segments.transactionTime, 0, 10, 20) FROM transactions

これにより、次のバケットが生成されます。

[-Inf, 0], [0, 10], [10, 20], [20, +Inf]


series(field_name, interval_size)

series(field_name, interval_size, lower_extended_bound, upper_extended_bound, [offset],[rangeStyleBucketKeys],[strictEndpoints])


範囲を指定すると、すべてのバケットが返されるか、空になるか、または返されません。

範囲を指定しない場合は、次のようになります。

  • UI を使用している場合は、UI によってデフォルトの範囲が挿入されます。
  • API を使用している場合は、空ではないバケットのみが返されます。

指定した間隔に基づく一連のバケット。  


整数、浮動小数点、日付

数値フィールドでは、間隔を整数として指定します。

オプションのキーワード引数 offsetrangeStyleBucketKeys、および strictEndpoints の詳細については、以下を参照してください。

SELECT series(metrics.`Application Server Time (ms)`,10), count(*) FROM browser_records WHERE appkey='yourAppKey'

SELECT series(eventTimestamp, '1h'), count(*) FROM transactions WHERE application='yourAppName'

range() のバケットの定義

各バケットは、2 つの単一値による範囲として定義されます。バケットには最初の値が含まれ、2 番目の値は除外されます。

値のペア (x, y) によって、x(この値は含まれる)から y(この値は含まれない)までの明示的なバケットが定義されます。

単一値  では、range() の引数間のどこに値が配置されているかに基づいたルールに従いバケットが暗黙的に定義されます。 

  • バケットを定義する単一値を使用するためのルールは次のとおりです。
      1. フィールドの直後(つまり、2 番目の引数として):バケットは負の無限大で始まります。
      2. 別の単一値の後:バケットは前の引数(この引数は含まれる)から開始され、x(これは含まれない)まで拡張されます。
      3. 値のペアの後、かつ別の単一値の前:バケットは x(これは含まれる)から開始され、次の引数(これは含まれない)まで拡張されます。
      4. パラメータリストの末尾:バケットは正の無限大で終わります。これは、x が 2 つの引数の 2 番目であるという前提の例外の 1 つです。
      5. 2 つの値のペアの間:バケットを定義できず、値は無視されます。

range クエリの例

ここでは、上記のルールのほとんどを実行する range クエリを示します。

SELECT range(segments.transactionTime, 0, (10, 20), 30, (40, 50), 60, 70) FROM transactions

クエリによって、次のバケットが生成されます。

  • [-Inf, 0]:ルールが 0 に適用されるため
  • [10, 20]:(10, 20) によってこのバケットが明示的に定義されるため
  • 30 に対してはバケットなし:ルール e が適用されるため、30 は無視されます
  • [40, 50]:(40, 50) によってこのバケットが明示的に定義されるため
  • [60, 70]:ルール c が 60 に適用されるため
  • [70, +Inf]:ルール d が 70 に適用されるため

オプションのキーワード引数:series()offsetrangeStyleBucketKeys、および 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 件の結果の選択

Deployment Support

上位 n 件の結果は、SaaS デプロイでのみ使用できます。

SELECT series(eventTimestamp, '1m'), transactionName, count(*) FROM transaction LIMIT 1, 12一連の関数で、全期間にわたってグローバルな上位 n 件の計算を実行できます。上位 n 件の制限を設定するには、クエリの末尾に LIMIT 句を追加します。

この例では、クエリを transactionName の上位 12 件の結果に制限しています。値 1 は series 関数に適用されますが、series はバケット関数であるため、実際にはこの制限を使用しません。series 関数の値を含める必要があります。 

次のクエリの場合、全体の上位 n 件の制限は適用されません。 

  • 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 つは、データが収集された構造、シリアル化、または形式を変更する必要がある場合に、アドホックデータ変換を実行することです。

4.5.2 より前のバージョンの AppDynamics では、誤って収集されたデータを修正するのに、収集設定を調整する必要があります。


文字列関数を使用して、次の操作を実行できます。

  • 文字列の 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])

string. 内の substring の 1 ベースの開始インデックス

substring が見つからない場合は、0 が返されます。

occurrencen として指定されている場合、以下の n 番目のオカレンスのインデックスが返されます。substring.

occurrence が -n として指定されている場合、inputString の末尾から逆に向かって数えて n 番目の substring のオカレンスのインデックスが返されます。

inputStringsubstring に対して文字列


occurrence に対して正または負の整数

関数:

indexOf('www.wikipedia.org', '.', 1)

結果:

4


関数:

indexOf('www.wikipedia.org', '.', -1)

結果:

14


関数(関数の連結と結合の例):

SELECT substring('www.wikipedia.org', indexOf('www.wikipedia.org', '.', 1)+1, indexOf('www.wikipedia.org', '.', -1) - indexOf('www.wikipedia.org', '.', 1) -1) FROM トランザクション

結果:

'wikipedia'

length(inputString)

入力文字列の空白を含む文字の数。

string

関数:

length(' foo bar ')

結果:

9

substring(inputString, startIndex, numChars)

(1 ベースの)startIndex で開始する inputString の部分文字列。

startIndex が負の場合、文字列の末尾からその文字数を開始します。

numChars が指定された場合は、その長さの部分文字列が返されます。numChars が文字列の末尾を超える場合、文字列の末尾までが返されます。

startIndex または numChars が無効の場合、空の文字列が返されます。

inputString に対して文字列


startIndex に対して正または負の整数

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 IDresponseTime (ms)
SJC-001500
SJC-002600
SJC-003700
LAX-001200
LAX-002300
LAX-003400

次の ADQL クエリは、substring() の出力の各項目と、avg() の出力の対応する項目をペアにします。

SELECT substring(application, 1, 3)avg(responseTime) FROM transactions

次のような結果をもたらします。

SJC, 600

LAX, 300

2 番目の関数  avg() の適用先のグループを処理するために、ADQL で substring() をどのように使用しているかに注目してください。

ファネル関数

ファネル関数を使用すると、ADQL クエリからファネルウィジェットを作成できます。次のクエリの例では、通常のトランザクションのファネルウィジェットを作成します。

SELECT funnel(transactionName, responseTime < 90, showHealth=true, health="NORMAL") FROM transactions
CODE

ファネルウィジェットを表示するには、クエリを入力し、[Search] を選択します。検索結果が表示されたら、クエリの右上にある [Basic] を選択します。

AppDynamics コミュニティを参照してください。 

データ型変換関数

データ型変換関数は、SaaS デプロイでのみ使用できます。

データ型変換関数は、SELECT 句または WHERE 句で使用できます。使用可能なデータ型変換関数を以下に示します。formatString の要件については、「クラス」セクションの Joda の DateTimeFormat  のドキュメントを参照してください。 

関数
返り値
ADQL クエリの例
toDate(string value, [string formatString])日時としてフォーマットされた文字列値。

SELECT toDate(field_name, "MM/dd/yyyy") FROM transactions

返り値

文字列値「01/15/2019」を含む field_name に対して 2019-01-15T00:00:00.000Z

toDate(int value)日時としてフォーマットされた整数値。

SELECT toDate(12341234) FROMtransactions

返り値

Dec 31 1969 19:25:41 GMT-0800

toString(datetime value, [string formatString])文字列としてフォーマットされた日時値。

SELECT toString(field_name, "MMM dd, yyyy") FROM transactions

返り値

日時値 2019-01-15T00:00:00.000Z を含む field_name に対して「Jan 15, 2019」

toString(float/int/bool value)文字列としてフォーマットされた値。

SELECT toString(123.123) FROMtransactions

返り値

「123.123」

toInt(datetime/float/string/bool value)

次のようにフォーマットされた整数値。

  • datetime:ミリ秒に変換します。
  • float:切り捨てを行います。
  • string:浮動小数まで解析し、整数に切り捨てます。
  • bool:0/1 に変換します。


SELECT toInt(123.4) FROMtransactions

返り値

123

toFloat(int/string value)浮動小数としてフォーマットされた整数または文字列値。

SELECT toFloat(123123) FROMtransactions

返り値

123123.0

round(float value, int decimalPlaces)decimalPlaces に丸められた値。decimalPlaces は必ず負ではない整数になります。

SELECT round(123.123123, 3) FROMtransactions

返り値

123.123

ifNull(object value, object replacementValue)値が NULL 以外の場合は 1 つの値。値が NULL の場合、replacementValue が返されます。

SELECT ifNull(field_name, 10)FROM transactions

返り値

field_name の値が NULL の場合は 10。

返り値

値が NULL ではない場合は field_name の値。

データ型変換関数(ifNull) を除く)では、field_name の値で NULL が返された場合、変換されたデータ型でも NULL が返されます。

日時に対する数学関数と now() 関数の使用

now() 関数は、SaaS コントローラでのみサポートされます。オンプレミス展開ではサポートされません。

日時値および長整数値に対して、加算および減算の数学関数を実行できます。次に例を示します。


SELECT toDate(field_name, "MMM, dd, yyyy") - toDate(field_name,"MMM, dd, yyyy") FROM transactions

この関数は日時値を返します。乗算、除算、および剰余の数学関数はサポートされていません。加算関数と減算関数を、浮動小数と組み合わせて使用することはできません。 

now() 関数を使用して、値に対してサーバの現在の時刻を加算または減算できます。次に例を示します。


SELECT toInt(now() - field_name) FROM transactions

上記の関数によって、field_name がどれくらい前に作成されたか特定され、値が整数に変換されます。 

他の関数を変更する関数

関数返り値有効なフィールドタイプADQL クエリの例

filter(metric_function (field_expression), ...)  [WHERE] condition_expression)

1 つのメトリック関数の入力にフィルタを適用することによって計算された、データの特定サブセットの集約。

メトリック関数は、1 つの値を返す次のいずれかにする必要があります。

{count | avg | max | min | sum | distinctcount}

2 番目の引数の構文は WHERE 句と同じで、オプションで WHERE キーワードを指定して開始します。次に例を示します。

SELECT filter(avg(responseTime), WHERE responseTime > 1) FROM transactions WHERE application = "Travel"

filter(sum(numeric_field_name), numeric_field_name > 100)

SELECT 100.0 * filter(count(*), field_name = "value") / count(*) as "%" FROM transactions WHERE application = "yourApp" AND transactionName = "yourValue"


さまざまなタイプの関数の組み合わせ

異なるタイプの関数を組み合わせる際に考慮すべき特殊なケースを次に示します。

  • distinctcount() がバケット関数の後に続く場合、distinctcount() の最大精度が低下します。distinctcount() クエリをネストすると、メモリ節約の精度がそれと引き換えになります。これは、前の関数によってバケットが確立され、distinctcount() によって、前の関数の各バケット内に一連のバケットが作成され、Elasticsearch の実行時にこのトレードオフが自動的に行われるためです。
    • たとえば、次の 2 つのクエリ例の最初の例では、2 番目よりも精度の低い結果が返されます。
      • SELECT transactionName, distinctcount(userId) FROM transactions
      • SELECT distinctcount(userId) FROM transactions
  • stdev(numeric_field_name) の戻り値を使用して、結果をソートまたはフィルタすることはできません。