IBM Cloud Docs
查询基础知识

查询基础知识

使用GraphQL进行指标收集查询有几个基本方面。

GraphQL结构

GraphQL将数据结构为图形。 GraphQL使用模式来定义数据图中的对象及其层次结构。 您可以通过查询来获取所需的数据,从而探索图的边缘。 这些查询必须尊重模式的结构。

节点及其字段是GraphQL查询的核心。 节点是一种特定类型的对象;该类型指定了构成该对象的字段。

字段可以是另一个节点,适当的查询将包含嵌套元素。 有些节点看起来像函数,可以接受参数来限制其作用范围。 您可以在每个节点上应用过滤器。

CloudflareGraphQL模式

针对 CloudflareGraphQL模式的典型查询由四个主要部分组成:

  • viewer- 根节点。
  • zones 或 "accounts--指明查询范围(要查询的域区域或账户)。 viewer 可以访问一个 "zones"或 "accounts",也可以同时访问两个。
  • 数据节点数据集- 表示要查询的数据。zones 或 "accounts 可能包含一个或多个数据集。
  • 字段组--"数据集的一组字段或嵌套字段。

GraphQL 的查询必须通过 HTTP发送,有效负载为JSON格式,包含以下字段:

{
  "query": "",
  "variables": {}
}

从上述结构来看,“query 字段必须包含一个格式化为单行字符串的GraphQL查询(这意味着所有换行符都应去除或转义),而”variables 是一个对象,包含查询本身中使用的占位符的所有值。

单一数据集示例

在以下示例中,GraphQL从区域范围的 firewallEventsAdaptive 数据集中获取了2个WAF事件的 host 字段,分别为 datetimeaction 和客户端请求 HTTP 主机。

{
  viewer {
    zones(filter: { zoneTag: $tag }) {
      firewallEventsAdaptive(
        filter: {
          datetime_gt: $start
          datetime_lt: $end
        }
        limit: 2
        orderBy: [
          datetime_DESC
        ]
      ) {
        action
        datetime
        host: clientRequestHTTPHost
      }
    }
  }
}

该查询中有变量占位符:"$tag、"$start 和 "$end。 它通过将这些占位符放入有效载荷的 "variables 字段,在查询的同时提供这些占位符的值。

定义变量:

{
  "tag": "<zone-tag>",
  "start": "2020-08-03T02:07:05Z",
  "end": "2020-08-03T17:07:05Z"
}

有多种方法可将您的查询发送到 CloudflareGraphQLAPI。 您可以使用自己喜欢的GraphQL客户端或 CLI,使用cURL 发送请求。

该查询的回复示例:

{
  "data": {
    "viewer": {
      "zones": [
        {
          "firewallEventsAdaptive": [
            {
              "action": "log",
              "host": "cloudflare.guru",
              "datetime": "2020-08-03T17:07:03Z"
            },
            {
              "action": "log",
              "host": "cloudflare.guru",
              "datetime": "2020-08-03T17:07:01Z"
            }
          ]
        }
      ]
    }
  },
  "errors": null
}

在单个GraphQLAPI 请求中查询多个数据集

如前所述,查询可能包含一个或多个节点(数据集)。 在应用程序接口层面,数据提取是同时进行的,但响应会延迟,直到所有数据集查询都收到结果。 如果在执行过程中出现任何故障,整个查询将被终止,并返回错误信息。

一次尝试查询两个数据集的示例:

{
  viewer {
    zones(filter: { zoneTag: $tag }) {
      last10Events: firewallEventsAdaptive(
        filter: {
          datetime_gt: $start
          datetime_lt: $end
        }
        limit: 10
        orderBy: [
          datetime_DESC
        ]
      ) {
        action
        datetime
        host: clientRequestHTTPHost
      }
      top3DeviceTypes: httpRequestsAdaptiveGroups(
        filter: {
          date: $ts
        }
        limit: 10
        orderBy: [
          count_DESC
        ]
      ) {
        count
        dimensions {
          device: clientDeviceType
        }
      }
    }
  }
}

上一次查询的变量集:

{
  "tag": "<zone-tag>",
  "start": "2022-10-02T00:26:49Z",
  "end": "2022-10-04T14:26:49Z",
  "ts": "2022-10-04"
}

使用前面的变量进行查询的回复示例:

{
  "data": {
    "viewer": {
      "zones": [
        {
          "last10Events": [
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-04T08:41:09Z"
            },
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-04T08:41:09Z"
            },
            {
              "action": "block",
              "country": "RU",
              "datetime": "2022-10-04T01:09:36Z"
            },
            {
              "action": "block",
              "country": "US",
              "datetime": "2022-10-03T14:26:49Z"
            },
            {
              "action": "block",
              "country": "US",
              "datetime": "2022-10-03T14:26:46Z"
            },
            {
              "action": "block",
              "country": "CN",
              "datetime": "2022-10-02T23:51:26Z"
            },
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-02T23:39:41Z"
            },
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-02T23:39:41Z"
            }
          ],
          "top3DeviceTypes": [
            {
              "count": 4580,
              "dimensions": {
                "device": "desktop"
              }
            }
          ]
        }
      ]
    }
  },
  "errors": null
}