Configurando o GraphQL
O GraphQL é uma linguagem de consulta para APIs. É possível executar consultas em um único terminal /graphql. O GraphiQL usa um sistema de introspecção integrado para expor informações por meio do esquema.
O terminal de API de análise do GraphQL está disponível apenas para planos no nível corporativo.
Pré-requisitos
Deve-se ter as permissões a seguir para continuar:
- Deve-se ter permissão de Visualizador no nível da instância ou no nível da zona.
- Deve-se ter permissão de Leitor no nível da zona.
Ferramenta GraphiQL
Usando o GraphiQL, é possível explorar as consultas de esquema e de teste para o terminal GraphQL.
- Baixar e instalar GraphiQL.
- Abra o aplicativo GraphiQL e insira os cabeçalhos de HTTP que você deseja autorizar.
- Insira o terminal correto no campo Terminal do GraphQl. Use o
https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql.
A janela é dividida em uma área de janela de consulta e uma de resposta. É possível definir as variáveis de consulta, que são interpoladas na consulta na área de janela de consulta.
Para construir uma consulta, siga estas etapas.
- Selecione
POSTno menu de listagem Método. - Clique em Editar cabeçalhos de HTTP.
- Insira o token
X-Auth-User-Tokenou de Autorização e configure o Content-Type:application/json. Certifique-se de salvá-los.
Comece a construir sua consulta na área de janela de consulta. Use o Explorer do documento para explorar o esquema e a documentação. O Explorer do Documento mostra as diferentes opções disponíveis para conjuntos de dados, dimensões, operações e funções. As palavras "zona" e "domínio" são sinônimas no Explorer do Documento.
Cole o fragmento de teste a seguir na área de janela de consulta e observe a resposta na área de janela de resposta, ajustando o datetime para atender às suas necessidades.
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
}
}
}
}
}
Consultando configurações básicas
O GraphQL estrutura dados como um gráfico. Para obter os dados que você precisa, é possível explorar as bordas do gráfico. Este é um formato de consulta de exemplo:
viewer {
zones(filter:...) {
requests(filter:...) {
date, time, bytes,...
}
}
}
O nó inicial do usuário que executa a consulta é viewer. Um visualizador está apto a acessar um ou mais domínios (zonas). Cada zona contém conjuntos de dados diferentes, como eventos de firewall para uma zona.
Os nós que representam dados agregados incluem o sufixo groups, por exemplo, firewallEventsAdaptiveGroups. Cada grupo segue uma estrutura específica, mostrada no exemplo a seguir.
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.)
}
}
Este exemplo mostra um grupo válido:
httpRequests1mGroups {
sum {
bytes
}
uniq {
uniques # unique IPs
}
dimensions {
datetimeMinute
}
}
Conjuntos de dados
A seguir, há uma lista de conjuntos de dados comumente usados que estão disponíveis. Para obter mais informações sobre conjuntos de dados, você pode usar o mecanismo de introspecçãoGraphQL.
| Conjunto de dados | Node |
|---|---|
| Insights do navegador | browserInsightsAdaptiveGroups |
| Log de atividades do firewall | firewallEventsAdaptive firewallEventsAdaptiveByTimeGroups |
| Análise de dados do firewall | firewallEventsAdaptiveGroups |
| Análise de dados de verificação de funcionamento | healthCheckEvents healthCheckEventsGroups |
| Solicitações HTTP | httpRequests1mGroups httpRequests1hGroups httpRequests1dGroups httpRequestsAdaptiveGroups |
| Análise de dados de redimensionamento de imagem | imageResizingRequests1mGroups |
| Análise de dados de balanceamento de carga | loadBalancingRequests loadBalancingRequestsGroups |
| Ataques SYN (análise de dados DoS) | synAvgPps1mGroups |
| Métricas de funções de borda | workersInvocationsAdaptive |
Erros
A API GraphQL Analytics é uma API de RESTful baseada em solicitações HTTPS e respostas JSON e retorna códigos de status HTTP familiares (por exemplo, 404, 500, 504). Em conformidade com a especificação
do GraphQL, uma resposta 200 pode conter um erro, o que contrasta com a abordagem REST comum.
Todas as respostas contêm uma matriz de erros, que é nula se não houver erros. Os erros não nulos contêm message, path e timestamp.
O código a seguir é uma resposta de erro de exemplo:
{
"data": null,
"errors": [
{
"message": "cannot request data older than 2678400s",
"path": [
"viewer",
"zones",
"0",
"firewallEventsAdaptiveGroups"
],
"extensions": {
"timestamp": "2019-12-09T21:27:19.195060142Z"
}
}
]
}
Limites
Os limites para retenção de dados históricos são definidos na tabela a seguir.
| Nó de dados | Enterprise |
|---|---|
browserInsightsAdaptiveGroups |
30 dias |
firewallEventsAdaptiveByTimeGroups |
30 dias |
firewallEventsAdaptiveGroups |
30 dias |
healthCheckEventsGroups |
90 dias |
healthCheckEvents |
90 dias |
httpRequestsAdaptiveGroups |
30 dias |
httpRequests1dGroups |
365 dias |
httpRequests1hGroups |
90 dias |
httpRequests1mGroups |
7 dias |
loadBalancingRequestsGroups |
30 dias |
loadBalancingRequests |
30 dias |
synAvgPps1mGroups |
7 dias |
Configurações de consulta para limites de conta
Para obter informações específicas relativas a limites para um nó de dados, use o nó settings.
| Campo | Descrição |
|---|---|
enabled |
Retorna true se o conjunto de dados (nó) está disponível para o plano atual. |
maxDuration |
Define o período máximo de tempo (em segundos) que pode ser solicitado em uma consulta (varia por nó de dados). |
maxNumberOfFields |
Define o número máximo de campos que podem ser solicitados em uma consulta (varia por nó de dados). |
maxPageSize |
Define o número máximo de registros que podem ser retornados em uma consulta (varia por nó de dados). |
notOlderThan |
Limita o quanto uma consulta pode procurar retroativamente no registro (em segundos, varia por nó e plano de dados). |
A seguir, uma consulta de exemplo:
{
viewer {
zones(filter: { zoneTag: $zoneTag }) {
settings {
browserInsightsAdaptiveGroups {
maxDuration
maxNumberOfFields
maxPageSize
enabled
notOlderThan
}
}
}
}
}
A resposta da consulta segue:
{
"data": {
"viewer": {
"zones": [
{
"settings": {
"browserInsightsAdaptiveGroups": {
"enabled": true,
"maxDuration": 2592000,
"maxNumberOfFields": 30,
"maxPageSize": 10000,
"notOlderThan": 2595600
}
}
}
]
}
},
"errors": null
}
Limites de consulta
O volume de dados que uma consulta pode retornar é limitado e há limites de usuários no volume de dados diários. Os limites a seguir aplicam-se além dos limites gerais de taxa impostos pela API:
- Uma consulta com escopo definido na zona pode incluir até 10 zonas.
- As consultas podem solicitar até 30 campos conforme indicado por
maxNumberOfFieldsemsettings. - As respostas podem retornar até 10.000 registros. Esse limite é indicado por
maxPageSizeemsettings.
As consultas devem especificar explicitamente o número máximo de registros a serem retornados por meio do argumento limit .
Classificação
É possível classificar a ordem dos elementos de resultado da consulta usando o argumento orderBy. Por padrão, os resultados são classificados pela chave primária do conjunto de dados (tabela). Se você especificar outro campo no
qual classificar, a chave primária será incluída na chave de classificação para manter resultados consistentes para a paginação.
A ordenação dentro das estruturas aninhadas não é suportada.
Exemplos de classificação
Classificação de dados brutos:
firewallEventsAdaptive (orderBy: [clientCountryName_ASC]) {
clientCountryName
}
Classificação de dados brutos usando vários campos:
firewallEventsAdaptive (orderBy: [clientCountryName_ASC, datetime_DESC]) {
clientCountryName
datetime
}
Classificação de grupo por função de agregação:
httpRequests1hGroups (orderBy: [sum_bytes_DESC]){
sum {
bytes
requests
}
dimensions {
datetime
}
}
Paginação
A paginação, dividindo os resultados da consulta em partes menores, pode ser feita usando limit, orderBy e parâmetros de filtragem. A API de análise de dados do GraphQL não suporta cursores para paginação.
limit(integer) define quantos registros retornar.orderBy(string) define a ordem de classificação para os dados.
Páginas de consulta sem cursores
Os exemplos a seguir supõem que os relacionamentos date e clientCountryName são exclusivos.
Obtenha os primeiros n resultados de uma consulta.
Para limitar os resultados, inclua o parâmetro limit. Por exemplo, consultar os dois primeiros registros.
firewallEventsAdaptive (limit: 2, orderBy: [datetime_ASC, clientCountryName_ASC]) {
datetime
clientCountryName
}
A especificação de uma ordem de classificação por data retorna resultados menos específicos do que a especificação de uma ordem de classificação por data e país.
A resposta da consulta segue:
{
"firewallEventsAdaptive" : [
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UM"
},
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "US"
}
]
}
Consultar a próxima página usando filtro
Para obter os próximos n resultados, especifique um filtro para excluir o último resultado da consulta anterior. Usando o exemplo anterior, é possível anexar o operador maior que (_gt) ao campo clientCountryName e o operadormaior ou igual ao campo datetime. Ao criar uma ordem específica, é possível obter os resultados mais completos.
firewallEventsAdaptive (limit: 2, orderBy: [datetime_ASC, clientCountryName_ASC], filter: {date_geq: "2018-11-12T00:00:00Z", clientCounterName_gt: "US"}) {
date
clientCountryName
}
A resposta da consulta segue:
{
"firewallEventsAdaptive" : [
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UY"
},
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UZ"
}
]
}
Consultar a página anterior
Para obter os resultados n anteriores, inverta os filtros e a ordem de classificação.
firewallEventsAdaptive (limit: 2, orderBy: [datetime_DESC, clientCountryName_DESC, filter: {date_leq: "2018-11-12T00:00:00Z", clientCountryName_lt: "UY"}]) {
datetime
clientCountryName
}
A resposta da consulta segue:
{
"firewallEventsAdaptive" : [
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "US"
},
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UM"
}
]
}
Filtragem
Os filtros restringem consultas a uma determinada conta ou conjunto de zonas (domínios), às solicitações por data ou a um agente de consulta específico. Sem filtros, o desempenho pode ser comprometido e os resultados podem incluir dados não importantes.
Estrutura
O filtro “ GraphQL ” é representado pelo objeto de entrada “ GraphQL ”.
Os filtros podem ser usados como um argumento nos recursos a seguir:
- Zonas (domínios)
- Tabelas (conjuntos de dados)
- Contas
Filtro de zona (domínio)
O filtro de zona permite a consulta de dados relacionados à zona por ID da zona (domínio) (zoneTag).
zones(filter: {zoneTag: "your domain (zone) ID"}) {
...
}
O filtro de zona deve estar em conformidade com a gramática a seguir:
filter
{ zoneTag: t }
{ zoneTag_gt: t }
{ zoneTag_in: [t, ...] }
Os filtros compostos (separados por vírgula, AND, OR) não são suportados. As zonas são sempre classificadas de maneira alfanumérica.
Filtro de tabela (conjunto de dados)
Os filtros de tabela requerem que você consulte pelo menos um nó. O operador AND pode ser usado para criar e combinar filtros multinós.
Filtro de contas
A filtragem de nível de conta é suportada e há um parâmetro de filtro necessário. Por exemplo:
accounts(filter: {accountTag: $accountTag}) {
...
}
Operadores
O suporte ao operador varia, dependendo do tipo de nó e do nome do nó. Os operadores a seguir são suportados para todos os tipos:
| Operador | Comparação |
|---|---|
gt |
superior a |
lt |
menos que |
geq |
maior ou igual a |
leq |
menos ou igual a |
neq |
não é igual |
in |
in |
Exemplos
Exemplo geral:
{
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"
}
)
}
Filtrar um nó específico:
httpRequests1hGroups(filter: {datetime: "2020-01-01 10:00:00"}) {
...
}
Filtrar em vários campos:
httpRequests1hGroups(filter: {datetime_gt: "2018-01-01 10:00:00", datetime_lt: "2018-01-01 11:00:00"}) {
...
}
Filtrar usando o operador OR:
httpRequests1hGroups(filter: {
datetime: "2020-01-01 10:00:00",
OR:[{clientCountryName: "US"}, {clientCountryName: "UK"}]) {
...
}