非同期カスタム レポート API を使用する

Edge Analytics は、インタラクティブ ダッシュボード、カスタム レポート ジェネレータ、および関連機能の豊富なセットを提供します。ただし、これらの機能は双方向性を意図して設計されているため、API または UI リクエストを送信すると、分析サーバーがレスポンスを提供するまでそのリクエストはブロックされます。

分析リクエストは、完了までに時間がかかりすぎるとタイムアウトする可能性があります。クエリ リクエストが大量のデータ(数百 GB など)を処理する必要がある場合は、タイムアウトのために失敗する可能性があります。

非同期クエリ処理を使用すれば、大量のデータセットに対してクエリを実行しておいて、後から結果を受け取ることができます。インタラクティブ クエリがタイムアウトすることがわかった場合は、オフライン クエリの使用を検討してください。次のように、非同期クエリ処理が適切な代替手段になる場合があります。

  • レポートの分析と作成に時間がかかる場合。
  • グループ化ディメンションが多いなどのクエリを複雑にする制約を伴うデータを分析する場合。
  • 一部のユーザーまたは組織のデータ量が大幅に増加したことがわかってからクエリを管理する場合。

このドキュメントでは、API を使用して非同期クエリを開始する方法について説明します。カスタム レポートの実行で説明されているように、UI を使用することもできます。

レポート API と UI の比較

カスタム レポートの作成と管理に、Edge UI を使用してカスタム レポートを作成して実行する方法が記載されています。これらのレポートは同期的または非同期的に実行できます。

UI を使用してカスタム レポートを生成する場合のコンセプトのほとんどが、API の使用に適用されます。つまり、API を使用してカスタム レポートを作成するときは、Edge に組み込まれた指標ディメンションフィルタと、StatisticsCollector ポリシーを使用して作成したカスタム指標を指定します。

UI と API で生成されるレポートの主な違いは、API を使用して生成されたレポートが UI に表示される視覚的なレポートではなく、CSV または JSON(改行区切り)ファイルに書き込まれることです。

Apigee ハイブリッドの制限

Apigee ハイブリッドでは、結果データセットに 30 MB のサイズ上限が適用されます。

非同期分析クエリを作成する方法

非同期分析クエリは、次の 3 つのステップで作成します。

  1. クエリを送信します。

  2. クエリ ステータスを取得します。

  3. クエリ結果を回収します。

ステップ 1. クエリを送信する

POST リクエストを /queries Management API に送信する必要があります。この API は、バックグラウンドでリクエストを処理するように Edge に指示します。クエリの送信が成功すると、API は 201 ステータスと、後のステップでクエリを参照するために使用する ID を返します。

例:

curl -X POST -H "Content-Type:application/json"
https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/queries -d @json-query-file
-u orgAdminEmail:password

リクエストの本文は、クエリの JSON 記述です。JSON 本文で、レポートを定義する指標ディメンションフィルタを指定します。

json-query-file ファイルの例を以下に示します。

{
   "metrics":  [
     {
         "name": "message_count",
         "function": "sum",
         "alias": "sum_txn"
    }
        ],
    "dimensions": ["apiproxy"],
    "timeRange": "last24hours",
    "limit": 14400,
    "filter":"(message_count ge 0)"
}

リクエスト本文の構文の詳細については、後述するリクエスト本文についてをご覧ください。

レスポンスの例:

クエリ ID 9cfc0d85-0f30-46d6-ae6f-318d0cb961bd がレスポンスに含まれていることに注意してください。HTTP ステータス 201 に加えて、enqueuedstate が、リクエストが成功したことを示しています。

HTTP/1.1 201 Created

{
  "self":"/organizations/myorg/environments/myenv/queries/9cfc0d85-0f30-46d6-ae6f-318d0cb961bd",
  "created":"2018-05-10T07:11:10Z",
  "state":"enqueued",
  "error":"false",
}

ステップ 2. クエリ ステータスを取得する

クエリのステータスをリクエストするための GET 呼び出しを発行します。POST 呼び出しから返されたクエリ ID を指定します。次に例を示します。

curl -X GET -H "Content-Type:application/json"
https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/queries/9cfc0d85-0f30-46d6-ae6f-318d0cb961bd
-u email:password

レスポンスの例:

クエリが処理中の場合は、次のようなレスポンスが返されます。ここでは、staterunning になっています。

{
    "self": "/organizations/myorg/environments/myenv/queries/1577884c-4f48-4735-9728-5da4b05876ab",
    "state": "running",
    "created": "2018-02-23T14:07:27Z",
    "updated": "2018-02-23T14:07:54Z"
}

