IBM Cloud Docs
Consulta de conceptos básicos

Consulta de conceptos básicos

Hay varios aspectos básicos de la consulta con GraphQL para la recopilación de métricas.

Estructura de una consulta GraphQL

GraphQL estructura los datos como un gráfico. GraphQL utiliza un esquema para definir los objetos y su jerarquía en su gráfico de datos. Puedes explorar las aristas del grafo utilizando consultas para obtener los datos necesarios. Estas consultas deben respetar la estructura del esquema.

Un nodo, seguido de sus campos, es el núcleo de una consulta GraphQL. Un nodo es un objeto de un tipo específico; el tipo especifica los campos que componen el objeto.

Un campo puede ser otro nodo en el que la consulta correspondiente contendría elementos anidados. Algunos nodos parecen funciones que pueden recibir argumentos para limitar el ámbito sobre el que pueden actuar. Puede aplicar filtros en cada nodo.

Esquema GraphQL de Cloudflare

Una consulta típica contra el esquema GraphQL de Cloudflare consta de cuatro componentes principales:

  • viewer- El nodo raíz.
  • 'zones o ' accounts ' - Indique el ámbito de la consulta (el área de dominio o la cuenta que desea consultar). El " viewer " puede acceder a un " zones o a un " accounts, o a ambos.
  • nodo de datos o conjunto de datos- Representa los datos que desea consultar. zones o " accounts " pueden contener uno o varios conjuntos de datos.
  • fieldset- Conjunto de campos o campos anidados del conjunto de datos.

La consulta a la API GraphQL de Cloudflare debe enviarse mediante una solicitud HTTP POST con la carga útil en formato JSON que conste de estos campos:

{
  "query": "",
  "variables": {}
}

De la estructura anterior, el campo ' query ' debe contener una consulta GraphQL formateada como una cadena de una sola línea (lo que significa que todos los símbolos de nueva línea deben ser despojados o escapados), cuando ' variables es un objeto que contiene todos los valores de los marcadores de posición utilizados en la propia consulta.

Un ejemplo de conjunto de datos único

En el siguiente ejemplo, la consulta GraphQL recupera un datetime, action, y el host HTTP de la solicitud del cliente como el campo host de 2 eventos WAF de la zona-escopiada el conjunto de datos firewallEventsAdaptive.

{
  viewer {
    zones(filter: { zoneTag: $tag }) {
      firewallEventsAdaptive(
        filter: {
          datetime_gt: $start
          datetime_lt: $end
        }
        limit: 2
        orderBy: [
          datetime_DESC
        ]
      ) {
        action
        datetime
        host: clientRequestHTTPHost
      }
    }
  }
}

En esta consulta, hay marcadores de posición variables: ' $tag, ' $start, y ' $end. Proporciona valores para esos marcadores de posición junto con la consulta, colocándolos en el campo " variables de la carga útil.

Defina sus variables:

{
  "tag": "<zone-tag>",
  "start": "2020-08-03T02:07:05Z",
  "end": "2020-08-03T17:07:05Z"
}

Hay varias formas de enviar su consulta a la API GraphQL de Cloudflare. Puede utilizar su cliente GraphQL o CLI favorito para enviar una solicitud utilizando cURL.

Un ejemplo de respuesta para esta consulta:

{
  "data": {
    "viewer": {
      "zones": [
        {
          "firewallEventsAdaptive": [
            {
              "action": "log",
              "host": "cloudflare.guru",
              "datetime": "2020-08-03T17:07:03Z"
            },
            {
              "action": "log",
              "host": "cloudflare.guru",
              "datetime": "2020-08-03T17:07:01Z"
            }
          ]
        }
      ]
    }
  },
  "errors": null
}

Consulta de varios conjuntos de datos en una sola solicitud de API GraphQL

Como ya se ha mencionado, una consulta puede contener uno o varios nodos (conjuntos de datos). A nivel de la API, la extracción de datos se realiza simultáneamente, pero la respuesta se retrasa hasta que todas las consultas al conjunto de datos reciben sus resultados. Si se produce algún fallo durante la ejecución, se finaliza toda la consulta y se devuelve el error.

Un ejemplo de consulta para dos conjuntos de datos en un solo intento:

{
  viewer {
    zones(filter: { zoneTag: $tag }) {
      last10Events: firewallEventsAdaptive(
        filter: {
          datetime_gt: $start
          datetime_lt: $end
        }
        limit: 10
        orderBy: [
          datetime_DESC
        ]
      ) {
        action
        datetime
        host: clientRequestHTTPHost
      }
      top3DeviceTypes: httpRequestsAdaptiveGroups(
        filter: {
          date: $ts
        }
        limit: 10
        orderBy: [
          count_DESC
        ]
      ) {
        count
        dimensions {
          device: clientDeviceType
        }
      }
    }
  }
}

Un conjunto de variables para la consulta anterior:

{
  "tag": "<zone-tag>",
  "start": "2022-10-02T00:26:49Z",
  "end": "2022-10-04T14:26:49Z",
  "ts": "2022-10-04"
}

Un ejemplo de respuesta para la consulta utilizando las variables anteriores:

{
  "data": {
    "viewer": {
      "zones": [
        {
          "last10Events": [
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-04T08:41:09Z"
            },
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-04T08:41:09Z"
            },
            {
              "action": "block",
              "country": "RU",
              "datetime": "2022-10-04T01:09:36Z"
            },
            {
              "action": "block",
              "country": "US",
              "datetime": "2022-10-03T14:26:49Z"
            },
            {
              "action": "block",
              "country": "US",
              "datetime": "2022-10-03T14:26:46Z"
            },
            {
              "action": "block",
              "country": "CN",
              "datetime": "2022-10-02T23:51:26Z"
            },
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-02T23:39:41Z"
            },
            {
              "action": "block",
              "country": "TR",
              "datetime": "2022-10-02T23:39:41Z"
            }
          ],
          "top3DeviceTypes": [
            {
              "count": 4580,
              "dimensions": {
                "device": "desktop"
              }
            }
          ]
        }
      ]
    }
  },
  "errors": null
}