このガイドでは、非推奨(まもなく廃止)の Zone Analytics API から GraphQL API への移行方法を示します。colos エンドポイントの現実的なユースケースを例に、同じユースケースを GraphQL API へ置き換える手順を説明します。置き換え先の GraphQL API が、より強力になる理由も確認します。
この例では、特定 colo のリクエスト数を、発生した時間帯ごとに集計します。Zone Analytics の colos エンドポイントを参照し、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に対する Analytics Read 権限を持つAPI_TOKENを使う。ZONE_IDの colos 分析を取得する。期間の開始は2020-12-10T00:00:00Z(sinceパラメーター)、終了は現在。
知りたい質問は「ZRH の 1 時間あたりのリクエスト数はいくつですか?」です。colos エンドポイントのレスポンスと 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[]result 配列を、1 行ずつの 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 の行だけを選びます。
最終データは、次のようなレスポンスになります。
レスポンス
{"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 では、取得するデータをより具体的に指定できます。colos エンドポイントでは colo ごとのリクエストと帯域幅の内訳をすべて取得する必要がありますが、GraphQL API では関心のある情報だけを取得できます。
対象データは HTTP リクエストです。そのため、HTTP リクエストデータの正規のソースである httpRequestsAdaptiveGroups を使います。この GraphQL API のノードでは、HTTP リクエストのほぼ任意の次元でフィルターとグループ化ができます。Adaptive なので、ABR 技術 ↗ によりレスポンスは高速です。
次の GraphQL API クエリは、「ZRH の 1 時間あたりのリクエスト数はいくつですか?」に答えるデータを取得します。
{
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 が返すデータは colos エンドポイントより具体的なため、このコマンドは以前よりシンプルです。
それでも、GraphQL API の考え方を理解するために、コマンドを説明します。
.data.viewer.zones[]GraphQL レスポンスの形式は、クエリによく似ています。成功レスポンスには、レスポンスデータを包む data オブジェクトが必ずあります。クエリには、ユーザーを表す viewer オブジェクトが必ずあります。次に、zones オブジェクトを 1 行ずつ展開します。このクエリのゾーンは 1 件です(そのように選んだため)。ただし、1 つのクエリに複数ゾーンを含めることもできます。
.httpRequestsAdaptiveGroups[]httpRequestsAdaptiveGroups フィールドはリストです。各データポイントは、選択した次元の組み合わせと、その組み合わせに対する集計を表します。ここでは、各データポイントを 1 行ずつ展開します。
{colo_id: .dimensions.coloCode, timeslot: .dimensions.datetimeHour, requests: .count, bandwidth: .sum.edgeResponseBytes}これは単純です。各データポイントから関心のある属性を、以前 colos エンドポイントで使った形式で選びます。
GraphQL API は、多くの次元でフィルターとグループ化ができる強力なツールです。この機能は、Zone Analytics API の colos エンドポイントにはありません。