设置 GraphQL
GraphQL 是一种用于 API 的查询语言。 您可以在单个 /graphql
端点上运行查询。 GraphiQL使用内置自省系统,通过模式公开信息。
GraphQL 分析 API 端点仅适用于企业级计划。
先决条件
您必须拥有以下权限才能继续:
- 您必须在实例级别或区域级别拥有查看器权限。
- 您必须拥有区域级别的“阅读器”权限。
GraphiQL工具
使用 GraphiQL, 可以探索模式并测试 GraphQL 端点的查询。
- 下载并安装 GraphiQL.
- 打开 GraphiQL 应用程序,输入您要授权的 HTTP 标题。
- 在 GraphQl Endpoint 字段中输入正确的端点。 使用
https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql
。
窗口分为查询窗格和响应窗格。 您可以定义查询变量,这些变量将在查询窗格中插值到查询中。
要建立查询,请按照以下步骤操作。
- 从 Method 列表菜单中选择
POST
。 - 点击编辑 HTTP 标题。
- 输入
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自省机制。
数据集 | 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 状态代码(例如 404
、500
、504
)。根据 GraphQL 规范,200
响应可能包含错误,这与常见的REST方法相反。
所有响应都包含一个错误数组,如果没有错误,则该数组为空。 非空错误包含 message
、path
和 timestamp
。
以下代码是错误响应示例:
{
"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
}
}
分页
可以使用 limit
、orderBy
和过滤参数进行分页,将查询结果分成更小的部分。 GraphQL Analytics API 不支持用于分页的游标。
limit
(整数)定义返回多少条记录。orderBy
(字符串)定义数据的排序顺序。
不带光标的查询页面
以下示例假定 date
和 clientCountryName
关系是唯一的。
获取查询的前 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, ...] }
不支持复合筛选器(逗号分隔、AND
、OR
)。 区总是按字母数字排序。
表格(数据集)过滤器
表过滤器要求至少查询一个节点。 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"}]) {
...
}