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.
- Descargar e instalar GraphiQL.
- Abra la aplicación GraphiQL y especifique las cabeceras HTTP que desee autorizar.
- 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.
- Seleccione
POSTen el menú de lista Método. - Pulse Editar cabeceras HTTP.
- Especifique la señal
X-Auth-User-Tokeno 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.
| 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.
| 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.
| 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
maxNumberOfFieldsensettings. - Las respuestas pueden devolver hasta 10.000 registros. Este límite lo indica
maxPageSizeensettings.
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:
| 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"}]) {
...
}