クエリが正常に完了すると、次のようなレスポンスが返されます。ここでは、statecompleted に設定されています。

{
      "self": "/organizations/myorg/environments/myenv/queries/9cfc0d85-0f30-46d6-ae6f-318d0cb961bd",
      "state": "completed",
      "result": {
        "self": "/organizations/myorg/environments/myenv/queries/9cfc0d85-0f30-46d6-ae6f-318d0cb961bd/result",
        "expires": "2017-05-22T14:56:31Z"
      },
      "resultRows": 1,
      "resultFileSize": "922KB",
      "executionTime": "11 sec",
      "created": "2018-05-10T07:11:10Z",
      "updated": "2018-05-10T07:13:22Z"
}

ステップ 3. クエリ結果を回収する

クエリ ステータスが completed になったら、get results API を使用して、結果を回収できます。ここでは、クエリ ID が再び 9cfc0d85-0f30-46d6-ae6f-318d0cb961bd になっています。

curl -X GET -H "Content-Type:application/json" -O -J https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/queries/9cfc0d85-0f30-46d6-ae6f-318d0cb961bd/result
-u email:password

ダウンロードしたファイルを取得するには、ダウンロードしたファイルをシステムに保存するように、使用するツールを構成する必要があります。次に例を示します。

  • 上で示したように、cURL を使用する場合は、-O -J オプションを使用できます。

  • Postman を使用する場合は、[Save and Download] ボタンを選択する必要があります。この場合は、response という名前の zip ファイルがダウンロードされます。

  • Chrome ブラウザを使用している場合は、ダウンロードが自動的に受け入れられます。

リクエストが成功し、0 以外の結果セットが存在する場合は、結果が圧縮された JSON(改行区切り)ファイルとしてクライアントにダウンロードされます。ダウンロードされるファイルの名前は次のとおりです。

OfflineQueryResult-<query-id>.zip

例:

OfflineQueryResult-9cfc0d85-0f30-46d6-ae6f-318d0cb961bd.zip

zip ファイルには、JSON 結果の .gz アーカイブ ファイルが含まれています。JSON ファイルにアクセスするには、ダウンロード ファイルを解凍してから、gzip コマンドを使用して JSON ファイルを抽出します。

unzip OfflineQueryResult-9cfc0d85-0f30-46d6-ae6f-318d0cb961bd.zip
gzip -d QueryResult-9cfc0d85-0f30-46d6-ae6f-318d0cb961bd-000000000000.json.gz

リクエスト本文について

このセクションでは、クエリの JSON リクエスト本文で使用可能なパラメータのそれぞれについて説明します。クエリで使用可能な指標とディメンションの詳細については、分析リファレンスをご覧ください。

{
   "metrics":[
      {
        "name":"metric_name",
        "function":"aggregation_function",
        "alias":"metric_dispaly_name_in_results",
        "operator":"post_processing_operator",
        "value":"post_processing_operand"
      },
   ...
   ],
   "dimensions":[
      "dimension_name",
      ...
   ],
   "timeRange":"time_range",
   "limit":results_limit,
   "filter":"filter",
   "groupByTimeUnit": "grouping",
   "outputFormat": "format",
   "csvDelimiter": "delimiter"
}
プロパティ 説明 必須
metrics

指標の配列。各指標が含まれる 1 つのクエリに対して、1 つ以上の指標を指定できます。指標名のみが必須です。

  • name: (必須)指標の表で定義された指標の名前。
  • function: (任意)avgminmaxsum などの集計関数。

    すべての指標ですべての集計関数がサポートされるわけではありません。指標の名前と各指標でサポートされる関数(avgminmaxsum)が示されている表については、指標のドキュメントをご覧ください。

  • alias: (任意)出力に指標データが含まれるプロパティの名前。省略すると、デフォルトで指標名と集計関数名の組み合わせに設定されます。
  • operator: (任意)値の計算後に指標に対して実行される演算。value プロパティと連動します。サポートされている演算は + - / % * です。
  • value: (任意)指定された operator によって計算された指標に適用される値。

operatorvalue は、指標に対して実行される後処理オペレーションを定義します。たとえば、指標 response_processing_latency を指定した場合は、指標がミリ秒単位の平均レスポンス処理レイテンシを返します。単位を秒に変換するには、operator"/" に、value”1000.0“ に設定します。


"metrics":[
  {
    "name":"response_processing_latency",
    "function":"avg",
    "alias":"average_response_time_in_seconds",
    "operator":"/",
    "value":"1000"
  }
]

