IBM Cloud Docs
设置 GraphQL

设置 GraphQL

GraphQL 是一种用于 API 的查询语言。 您可以在单个 /graphql 端点上运行查询。 GraphiQL使用内置自省系统,通过模式公开信息。

GraphQL 分析 API 端点仅适用于企业级计划。

先决条件

您必须拥有以下权限才能继续:

  • 您必须在实例级别或区域级别拥有查看器权限。
  • 您必须拥有区域级别的“阅读器”权限。

GraphiQL工具

使用 GraphiQL, 可以探索模式并测试 GraphQL 端点的查询。

  1. 下载并安装 GraphiQL.
  2. 打开 GraphiQL 应用程序,输入您要授权的 HTTP 标题。
  3. GraphQl Endpoint 字段中输入正确的端点。 使用 https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql

窗口分为查询窗格和响应窗格。 您可以定义查询变量,这些变量将在查询窗格中插值到查询中。

要建立查询,请按照以下步骤操作。

  1. Method 列表菜单中选择 POST
  2. 点击编辑 HTTP 标题。
  3. 输入 X-Auth-User-Token 或授权令牌,并设置 Content-Type:application/json. 请务必保存。

在查询窗格中开始创建查询。 使用 Document Explorer 浏览模式和文档。 文档资源管理器显示了数据集、维度、操作和功能的不同可用选项。 在文档管理器中,“区”和“域”是同义词。

将以下测试片段粘贴到查询窗格中,并观察响应窗格中的响应,调整 datetime 以满足您的需要。

query {
   viewer {
      zones(filter: {zoneTag: "<your domain ID>"}) {
         httpRequests1hGroups(limit: 5, filter: { datetime_gt: "2020-08-30T04:00:00Z", datetime_lt: "2020-08-31T06:00:00Z"}) {
            sum {
              countryMap {
                bytes
                clientCountryName
              }
            }
            dimensions {
              date
              datetime
             }
          }
         firewallEventsAdaptiveGroups(limit: 10, filter: { datetime_gt: "2020-08-30T04:00:00Z", datetime_lt: "2020-08-31T06:00:00Z"}) {
               count
               dimensions {
                  clientCountryName
                  clientAsn
                  datetimeHour
               }
             }
          }
       }
     }

查询基础知识

GraphQL将数据结构为图形。 要获取所需的数据,可以探索图形的边缘。 这是一个查询格式示例:

viewer {
      zones(filter:...) {
         requests(filter:...) {
           date, time, bytes,...
         }
      }
}

运行查询的用户的初始节点是 viewer。 查看器可以访问一个或多个域(区)。 每个区域包含不同的数据集,如区域的防火墙事件。

表示汇总数据的节点包括 groups 后缀,例如 firewallEventsAdaptiveGroups。 每个组都遵循特定的结构,如下例所示。

type ExampleGroup {
    count # No subfields, it is just the group size.
    sum {
        # fields that support summing (numbers, maps of numbers)
    }
    avg {
        # fields that support averaging (numbers)
    }
    uniq {
        # fields that support uniqueing (numbers, strings, enums, IPs, dates, etc.)
    }
}

本例显示了一个有效的组:

  httpRequests1mGroups {
    sum {
      bytes
    }
    uniq {
      uniques # unique IPs
    }
    dimensions {
      datetimeMinute
    }
  }

数据集

以下是可用的常用数据集列表。 有关数据集的更多信息,您可以使用 GraphQL自省机制

常用GraphQL数据集
数据集 Node
浏览器洞察 browserInsightsAdaptiveGroups
防火墙活动日志 firewallEventsAdaptive firewallEventsAdaptiveByTimeGroups
防火墙分析 firewallEventsAdaptiveGroups
健康检查分析 healthCheckEvents healthCheckEventsGroups
HTTP 请求 httpRequests1mGroups httpRequests1hGroups httpRequests1dGroups httpRequestsAdaptiveGroups
图像大小调整分析 imageResizingRequests1mGroups
负载平衡分析 loadBalancingRequests loadBalancingRequestsGroups
SYN 攻击(DoS分析) synAvgPps1mGroups
边缘功能指标 workersInvocationsAdaptive

错误

