Configuración de GraphQL

GraphQL es un lenguaje de consulta para las API. Puede ejecutar consultas en un único punto final de /graphql. GraphiQL utiliza un sistema de introspección incorporado para exponer información a través del esquema.

El punto final de la API de GraphQL Analytics solo está disponible para planes de nivel de Empresa.

Requisitos previos

Debe tener los siguientes permisos para continuar:

  • Debe tener permiso de visor a nivel de instancia o de zona.
  • Debe tener permiso de lector a nivel de zona.

Herramienta GraphiQL

Utilizando GraphiQL, puede explorar las consultas de esquema y de prueba para el punto final de GraphQL.

  1. Descargar e instalar GraphiQL.
  2. Abra la aplicación GraphiQL y especifique las cabeceras HTTP que desee autorizar.
  3. Especifique el punto final correcto en el campo Punto final de GraphQl. Utilice https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql.

La ventana se divide en un panel de consulta y un panel de respuesta. Puede definir las variables de consulta, que se interpolaron en la consulta en el panel de consulta.

Para crear una consulta, siga estos pasos.

  1. Seleccione POST en el menú de lista Método.
  2. Pulse Editar cabeceras HTTP.
  3. Especifique la señal X-Auth-User-Token o de autorización, y establezca Content-Type: application/json. Asegúrese de guardarlos.

Empiece a crear la consulta en el panel de consulta. Utilice el Explorador de documentos para explorar el esquema y la documentación. El explorador de documentos muestra las distintas opciones disponibles para los conjuntos de datos, las dimensiones, las operaciones y las funciones. Las palabras "zone" y "domain" son sinónimos en el explorador de documentos.

Pegue el siguiente fragmento de código de prueba en el panel de consulta y observe la respuesta en el panel de respuesta, ajustando datetime para satisfacer sus necesidades.

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
               }
             }
          }
       }
     }

Consulta de conceptos básicos

GraphQL estructura los datos como un gráfico. Para obtener los datos que necesita, puede explorar los extremos del gráfico. Este es un formato de consulta de ejemplo:

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

El nodo inicial del usuario que ejecuta la consulta es viewer (visor). Un visor puede acceder a uno o más dominios (zonas). Cada zona contiene conjuntos de datos diferentes, como sucesos de cortafuegos para una zona.

Los nodos que representan datos agregados incluyen el sufijo groups, por ejemplo, firewallEventsAdaptiveGroups. Cada grupo sigue una estructura específica, que se muestra en el ejemplo siguiente.

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 ejemplo muestra un grupo válido:

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

Conjuntos de datos

A continuación figura una lista de los conjuntos de datos disponibles más utilizados. Para obtener más información sobre los conjuntos de datos, puede utilizar el mecanismo de introspecciónGraphQL.

Conjuntos de datos GraphQL de uso común
Conjunto de datos Node
Información del navegador browserInsightsAdaptiveGroups
Registro de actividad de cortafuegos firewallEventsAdaptive firewallEventsAdaptiveByTimeGroups
Análisis de cortafuegos firewallEventsAdaptiveGroups
Análisis de comprobación de estado healthCheckEvents healthCheckEventsGroups
Solicitudes HTTP httpRequests1mGroups httpRequests1hGroups httpRequests1dGroups httpRequestsAdaptiveGroups
Análisis de redimensionamiento de imagen imageResizingRequests1mGroups
Análisis de equilibrio de carga loadBalancingRequests loadBalancingRequestsGroups
Ataques SYN (Análisis de DoS) synAvgPps1mGroups
Métricas de Edge Functions workersInvocationsAdaptive

Errores

La API de GraphQL Analytics es una API RESTful basada en solicitudes HTTPS y respuestas JSON y devuelve códigos de estado HTTP conocidos (por ejemplo, 404, 500, 504). De conformidad con la especificación GraphQL, una respuesta de 200 puede contener un error, que contrasta con el enfoque de REST común.

Todas las respuestas contienen una matriz de errores, que es nula si no hay errores. Los errores no nulos contienen message, path y timestamp.

El código siguiente es una respuesta de error de ejemplo:

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

Límites

Los límites para retener datos históricos se definen en la tabla siguiente.

Límites de los datos históricos
Nodo de datos Enterprise
browserInsightsAdaptiveGroups 30 días
firewallEventsAdaptiveByTimeGroups 30 días
firewallEventsAdaptiveGroups 30 días
healthCheckEventsGroups 90 días
healthCheckEvents 90 días
httpRequestsAdaptiveGroups 30 días
httpRequests1dGroups 365 días
httpRequests1hGroups 90 días
httpRequests1mGroups 7 días
loadBalancingRequestsGroups 30 días
loadBalancingRequests 30 días
synAvgPps1mGroups 7 días

Valores de consulta para límites de cuenta

Para obtener información específica sobre los límites para un nodo de datos, utilice el nodo settings.