詳細については、アナリティクス指標、ディメンション、フィルタのリファレンスをご覧ください。

×
dimensions 指標をグループ化するディメンションの配列。詳細については、サポートされているディメンションのリストをご覧ください。複数のディメンションを指定できます。 ×
timeRange クエリの時間範囲。

次の事前に定義された文字列を使用して、時間範囲を指定できます。

  • last60minutes
  • last24hours
  • last7days

または、開始タイムスタンプと終了タイムスタンプを ISO 形式で記述した構造 yyyy-mm-ddThh:mm:ssZ として timeRange を指定できます。次に例を示します。


"timeRange": {
    "start": "2018-07-29T00:13:00Z",
    "end": "2018-08-01T00:18:00Z"
}
limit 結果で返される最大行数。 ×
filter データのフィルタ処理に使用されるブール式。フィルタ式は、AND / OR 用語を使用して組み合わせることができ、曖昧さを避けるために全体を括弧で囲む必要があります。フィルタ処理に使用可能なフィールドの詳細については、アナリティクス指標、ディメンション、フィルタのリファレンスをご覧ください。フィルタ式の作成に使用されるトークンの詳細については、フィルタ式の構文をご覧ください。 ×
groupByTimeUnit 結果セットのグループ化に使用される時間単位。有効な値は、secondminutehourdayweekmonth です。

クエリに groupByTimeUnit が含まれている場合は、結果が指定された時間単位に基づいて集計されるため、結果のタイムスタンプにミリ秒の精度が含まれません。クエリから groupByTimeUnit が省略された場合は、結果のタイムスタンプにミリ秒の精度が含まれます。

×
outputFormat 出力形式。有効な値は、csvjson です。デフォルトは、改行区切りの JSON に対応する json です。

: csvDelimiter プロパティを使用して、CSV 出力用の区切り文字を構成します。

×
csvDelimiter outputFormatcsv に設定されている場合に、CSV ファイルで使用される区切り文字。デフォルトで ,(カンマ)文字に設定されます。サポートされている区切り文字には、カンマ(,)、パイプ(|)、タブ(\t)があります。 ×

フィルタ式の構文

このリファレンス セクションでは、リクエスト本文でフィルタ式を作成するために使用可能なトークンについて説明します。たとえば、次の式では「ge」トークン(以上)が使用されています。

"filter":"(message_count ge 0)"
トークン 説明
in リストに含む

(apiproxy in 'ethorapi','weather-api')

(apiproxy in 'ethorapi')

(apiproxy in 'Search','ViewItem')

(response_status_code in 400,401,500,501)

注: 文字列を引用符で囲む必要があります。

notin リストから除外する

(response_status_code notin 400,401,500,501)
eq 次に等しい(==)

(response_status_code eq 504)