GraphQL Analytics API是一个基于 HTTPS 请求和JSON响应的RESTful API,并返回熟悉的 HTTP 状态代码(例如 404500504 )。根据 GraphQL 规范,200 响应可能包含错误,这与常见的REST方法相反。

所有响应都包含一个错误数组,如果没有错误,则该数组为空。 非空错误包含 messagepathtimestamp

以下代码是错误响应示例:

{
  "data": null,
  "errors": [
    {
      "message": "cannot request data older than 2678400s",
      "path": [
        "viewer",
        "zones",
        "0",
        "firewallEventsAdaptiveGroups"
      ],
      "extensions": {
        "timestamp": "2019-12-09T21:27:19.195060142Z"
      }
    }
  ]
}

限制

保留历史数据的限制如下表所示。

历史数据限制
数据节点 企业
browserInsightsAdaptiveGroups 30 天
firewallEventsAdaptiveByTimeGroups 30 天
firewallEventsAdaptiveGroups 30 天
healthCheckEventsGroups 90 天
healthCheckEvents 90 天
httpRequestsAdaptiveGroups 30 天
httpRequests1dGroups 365 天
httpRequests1hGroups 90 天
httpRequests1mGroups 7 天
loadBalancingRequestsGroups 30 天
loadBalancingRequests 30 天
synAvgPps1mGroups 7 天

查询账户限额设置

要获取数据节点限制的具体信息,请使用 settings 节点。

设置节点字段
字段 描述
enabled 如果数据集(节点)对当前计划可用,则返回 true
maxDuration 定义一次查询可请求的最长时间段(以秒为单位)(因数据节点而异)。
maxNumberOfFields 定义一次查询可请求的字段最大数量(因数据节点而异)。
maxPageSize 定义一次查询可返回的最大记录数(因数据节点而异)。
notOlderThan 限制查询能搜索到多远的记录(以秒为单位,因数据节点和计划而异)。

以下是一个查询示例:

{
  viewer {
    zones(filter: { zoneTag: $zoneTag }) {
      settings {
        browserInsightsAdaptiveGroups {
          maxDuration
          maxNumberOfFields
          maxPageSize
          enabled
          notOlderThan
        }
      }
    }
  }
}

查询答复如下:

{
  "data": {
    "viewer": {
      "zones": [
        {
          "settings": {
            "browserInsightsAdaptiveGroups": {
              "enabled": true,
              "maxDuration": 2592000,
              "maxNumberOfFields": 30,
              "maxPageSize": 10000,
              "notOlderThan": 2595600
            }
          }
        }
      ]
    }
  },
  "errors": null
}

查询限制

查询所能返回的数据量是有限的,用户每天的数据量也有限制。 除 API 规定的一般费率限制外,还适用以下限制:

  • 区域范围查询最多可包括 10 个区域。
  • settings 中的 maxNumberOfFields 所示,查询最多可请求 30 个字段。
  • 回复最多可返回 10,000 条记录。 settings 中的 maxPageSize 表示此限制。

查询必须使用 limit 参数明确指定要返回的记录上限。

排序

您可以使用 orderBy 参数对查询结果元素的顺序进行排序。 默认情况下,结果按数据集(表)的主键排序。 如果指定了另一个要排序的字段,则主键会包含在排序键中,以保持分页结果的一致性。

不支持在嵌套结构内排序。

排序示例

原始数据分类:

firewallEventsAdaptive (orderBy: [clientCountryName_ASC]) {
    clientCountryName
}

使用多个字段对原始数据进行排序:

firewallEventsAdaptive (orderBy: [clientCountryName_ASC, datetime_DESC]) {
    clientCountryName
    datetime
}

按聚合功能进行分组排序:

httpRequests1hGroups (orderBy: [sum_bytes_DESC]){
    sum {
        bytes
        requests
    }
    dimensions {
        datetime
    }
}

分页

可以使用 limitorderBy 和过滤参数进行分页,将查询结果分成更小的部分。 GraphQL Analytics API 不支持用于分页的游标。

  • limit(整数)定义返回多少条记录。
  • orderBy(字符串)定义数据的排序顺序。

不带光标的查询页面

以下示例假定 dateclientCountryName 关系是唯一的。

获取查询的前 n 个结果。

要限制结果,请添加 limit 参数。 例如,查询前两条记录。