Campos del nodo Configuración
Campo Descripción
enabled Devuelve true si el conjunto de datos (nodo) está disponible para el plan actual.
maxDuration Define el periodo de tiempo máximo (en segundos) que se puede solicitar en una consulta (varía según el nodo de datos).
maxNumberOfFields Define el número máximo de campos que se pueden solicitar en una consulta (varía según el nodo de datos).
maxPageSize Define el número máximo de registros que se pueden devolver en una consulta (varía según el nodo de datos).
notOlderThan Limita hasta dónde puede buscar una consulta en el registro (en segundos, varía según el nodo de datos y el plan).

A continuación se muestra una consulta de ejemplo:

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

La respuesta de la consulta es la siguiente:

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

Límites de consulta

El volumen de datos que puede devolver una consulta es limitado y hay límites de usuario en el volumen de datos diario. Los límites siguientes se aplican además de los límites de velocidad generales aplicados por la API:

  • Una consulta de ámbito de zona puede incluir hasta 10 zonas.
  • Las consultas pueden solicitar hasta 30 campos, tal como indica maxNumberOfFields en settings.
  • Las respuestas pueden devolver hasta 10.000 registros. Este límite lo indica maxPageSize en settings.

Las consultas deben especificar explícitamente el número máximo de registros que se van a devolver mediante el argumento limit.

Ordenación

Puede ordenar el orden de los elementos de resultado de consulta utilizando el argumento orderBy. De forma predeterminada, los resultados se ordenan por la clave primaria del conjunto de datos (tabla). Si especifica otro campo por el que ordenar, la clave primaria se incluye en la clave de ordenación para mantener los resultados coherentes para la paginación.

No se da soporte a la ordenación de estructuras anidadas.

Ejemplos de ordenación

Ordenación de datos sin formato:

firewallEventsAdaptive (orderBy: [clientCountryName_ASC]) {
    clientCountryName
}

Clasificación de datos sin formato utilizando varios campos:

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

Ordenación de grupos mediante la función de agregación:

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

Paginación

La paginación, división de los resultados de la consulta en partes más pequeñas, se puede realizar utilizando los parámetros limit, orderBy y de filtrado. La API de GraphQL Analytics no da soporte a los cursores para la paginación.

  • limit (entero) define cuántos registros se deben devolver.
  • orderBy (serie) define el orden de clasificación para los datos.

Páginas de consulta sin cursores

En los siguientes ejemplos se da por supuesto que las relaciones date y clientCountryName con exclusivas.

Obtener los n primeros resultados de una consulta.

Para limitar los resultados, añada el parámetro limit. Por ejemplo, consulte los dos primeros registros.

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

La especificación de un orden de clasificación por fecha devuelve resultados menos específicos que la especificación de un orden de clasificación por fecha y por país.

La respuesta de la consulta es la siguiente:

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

Consulta de la página siguiente utilizando el filtro

Para obtener los n siguientes resultados, especifique un filtro para excluir el último resultado de la consulta anterior. Utilizando el ejemplo anterior, puede añadir el operador mayor que (_gt) al campo clientCountryName y el operador mayor o igual que al campo datetime. Creando un orden específico, se podrán obtener los resultados más completos.

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

La respuesta de la consulta es la siguiente:

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

Consultar la página anterior

Para obtener los n resultados anteriores, invierta los filtros y el orden de clasificación.

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

La respuesta de la consulta es la siguiente:

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

Filtrado

Los filtros restringen las consultas a una cuenta o conjunto de zonas (dominios) en particular, a solicitudes por fecha o a un agente de consulta específico. Sin filtros, el rendimiento puede degradarse y los resultados pueden incluir datos sin importancia.

Estructura

El filtro GraphQL está representado por el objeto de entrada GraphQL.

Los filtros se pueden utilizar como argumento en los recursos siguientes:

  • Zonas (dominios)
  • Tablas (conjuntos de datos)
  • Cuentas

Filtro de zona (dominio)

El filtro de zona permite consultar los datos relacionados con la zona por el ID de zona (dominio) (zoneTag).

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

El filtro de zona debe ajustarse a la siguiente gramática:

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

Los filtros compuestos (separados por comas, AND, OR) no están soportados. Las zonas siempre se ordenan alfanuméricamente.

Filtro de tabla (conjunto de datos)

Los filtros de tabla requieren que se consulte al menos un nodo. El operador AND se puede utilizar para crear y combinar filtros de varios nodos.

Filtro de cuentas

Se da soporte al filtrado a nivel de cuenta y hay un parámetro de filtro necesario. Por ejemplo:

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

Operadores

El soporte de operadores varía según el tipo de nodo y el nombre de nodo. Se da soporte a los operadores siguientes para todos los tipos:

Operadores soportados
Operador Comparación
gt mayor que
lt menor que
geq mayor que o igual que
leq menor que o igual a
neq no igual a
in in

Ejemplos

Ejemplo general:

{
  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 un nodo específico:

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

Filtrar en varios campos:

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

Filtrar utilizando el operador OR:

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