(apiproxy eq 'non-prod')
ne 等しくない((!=)

(response_status_code ne 500)

(apiproxy ne 'non-prod')
gt より大きい(>)

(response_status_code gt 500)
lt より小さい(<)

(response_status_code lt 500)
ge 以上(>=)

(target_response_code ge 400)
le 以下(<=)

(target_response_code le 300)
like 文字列パターンが指定したパターンに一致する場合に true を返します。

右の例は次のように一致します。

- 「buy」という単語を含む値

- 「item」で終わる値

- 「Prod」で始まる値

- 4 で始まる値、response_status_code は数値であることに注意


(apiproxy like '%buy%')

(apiproxy like '%item')

(apiproxy like 'Prod%')
not like 文字列パターンが指定したパターンに一致する場合に false を返します。

(apiproxy not like '%buy%')

(apiproxy not like '%item')

(apiproxy not like 'Prod%')
and 「and」ロジックを使用して複数のフィルタ式を含めることができます。フィルタには、すべての条件を満たすデータが含まれます。

(target_response_code gt 399) and (response_status_code ge 400)
or 「or」ロジックを使用して、考えられるさまざまなフィルタ式を評価できます。フィルタには、少なくとも 1 つの条件を満たすデータが含まれます。

(response_size ge 1000) or (response_status_code eq 500)

制約とデフォルト

非同期クエリ処理機能の制約とデフォルトのリストを以下に示します。

制約 デフォルト 説明
クエリ呼び出しの上限 説明を参照 非同期レポートを開始するために、/queries Management API を 1 時間あたり最大 7 回呼び出すことができます。呼び出しの割り当てを超えた場合、API は HTTP 429 レスポンスを返します。
アクティブ クエリの上限 10 組織 / 環境に対して最大 10 個のアクティブ クエリを使用できます。
クエリ実行時間のしきい値 6 時間 6 時間以上かかるクエリは強制終了されます。
クエリ時間の範囲 説明を参照 クエリの最大許容時間範囲は 365 日です。
ディメンションと指標の上限 25 クエリ ペイロードで指定可能なディメンションと指標の最大数。

クエリ結果について

JSON 形式の結果の例を以下に示します。出力は、改行区切り文字で区切られた JSON 行で構成されます。

{"message_count":"10209","apiproxy":"guest-auth-v3","hour":"2018-08-07 19:26:00 UTC"}
{"message_count":"2462","apiproxy":"carts-v2","hour":"2018-08-06 13:16:00 UTC"}
…

リポジトリ内のデータが期限切れになるまで、URL から結果を取得できます。制約とデフォルトをご覧ください。

例 1: メッセージ数の合計

過去 60 分間のメッセージ数の合計に対するクエリ。

クエリ

curl -X POST -H "Content-Type: application/json" -H "Accept: application/json"
https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/queries"
-d @last60minutes.json
-u orgAdminEmail:password

last60minutes.json からのリクエスト本文

{
   "metrics":[
      {
         "name":"message_count",
         "function":"sum"
      }
   ],
   "dimensions":[
      "apiproxy"
   ],
   "groupByTimeUnit":"minute",
   "limit":1000,
   "timeRange":"last60minutes"
}

例 2: カスタム時間範囲

カスタム時間範囲を使用したクエリ。

クエリ

curl -X POST -H "Content-Type: application/json" -H "Accept: application/json"
https://api.enterprise.apigee.com/v1 /organizations/myorg/environments/test/queries"
-d @last60minutes.json
-u orgAdminEmail:password

last60minutes.json からのリクエスト本文

{
   "metrics":[
      {
         "name":"message_count",
         "function":"sum"
      },
      {
         "name":"total_response_time",
         "function":"avg",
         "alias":"average_response_time"
      }
   ],
   "dimensions":[
      "apiproxy"
   ],
   "groupByTimeUnit":"minute",
   "limit":1000,
   "timeRange":{
      "start":"2018-11-01T11:00:00Z",
      "end":"2018-11-30T11:00:00Z"
   }
}

例 3: 1 分あたりのトランザクション

1 分あたりのトランザクション(tpm)の指標に対するクエリ。

クエリ

curl -X POST -H "Content-Type: application/json" -H "Accept: application/json"
https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/queries"
-d @tpm.json
-u orgAdminEmail:password

tpm.json からのリクエスト本文

{
   "metrics":[
      {
         "name":"tpm"
      }
   ],
   "dimensions":[
      "apiproxy"
   ],
   "groupByTimeUnit":"minute",
   "limit":1000,
   "timeRange":{
      "start":"2018-07-01T11:00:00Z",
      "end":"2018-07-30T11:00:00Z"
   }
}

結果の例

結果ファイルからの抜粋:

{"tpm":149995.0,"apiproxy":"proxy_1","minute":"2018-07-06 12:16:00 UTC"}
{"tpm":149998.0,"apiproxy":"proxy_1","minute":"2018-07-09 15:12:00 UTC"}
{"tpm":3.0,"apiproxy":"proxy_2","minute":"2018-07-11 16:18:00 UTC"}
{"tpm":148916.0,"apiproxy":"proxy_1","minute":"2018-07-15 17:14:00 UTC"}
{"tpm":150002.0,"apiproxy":"proxy_1","minute":"2018-07-18 18:11:00 UTC"}
...

例 4: フィルタ式の使用

ブール演算子を使用するフィルタ式を使用したクエリ。

クエリ

curl -X POST -H "Content-Type:application/json"
https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/queries"
-d @filterCombo.json
-u orgAdminEmail:password

filterCombo.json からのリクエスト本文

{
   "metrics":[
      {
         "name":"message_count",
         "function":"sum"
      },
      {
         "name":"total_response_time",
         "function":"avg",
         "alias":"average_response_time"
      }
   ],
   "filter":"(apiproxy ne \u0027proxy_1\u0027) and (apiproxy ne \u0027proxy_2\u0027)",
   "dimensions":[
      "apiproxy"
   ],
   "groupByTimeUnit":"minute",
   "limit":1000,
   "timeRange":{
      "start":"2018-11-01T11:00:00Z",
      "end":"2018-11-30T11:00:00Z"
   }
}

例 5: 指標パラメータで式を渡す

指標パラメータの一部として渡される式を使用したクエリ。単純な 1 演算子式のみを使用できます。

クエリ

curl -X POST -H "Content-Type:application/json"
https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/queries"
-d @metricsExpression.json
-u orgAdminEmail:password

metricsExpression.json からのリクエスト本文

{
   "metrics":[
      {
         "name":"message_count",
         "function":"sum",
         "operator":"/",
         "value":"7"
      }
   ],
   "dimensions":[
      "apiproxy"
   ],
   "groupByTimeUnit":"minute",
   "limit":10,
   "timeRange":"last60minutes"
}

非同期収益化レポートクエリを作成する方法

このセクションで説明されているステップを使用して、特定の条件のセットに対して、特定の時間範囲内で成功した収益化トランザクションをすべてキャプチャできます。

非同期分析クエリと同様に、(1)クエリを送信する、(2)クエリ ステータスを取得する、(3)クエリ結果を回収するという 3 つのステップで非同期収益化レポートクエリを作成します。

クエリを送信するステップ 1 については後述します。

ステップ 2 と 3 は、非同期分析クエリの場合とまったく同じです。詳細については、非同期分析クエリを作成する方法をご覧ください。

非同期収益化レポートに対するクエリを送信するには、/mint/organizations/org_id/async-reports に POST リクエストを発行します。

オプションで、environment クエリ パラメータを渡すことで環境を指定できます。指定しなかった場合は、クエリ パラメータがデフォルトで prod に設定されます。次に例を示します。

/mint/organizations/org_id/async-reports?environment=prod

リクエスト本文で、次の検索条件を指定します。

名前 説明 デフォルト 必須
appCriteria レポートに含まれる特定のアプリケーションの ID と組織。このプロパティが指定されなかった場合は、すべてのアプリケーションがレポートに含まれます。 なし ×
billingMonth 7 月などのレポートの請求月。 なし
billingYear 2015 年などのレポートの請求年。 なし
currencyOption レポートの通貨。有効な値は次のとおりです。
  • LOCAL - レポートの各行は、該当する料金プランを使用して表示されます。これは、デベロッパーが複数の通貨を使用したプランを持っている場合に、1 つのレポートに複数の通貨が存在する可能性があることを意味します。
  • EUR - 現地通貨取引がユーロに換算されて表示されます。
  • GPB - 現地通貨取引が英国ポンドに換算されて表示されます。
  • USD - 現地通貨取引が米国ドルに換算されて表示されます。

EUR、GBP、または USD を選択した場合は、レポートに、取引日に有効な為替レートに基づいて、その単一通貨を使用するすべてのトランザクションが表示されます。

なし ×
devCriteria

レポートに含まれる特定のデベロッパーのデベロッパー ID またはメールアドレスと組織名。このプロパティが指定されなかった場合は、すべてのデベロッパーがレポートに含まれます。

例:


"devCriteria":[{
    "id":"RtHAeZ6LtkSbEH56",
    "orgId":"my_org"}
]
なし ×
fromDate UTC でのレポートの開始日。 なし
monetizationPakageIds レポートに含める 1 つ以上の API パッケージの ID。このプロパティが指定されなかった場合は、すべての API パッケージがレポートに含まれます。 なし ×
productIds レポートに含める 1 つ以上の API プロダクトの ID。このプロパティが指定されなかった場合は、すべての API プロダクトがレポートに含まれます。 なし ×
ratePlanLevels

レポートに含める料金プランのタイプ。有効な値は次のとおりです。

  • DEVELOPER - デベロッパー料金プラン。
  • STANDARD - 標準料金プラン。

このプロパティが指定されなかった場合は、デベロッパー固有の料金プランと標準料金プランの両方がレポートに含まれます。

なし ×
toDate UTC でのレポートの終了日。 なし

たとえば、次のリクエストは、指定された API プロダクトとデベロッパー ID の 2017 年 6 月の非同期収益化レポートを生成します。レポートの fromDatetoDate の日時は UTC/GMT で、時刻を含めることができます。

curl -H "Content-Type:application/json" -X POST -d \
'{
      "fromDate":"2017-06-01 00:00:00",
      "toDate":"2017-06-30 00:00:00",
     "productIds": [
        "a_product"
    ],
    "devCriteria": [{
        "id": "AbstTzpnZZMEDwjc",
        "orgId": "myorg"
    }]

 }' \
"https://api.enterprise.apigee.com/v1/mint/organizations/myorg/async-reports?environment=prod" \
-u orgAdminEmail:password