firewallEventsAdaptive (limit: 2, orderBy: [datetime_ASC, clientCountryName_ASC]) {
    datetime
    clientCountryName
}

按日期指定排序顺序比同时按日期和国家指定排序顺序得到的结果更具体。

查询答复如下:

{
  "firewallEventsAdaptive" : [
    {
      "datetime": "2018-11-12T00:00:00Z",
      "clientCountryName": "UM"
    },
    {
      "datetime": "2018-11-12T00:00:00Z",
      "clientCountryName": "US"
    }
  ]
}

使用过滤器查询下一页

要获取下一个 n 结果,请指定一个过滤器,以排除上一个查询的最后一个结果。 使用前面的示例,您可以在 clientCountryName 字段中追加大于操作符 (_gt),在 datetime 字段中追加大于或等于操作符。 通过特定的顺序,您可以获得最完整的结果。

firewallEventsAdaptive (limit: 2, orderBy: [datetime_ASC, clientCountryName_ASC], filter: {date_geq: "2018-11-12T00:00:00Z", clientCounterName_gt: "US"}) {
    date
    clientCountryName
}

查询答复如下:

{
  "firewallEventsAdaptive" : [
    {
      "datetime": "2018-11-12T00:00:00Z",
      "clientCountryName": "UY"
    },
    {
      "datetime": "2018-11-12T00:00:00Z",
      "clientCountryName": "UZ"
    }
  ]
}

查询上一页

要获取之前的 n 结果,请颠倒筛选器和排序顺序。

firewallEventsAdaptive (limit: 2, orderBy: [datetime_DESC, clientCountryName_DESC, filter: {date_leq: "2018-11-12T00:00:00Z", clientCountryName_lt: "UY"}]) {
  datetime
  clientCountryName
}

查询答复如下:

{
  "firewallEventsAdaptive" : [
    {
      "datetime": "2018-11-12T00:00:00Z",
      "clientCountryName": "US"
    },
    {
      "datetime": "2018-11-12T00:00:00Z",
      "clientCountryName": "UM"
    }
  ]
}

过滤

过滤器可将查询限制在特定账户或区域(域)集、日期请求或特定查询代理上。 如果没有过滤器,性能可能会下降,结果可能包括不重要的数据。

结构

GraphQL 过滤器由 GraphQL 输入对象表示。

过滤器可用作以下资源的参数:

  • 区(域)
  • 表格(数据集)
  • 帐户

区(域)过滤器

区域过滤器允许按区域(域)ID(zoneTag)查询与区域相关的数据。

zones(filter: {zoneTag: "your domain (zone) ID"}) {
    ...
}

区域过滤器必须符合以下语法:

filter
    { zoneTag: t }
    { zoneTag_gt: t }
    { zoneTag_in: [t, ...] }

不支持复合筛选器(逗号分隔、ANDOR)。 区总是按字母数字排序。

表格(数据集)过滤器

表过滤器要求至少查询一个节点。 AND 操作符可用于创建和组合多节点过滤器。

账户过滤器

支持账户级过滤,并有一个必需的过滤参数。 例如:

accounts(filter: {accountTag: $accountTag}) {
    ...
}

操作程序

根据节点类型和节点名称的不同,对操作员的支持也不同。 以下操作符适用于所有类型:

受支持的运算符
运算符 比较
gt 大于
lt 小于
geq 大于或等于
leq 小于或等于
neq 不等于
in in

示例

一般示例

{
  myQuery(
    filter: {
      clientCountry: "UK" # all objects having client country equal to "UK"
      datetime_gt: "2020-01-01 10:00:00" # all object having datetime greater than "2020-01-01 10:00:00"
    }
  )
}

筛选特定节点:

httpRequests1hGroups(filter: {datetime: "2020-01-01 10:00:00"}) {
    ...
}

对多个字段进行筛选:

httpRequests1hGroups(filter: {datetime_gt: "2018-01-01 10:00:00", datetime_lt: "2018-01-01 11:00:00"}) {
    ...
}

使用 OR 操作符进行筛选:

httpRequests1hGroups(filter: {
    datetime: "2020-01-01 10:00:00",
    OR:[{clientCountryName: "US"}, {clientCountryName: "UK"}]) {
    ...
}