← Аналитика / analytics / graphql-api / tutorials
С помощью GraphQL создавайте виджеты
В этой статье приведены примеры запросов, которые можно использовать для наполнения своего дашборда.
- Параметры и фильтры
- График временного ряда
- Activity log
- карточки Top N: источник
- карточки Top N: назначение
- Флаги TCP
- Сводный отчёт
Чтобы создавать и тестировать запросы, используйте следующий порядок действий:
- Установите и настройте GraphiQL ↗ для аутентификации в Cloudflare Analytics GraphQL API. Cloudflare рекомендует аутентификацию с помощью токена. Подробнее см. в Настройте токен Analytics API, где приведены дополнительные сведения.
- Составляйте запросы в GraphiQL. Используйте интроспективную документацию в клиенте GraphQL, чтобы изучить доступные узлы. Дополнительные сведения о запросах см. в Основы запросов.
- Протестируйте запросы, выполнив их в GraphiQL или передав их в виде payload в запросе cURL на конечную точку GraphQL API.
- Используйте эти запросы в своём приложении, чтобы получать данные для виджетов дашборда.
Параметры и фильтры
В этих примерах используется ID аккаунта Cloudflare, к которому выполняется запрос. Его можно определить как переменную (accountTag) и ссылаться на неё в своих запросах.
Запросы также используют фильтр, чтобы указать нужный временной интервал. Фильтр определяет интервал с помощью времени начала и окончания. Атрибуты для указания времени начала и окончания различаются в зависимости от периода, который вы хотите запросить. См. Фильтрация , где приведены дополнительные сведения о фильтрах.
Следующий пример запрашивает данные с датой больше или равной date_geq и меньше или равно date_leq:
{
"accountTag": "{account-id}",
"filter": {
"AND": [{ "date_geq": "2020-01-19" }, { "date_leq": "2020-01-20" }]
}
}В этой таблице перечислены наборы данных (узлы) Network Analytics и datetimeDimension который следует использовать при запросе данных за выбранный период.
Если нужно агрегированное представление данных, используйте Groups узлы запроса. Например, ipFlows1mAttacksGroups набор данных содержит сводные отчёты по активности атак с разбивкой по минутам. Подробнее см. в Наборы данных.
| Выбор времени | Узел Query | datetimeDimension |
|---|---|---|
| Прошлая неделя | ipFlows1dGroups | date |
| Прошлый месяц | ipFlows1dGroups | date |
| 24 часа | ipFlows1mGroups | datetimeFifteenMinutes |
| 12 часов | ipFlows1mGroups | datetimeFifteenMinutes |
| 6 часов | ipFlows1mGroups | datetimeFiveMinutes |
| 30 мин | ipFlows1mGroups | datetimeMinute |
| Custom range | Зависит от выбранного диапазона | Зависит от выбранного диапазона |
В таблице ниже перечислены атрибуты начала и окончания времени, допустимые для узлов запроса, которые представляют разные временные диапазоны.
| Узел Query | Фильтр начального дня и времени | Фильтр конечной даты и времени |
|---|---|---|
| ipFlows1mGroups | datetimeMinute_geq | datetimeMinute_leq |
| ipFlows1mAttacksGroups | date_geq | date_leq |
| ipFlows1hGroups | datetimeHour_geq | datetimeHour_leq |
| ipFlows1dGroups | date_geq | date_leq |
График временного ряда
С помощью следующего запроса постройте график временного ряда в Network Analytics:
query ipFlowTimeseries(
$accountTag: string
$filter: AccountIpFlows1mGroupsFilter_InputObject
) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
ipFlows1mGroups(
limit: 1000
filter: $filter
orderBy: datetimeMinute_ASC
) {
dimensions {
timestamp: datetimeMinute
attackMitigationType
attackId
}
sum {
bits
packets
}
}
}
}
}Activity log
Этот запрос возвращает журнал активности с поминутными сводками трафика атак в IP-потоках. Запрос группирует данные по полям, перечисленным в dimensions объект.
query ipFlowEventLog(
$accountTag: string
$filter: AccountIpFlows1mAttacksGroupsFilter_InputObject
) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
ipFlows1mAttacksGroups(
limit: 10
filter: $filter
orderBy: [min_datetimeMinute_ASC]
) {
dimensions {
attackId
attackDestinationIP
attackDestinationPort
attackMitigationType
attackSourcePort
attackType
}
avg {
bitsPerSecond
packetsPerSecond
}
min {
datetimeMinute
bitsPerSecond
packetsPerSecond
}
max {
datetimeMinute
bitsPerSecond
packetsPerSecond
}
sum {
bits
packets
}
}
}
}
}карточки Top N: источник
Этот запрос возвращает данные о самых частых исходных IP-адресах.
Поле limit параметр управляет количеством записей, возвращаемых для каждого узла. В следующем коде выделенные строки показывают, где настраивается limit.
query GetTopNBySource(
$accountTag: string
$filter: AccountIpFlows1mGroupsFilter_InputObject
$portFilter: AccountIpFlows1mGroupsFilter_InputObject
) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
topNPorts: ipFlows1mGroups(
limit: 5
filter: $portFilter
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: sourcePort
ipProtocol
}
}
topNASN: ipFlows1mGroups(
limit: 5
filter: $filter
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: sourceIPAsn
description: sourceIPASNDescription
}
}
topNIPs: ipFlows1mGroups(
limit: 5
filter: $filter
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: sourceIP
}
}
topNColos: ipFlows1mGroups(
limit: 10
filter: $filter
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: coloCity
coloCode
}
}
topNCountries: ipFlows1mGroups(
limit: 10
filter: $filter
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: coloCountry
}
}
topNIPVersions: ipFlows1mGroups(
limit: 2
filter: $filter
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: ipVersion
}
}
}
}
}карточки Top N: назначение
Этот запрос возвращает данные о самых частых IP-адресах назначения. Поле limit параметр управляет количеством возвращаемых записей. В следующем коде выделенные строки показывают, что запрос возвращает пять наибольших результатов.
query GetTopNByDestination(
$accountTag: string
$filter: AccountIpFlows1mGroupsFilter_InputObject
$portFilter: AccountIpFlows1mGroupsFilter_InputObject
) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
topNIPs: ipFlows1mGroups(
filter: $filter
limit: 5
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: destinationIP
}
}
topNPorts: ipFlows1mGroups(
filter: $portFilter
limit: 5
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
metric: destinationPort
ipProtocol
}
}
}
}
}Флаги TCP
Этот запрос извлекает количество пакетов TCP из поминутных сводок IP-потоков и группирует результаты по значению флага TCP. Он использует limit: 8 чтобы показать восемь лучших результатов, отсортированных по убыванию.
Чтобы отобразить данные TCP, добавьте в фильтр следующую строку:
{ "ipProtocol": "TCP" }query GetTCPFlags(
$accountTag: string
$filter: AccountIpFlows1mGroupsFilter_InputObject
) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
tcpFlags: ipFlows1mGroups(
filter: $filter
limit: 8
orderBy: [sum_(bits/packets)_DESC]
) {
sum {
count: (bits/packets)
}
dimensions {
tcpFlags
}
}
}
}
}Сводный отчёт
Запрос сводного отчёта обобщает общую активность, поэтому фильтрует данные только по выбранному временному интервалу и игнорирует все остальные фильтры, применённые в аналитике. Используйте разные запросы в зависимости от того, какой временной интервал вы хотите изучить и какой трафик наблюдается на аккаунте.
Если временной интервал абсолютный, например с 09:00 25 марта до 17:00 25 марта, выполните запрос на атаки за этот период. Используйте подходящий узел запроса, например ipFlows1dGroups, для временного интервала.
query GetPreviousAttacks($accountTag: string, $filter: filter) {
viewer {
accounts(filter: {accountTag: $accountTag}) {
${queryNode}(limit: 1000, filter: $filter) {
dimensions {
attackId
}
sum {
packets
bits
}
}
}
}
}Если временной интервал относительный, например последние 24 часа или последние 30 минут, выполните запрос к ipFlows1mGroup узел, чтобы проверить, были ли атаки за последние пять минут. Атаки за последние пять минут считаются текущими: журнал активности отображает Present.
В ответе на запрос перечислены attackID значения текущих атак.
query GetOngoingAttackIds($accountTag: string, $filter: filter) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
ipFlows1mGroups(limit: 1000, filter: $filter) {
dimensions {
attackId
}
}
}
}
}Если атаки происходят в данный момент, выполните запрос к ipFlows1mAttacksGroups узел, отфильтровав его с помощью attackID значения из предыдущего запроса. Приведённый ниже запрос возвращает максимальную скорость в битах и пакетах.
query GetOngoingAttacks($accountTag: string, $filter: filter) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
ipFlows1mAttacksGroups(limit: 1000, filter: $filter) {
dimensions {
attackId
}
max {
bitsPerSecond
packetsPerSecond
}
}
}
}
}Если атаки в данный момент не происходят, используйте GetPreviousAttacks запрос для отображения данных об атаках за абсолютный интервал времени.