← Аналитика / analytics / graphql-api / migration-guides
Zone Analytics на GraphQL Analytics
Zone Analytics API позволяет получать данные о запросах по зонам. Он предлагает необязательные since и until параметры, чтобы указать период времени запроса, и continuous параметр, который указывает, нужно ли сдвигать период времени назад, чтобы найти период с полностью агрегированными данными.
Например, вот образец вызова curl для получения данных за двухминутный период:
curl "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/analytics/dashboard?since=2019-09-08T20:00:00Z&until=2019-09-08T20:02:00Z&continuous=false" \
--header "Authorization: Bearer <API_TOKEN>" --silent | jq .Ответ
{
"success": true,
"query": {
"since": "2019-09-08T20:00:00Z",
"until": "2019-09-08T20:02:00Z",
"time_delta": 1
},
"errors": [],
"messages": [],
"result": {
"timeseries": [
{
"since": "2019-09-08T20:00:00Z",
"until": "2019-09-08T20:01:00Z",
"requests": {
"all": 15,
"cached": 12,
"uncached": 3,
"ssl": {
"encrypted": 13,
"unencrypted": 2
},
"http_status": {
"200": 4,
"403": 11
},
"content_type": {
"html": 12,
"png": 3
},
"country": {
"CN": 6,
"IE": 1,
"US": 3,
"VN": 5
},
"ip_class": {
"monitoringService": 4,
"noRecord": 11
},
"ssl_protocol": {
"TLSv1.2": 13,
"none": 2
}
},
"bandwidth": {
"all": 312740,
"cached": 309930,
"uncached": 2810,
"ssl": {
"encrypted": 309276,
"unencrypted": 3464
},
"ssl_protocol": {
"TLSv1.2": 13,
"none": 2
},
"content_type": {
"html": 32150,
"png": 280590
},
"country": {
"CN": 10797,
"IE": 98224,
"US": 185176,
"VN": 18543
}
},
"threats": {
"all": 6,
"type": {
"user.ban.ctry": 6
},
"country": {
"CN": 6
}
},
"pageviews": {
"all": 1,
"search_engine": {
"pingdom": 1
}
},
"uniques": {
"all": 11
}
},
{
"since": "2019-09-08T20:01:00Z",
"until": "2019-09-08T20:02:00Z",
"requests": {
"all": 4,
"cached": 1,
"uncached": 3,
"ssl": {
"encrypted": 4,
"unencrypted": 0
},
"http_status": {
"200": 4
},
"content_type": {
"html": 1,
"png": 3
},
"country": {
"CA": 2,
"US": 2
},
"ip_class": {
"monitoringService": 4
},
"ssl_protocol": {
"TLSv1.2": 4
}
},
"bandwidth": {
"all": 283399,
"cached": 280590,
"uncached": 2809,
"ssl": {
"encrypted": 283399,
"unencrypted": 0
},
"ssl_protocol": {
"TLSv1.2": 4
},
"content_type": {
"html": 2809,
"png": 280590
},
"country": {
"CA": 101033,
"US": 182366
}
},
"threats": {
"all": 0,
"type": {},
"country": {}
},
"pageviews": {
"all": 1,
"search_engine": {
"pingdom": 1
}
},
"uniques": {
"all": 4
}
}
],
"totals": {
"since": "2019-09-08T20:00:00Z",
"until": "2019-09-08T20:02:00Z",
"requests": {
"all": 19,
"cached": 13,
"uncached": 6,
"ssl": {
"encrypted": 17,
"unencrypted": 2
},
"http_status": {
"200": 8,
"403": 11
},
"content_type": {
"html": 13,
"png": 6
},
"country": {
"CA": 2,
"CN": 6,
"IE": 1,
"US": 5,
"VN": 5
},
"ip_class": {
"monitoringService": 8,
"noRecord": 11
},
"ssl_protocol": {
"TLSv1.2": 17,
"none": 2
}
},
"bandwidth": {
"all": 596139,
"cached": 590520,
"uncached": 5619,
"ssl": {
"encrypted": 592675,
"unencrypted": 3464
},
"ssl_protocol": {
"TLSv1.2": 17,
"none": 2
},
"content_type": {
"html": 34959,
"png": 561180
},
"country": {
"CA": 101033,
"CN": 10797,
"IE": 98224,
"US": 367542,
"VN": 18543
}
},
"threats": {
"all": 6,
"type": {
"user.ban.ctry": 6
},
"country": {
"CN": 6
}
},
"pageviews": {
"all": 2,
"search_engine": {
"pingdom": 2
}
},
"uniques": {
"all": 15
}
}
}
}Как видно из ответа, Zone Analytics возвращает метрики по многим измерениям и не позволяет контролировать, что именно вы получаете. С GraphQL Analytics вы можете запросить только те данные, которые вам нужны. Однако если вы хотите получить точно те же метрики и измерения, что и из Zone Analytics, вот запрос, который для этого понадобится:
query ZoneAnalyticsMigrationSample($zoneTag: string, $start: Time, $end: Time) {
viewer {
zones(filter: { zoneTag: $zoneTag }) {
httpRequests1mGroups(
orderBy: [datetimeFiveMinutes_ASC]
limit: 100
filter: { datetime_geq: $start, datetime_lt: $end }
) {
dimensions {
datetimeFiveMinutes
}
sum {
browserMap {
pageViews
uaBrowserFamily
}
bytes
cachedBytes
cachedRequests
contentTypeMap {
bytes
requests
edgeResponseContentTypeName
}
clientSSLMap {
requests
clientSSLProtocol
}
countryMap {
bytes
requests
threats
clientCountryName
}
encryptedBytes
encryptedRequests
ipClassMap {
requests
ipType
}
pageViews
requests
responseStatusMap {
requests
edgeResponseStatus
}
threats
threatPathingMap {
requests
threatPathingName
}
}
uniq {
uniques
}
}
}
}
}Ответ
{
"data": {
"viewer": {
"zones": [
{
"httpRequests1mGroups": [
{
"dimensions": {
"datetimeFiveMinutes": "2019-09-08T20:00:00Z"
},
"sum": {
"browserMap": [
{
"pageViews": 1,
"uaBrowserFamily": "PingdomBot"
}
],
"bytes": 312740,
"cachedBytes": 309930,
"cachedRequests": 12,
"clientSSLMap": [
{
"clientSSLProtocol": "none",
"requests": 2
},
{
"clientSSLProtocol": "TLSv1.2",
"requests": 13
}
],
"contentTypeMap": [
{
"bytes": 280590,
"edgeResponseContentTypeName": "png",
"requests": 3
},
{
"bytes": 32150,
"edgeResponseContentTypeName": "html",
"requests": 12
}
],
"countryMap": [
{
"bytes": 10797,
"clientCountryName": "CN",
"requests": 6,
"threats": 6
},
{
"bytes": 98224,
"clientCountryName": "IE",
"requests": 1,
"threats": 0
},
{
"bytes": 185176,
"clientCountryName": "US",
"requests": 3,
"threats": 0
},
{
"bytes": 18543,
"clientCountryName": "VN",
"requests": 5,
"threats": 0
}
],
"encryptedBytes": 309276,
"encryptedRequests": 13,
"ipClassMap": [
{
"ipType": "monitoringService",
"requests": 4
},
{
"ipType": "noRecord",
"requests": 11
}
],
"pageViews": 1,
"requests": 15,
"responseStatusMap": [
{
"edgeResponseStatus": 200,
"requests": 4
},
{
"edgeResponseStatus": 403,
"requests": 11
}
],
"threatPathingMap": [
{
"requests": 6,
"threatPathingName": "user.ban.ctry"
}
],
"threats": 6
},
"uniq": {
"uniques": 11
}
},
{
"dimensions": {
"datetimeFiveMinutes": "2019-09-08T20:01:00Z"
},
"sum": {
"browserMap": [
{
"pageViews": 1,
"uaBrowserFamily": "PingdomBot"
}
],
"bytes": 283399,
"cachedBytes": 280590,
"cachedRequests": 1,
"clientSSLMap": [
{
"clientSSLProtocol": "TLSv1.2",
"requests": 4
}
],
"contentTypeMap": [
{
"bytes": 280590,
"edgeResponseContentTypeName": "png",
"requests": 3
},
{
"bytes": 2809,
"edgeResponseContentTypeName": "html",
"requests": 1
}
],
"countryMap": [
{
"bytes": 101033,
"clientCountryName": "CA",
"requests": 2,
"threats": 0
},
{
"bytes": 182366,
"clientCountryName": "US",
"requests": 2,
"threats": 0
}
],
"encryptedBytes": 283399,
"encryptedRequests": 4,
"ipClassMap": [
{
"ipType": "monitoringService",
"requests": 4
}
],
"pageViews": 1,
"requests": 4,
"responseStatusMap": [
{
"edgeResponseStatus": 200,
"requests": 4
}
],
"threatPathingMap": [],
"threats": 0
},
"uniq": {
"uniques": 4
}
}
]
}
]
}
},
"errors": null
}Обратите внимание, что период запроса можно указать с помощью фильтра набора данных (см. Фильтрация). continuous параметр больше не нужен, потому что GraphQL Analytics изначально спроектирована предоставлять данные, как только они становятся доступны.
Если вы хотите получить итоговые значения за определённый период, а не разбивку по периодам времени, просто удалите datetimeFiveMinutes поле в dimensions.