Zone Analytics Colos Endpoint to GraphQL Analytics
このガイドでは、廃止予定のゾーン分析APIからGraphQL APIへの移行方法を示します。コロスエンドポイントの実際のユースケースの例を提供し、そのユースケースがGraphQL APIにどのように変換されるかを示します。また、GraphQL APIの機能についても探求し、置き換えられるAPIよりも強力である理由を説明します。
この例では、特定のコロに対するリクエストの数を、リクエストが発生した時間ごとに分解して計算したいと考えています。ゾーン分析コロスエンドポイントを参照し、APIからデータを取得するcurlを構築できます。
curl -H "Authorization: Bearer $API_TOKEN" "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/analytics/colos?since=2020-12-10T00:00:00Z" > colos_endpoint_output.jsonこのクエリは次のことを示しています:
ZONE_IDに対して分析読み取りアクセスを持つAPI_TOKENを指定します。2020-12-10T00:00:00Z(sinceパラメータ)から現在までの時間範囲でZONE_IDのコロス分析を取得します。
私たちが答えたい質問は、「ZHRのリクエスト数は1時間ごとにどのくらいですか?」です。コロスエンドポイントの応答データとjqによるいくつかの操作を使用して、この質問に次のコマンドで答えることができます:
cat colos_endpoint_output.json | jq -c '.result[] | {colo_id: .colo_id, timeseries: .timeseries[]} | {colo_id: .colo_id, timeslot: .timeseries.since, requests: .timeseries.requests.all, bandwidth: .timeseries.bandwidth.all} | select(.requests > 0) | select(.colo_id == "ZRH") 'このjqコマンドは複雑なので、分解して説明します:
.result[]これは、結果の配列が個々のjson行に分割されることを意味します。
{colo_id: .colo_id, timeseries: .timeseries[]}これは、各json行を複数のjson行に分割します。各結果行にはcolo_idとtimeseries配列の1つの要素が含まれます。
{colo_id: .colo_id, timeslot: .timeseries.since, requests: .timeseries.requests.all, bandwidth: .timeseries.bandwidth.all}これは、各行のtimeseriesオブジェクト内にある私たちが興味のあるデータをフラット化します。
select(.requests > 0) | select(.colo_id == "ZRH")これは、リクエストが0より大きく、colo_idがZRHである行のみを選択します。
最終的に得られるデータは、次のような応答になります:
Response
{"colo_id":"ZRH","timeslot":"2020-12-10T00:00:00Z","requests":601,"bandwidth":683581}{"colo_id":"ZRH","timeslot":"2020-12-10T01:00:00Z","requests":484,"bandwidth":550936}{"colo_id":"ZRH","timeslot":"2020-12-10T02:00:00Z","requests":326,"bandwidth":370627}{"colo_id":"ZRH","timeslot":"2020-12-10T03:00:00Z","requests":354,"bandwidth":402527}{"colo_id":"ZRH","timeslot":"2020-12-10T04:00:00Z","requests":446,"bandwidth":507234}{"colo_id":"ZRH","timeslot":"2020-12-10T05:00:00Z","requests":692,"bandwidth":787688}{"colo_id":"ZRH","timeslot":"2020-12-10T06:00:00Z","requests":1474,"bandwidth":1676166}{"colo_id":"ZRH","timeslot":"2020-12-10T07:00:00Z","requests":2839,"bandwidth":3226871}{"colo_id":"ZRH","timeslot":"2020-12-10T08:00:00Z","requests":2953,"bandwidth":3358487}{"colo_id":"ZRH","timeslot":"2020-12-10T09:00:00Z","requests":2550,"bandwidth":2901823}{"colo_id":"ZRH","timeslot":"2020-12-10T10:00:00Z","requests":2203,"bandwidth":2504615}...同じ結果をGraphQL APIを使用して取得するにはどうすればよいでしょうか?
GraphQL APIを使用すると、取得したいデータについてより具体的に指定できます。コロスエンドポイントでは、コロごとのリクエストと帯域幅の内訳に関するすべての情報を取得する必要がありますが、GraphQL APIを使用すると、興味のある情報のみを取得できます。
私たちが欲しいデータはHTTPリクエストに関するものです。したがって、HTTPリクエストデータの標準ソースであるhttpRequestsAdaptiveGroupsを使用します。このノードは、GraphQL APIでHTTPリクエストのほぼすべての次元でフィルタリングおよびグループ化することを可能にします。これはAdaptiveであり、私たちのABR技術 ↗によって駆動されるため、応答は迅速です。
以下は、質問「ZHRのリクエスト数は1時間ごとにどのくらいですか?」に答えるために必要なデータを取得するためのGraphQL APIクエリです:
{ viewer { zones(filter: {zoneTag:"$ZONE_TAG"}) { httpRequestsAdaptiveGroups(filter: {datetime_gt: "2020-12-10T00:00:00Z", coloCode:"ZRH"}, limit:10000, orderBy: [datetimeHour_ASC]) { count sum { edgeResponseBytes } avg { sampleInterval } count dimensions { datetimeHour coloCode } } } }}次に、curlを使用して実行できます:
curl -X POST -H 'Authorization: Bearer $API_TOKEN' https://api.cloudflare.com/client/v4/graphql -d "@./coloGroups.json" > graphqlColoGroupsResponse.json同様にjqを使用して質問に答えることができます:
cat graphqlColoGroupsResponse.json| jq -c '.data.viewer.zones[] | .httpRequestsAdaptiveGroups[] | {colo_id: .dimensions.coloCode, timeslot: .dimensions.datetimeHour, requests: .count, bandwidth: .sum.edgeResponseBytes}'このコマンドは、以前のものよりもはるかにシンプルです。なぜなら、GraphQL APIから返されるデータは、コロスエンドポイントから返されるデータよりも具体的だからです。
それでも、このコマンドを説明する価値があります。なぜなら、GraphQL APIの基本的な概念を理解するのに役立つからです。
.data.viewer.zones[]GraphQL応答の形式は、クエリと非常に似ています。成功した応答には常にdataオブジェクトが含まれ、応答内のデータをラップします。クエリには常にユーザーを表すviewerオブジェクトがあります。次に、ゾーンオブジェクトを1行ずつ展開します。私たちのクエリには1つのゾーンしかありません(これは私たちが選択した方法です)。しかし、クエリには複数のゾーンが含まれることもあります。
.httpRequestsAdaptiveGroups[]httpRequestsAdaptiveGroupsフィールドはリストであり、リスト内の各データポイントは、選択された次元の組み合わせと、その次元の組み合わせに対して選択された集計を表します。ここでは、各データポイントを1行ずつ展開します。
{colo_id: .dimensions.coloCode, timeslot: .dimensions.datetimeHour, requests: .count, bandwidth: .sum.edgeResponseBytes}これは簡単です:以前のコロスエンドポイントで使用した形式で、私たちが興味のある各データポイントの属性を選択するだけです。
GraphQL APIは非常に強力なツールであり、多くの次元でデータをフィルタリングおよびグループ化できます。この機能は、ゾーン分析APIのコロスエンドポイントにはまったくありません。