GraphQL einrichten

GraphQL ist eine Abfragesprache für APIs. Sie können Abfragen für einen einzelnen /graphql-Endpunkt ausführen. GraphiQL verwendet ein integriertes Introspektionssystem, um Informationen über das Schema zugänglich zu machen.

Der API-Endpunkt der GraphQL-Analyse ist nur für Enterprise-Pläne verfügbar.

Voraussetzungen

Um fortfahren zu können, müssen Sie über die folgenden Berechtigungen verfügen:

  • Sie müssen auf Instanzebene oder Zonenebene anzeigeberechtigt sein.
  • Sie müssen auf Zonenebene leseberechtigt sein.

GraphiQL-Tool

Mithilfe von GraphiQL können Sie das Schema und die Testabfragen für den GraphQL-Endpunkt durchsuchen.

  1. Herunterladen und installieren GraphiQL.
  2. Öffnen Sie die GraphiQL-Anwendung und geben Sie die HTTP-Header ein, die Sie autorisieren möchten.
  3. Geben Sie den richtigen Endpunkt im Feld GraphQl Endpoint ein. Verwenden Sie https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql.

Das Fenster ist in einen Abfrage- und einen Antwortbereich unterteilt. Sie können die Abfragevariablen definieren, die im Abfragebereich in die Abfrage interpoliert werden.

Führen Sie die folgenden Schritte aus, um eine Abfrage zu erstellen.

  1. Wählen Sie POST im Listenmenü Method aus.
  2. Klicken Sie auf Edit HTTP Headers.
  3. Geben Sie das X-Auth-User-Token- oder Authorization-Token ein und legen Sie folgenden Content-Type fest: application/json. Speichern Sie dies.

Beginnen Sie mit der Erstellung Ihrer Abfrage im Abfragebereich. Verwenden Sie den Document Explorer, um das Schema und die Dokumentation zu erkunden. Der Document Explorer zeigt die verschiedenen verfügbaren Optionen für Datasets, Dimensionen, Operationen und Funktionen an. Die Wörter "zone" und "domain" sind im Document Explorer gleichbedeutend.

Fügen Sie das folgende Test-Snippet in den Abfragebereich ein und beobachten Sie die Antwort im Antwortbereich. Passen Sie datetime an Ihre Anforderungen an.

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

Grundlagen zu Abfragen

In GraphQL werden Daten als Diagramm strukturiert. Um die gewünschten Daten abzurufen, können Sie die Kanten (Edges) des Diagramms erkunden. Dies ist ein Beispiel für ein Abfrageformat:

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

Der Anfangsknoten des Benutzers, der die Abfrage ausführt, ist viewer. Ein 'Viewer' ist in der Lage, auf eine oder mehrere Domänen (Zonen) zuzugreifen. Jede Zone enthält verschiedene Datasets, wie z. B. Firewallereignisse für eine Zone.

Knoten, die zusammengefasste Daten darstellen, enthalten das Suffix groups, z. B. firewallEventsAdaptiveGroups. Jede Gruppe folgt einer bestimmten Struktur, die im folgenden Beispiel dargestellt ist.

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

Dieses Beispiel zeigt eine gültige Gruppe:

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

Datasets

Im Folgenden finden Sie eine Liste häufig verwendeter Datensätze, die verfügbar sind. Für weitere Informationen über Datensätze können Sie den GraphQL verwenden.

Häufig verwendete GraphQL
Dataset Node
Browser-Insights browserInsightsAdaptiveGroups
Firewallaktivitätenprotokoll firewallEventsAdaptive firewallEventsAdaptiveByTimeGroups
Firewallanalyse firewallEventsAdaptiveGroups
Statusprüfungsanalyse healthCheckEvents healthCheckEventsGroups
HTTP-Anforderungen httpRequests1mGroups httpRequests1hGroups httpRequests1dGroups httpRequestsAdaptiveGroups
Analyse für Bildgrößenänderung imageResizingRequests1mGroups
Lastausgleichsanalyse loadBalancingRequests loadBalancingRequestsGroups
SYN-Angriffe (DoS-Analyse) synAvgPps1mGroups
Metriken für Edge-Funktionen workersInvocationsAdaptive

Fehler

Die GraphQL-Analyse-API ist eine REST-konforme API, die auf HTTPS-Anforderungen und JSON-Antworten basiert und bekannte HTTP-Statuscodes zurückgibt (z. B. 404, 500, 504). In Übereinstimmung mit der GraphQL-Spezifikation kann eine 200 -Antwort einen Fehler enthalten, der im Gegensatz zum allgemeinen REST-Ansatz steht.

Alle Antworten enthalten einen Fehlerbereich, der null ist, wenn keine Fehler auftreten. Die Fehler außer null können message, path und timestamp enthalten.

Der folgende Code ist eine Beispielfehlerantwort:

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

Grenzwerte

Die maximale Dauer für das Beibehalten der Protokolldaten ist in der folgenden Tabelle definiert.

Grenzwerte für historische Daten
Datenknoten Enterprise
browserInsightsAdaptiveGroups 30 Tage
firewallEventsAdaptiveByTimeGroups 30 Tage
firewallEventsAdaptiveGroups 30 Tage
healthCheckEventsGroups 90 Tage
healthCheckEvents 90 Tage
httpRequestsAdaptiveGroups 30 Tage
httpRequests1dGroups 365 Tage
httpRequests1hGroups 90 Tage
httpRequests1mGroups 7 Tage
loadBalancingRequestsGroups 30 Tage
loadBalancingRequests 30 Tage
synAvgPps1mGroups 7 Tage

Abfrageeinstellungen für Kontogrenzwerte

Um bestimmte Informationen zu den Grenzwerten für einen Datenknoten abzurufen, verwenden Sie den Knoten settings.

Felder des Knotens Einstellungen
Feld Beschreibung
enabled Gibt true zurück, wenn das Dataset (Knoten) für den aktuellen Plan verfügbar ist.
maxDuration Definiert den maximalen Zeitraum (in Sekunden), der in einer Abfrage angefordert werden kann (variiert je nach Datenknoten).
maxNumberOfFields Definiert die maximale Anzahl der Felder, die in einer Abfrage angefordert werden können (variiert je nach Datenknoten).
maxPageSize Definiert die maximale Anzahl von Datensätzen, die in einer Abfrage zurückgegeben werden können (variiert je nach Datenknoten).
notOlderThan Begrenzt, wie weit zurück im Datensatz eine Abfrage suchen kann (in Sekunden, variiert je nach Datenknoten und Plan).

Es folgt eine Beispielabfrage:

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

Die Abfrageantwort lautet wie folgt:

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

Abfragegrenzwerte

Der Umfang der Daten, die eine Abfrage zurückgeben kann, ist begrenzt und es gibt Benutzergrenzwerte für das tägliche Datenvolumen. Die folgenden Grenzwerte gelten zusätzlich zu den allgemeinen Ratenbegrenzungen, die von der API erzwungen werden:

  • Eine zonenbezogene Abfrage kann bis zu 10 Zonen enthalten.
  • Abfragen können bis zu 30 Felder anfordern, die durch maxNumberOfFields in settings angegeben werden.
  • Die Antworten können bis zu 10.000 Datensätze zurückgeben. Dieser Grenzwert wird durch maxPageSize in settings angegeben.

Abfragen müssen die maximale Anzahl der zurückzugebenden Datensätze mithilfe des Arguments limit explizit angeben.

Sortieren

Sie können die Reihenfolge der Abfrageergebniselemente mit dem Argument orderBy bestimmen. Die Ergebnisse werden standardmäßig nach dem Primärschlüssel des Datasets sortiert (Tabelle). Wenn Sie ein anderes Feld angeben, nach dem sortiert werden soll, wird der Primärschlüssel in den Sortierschlüssel eingeschlossen, um konsistente Ergebnisse für die Paginierung zu halten.

Das Sortieren in verschachtelten Strukturen wird nicht unterstützt.

Beispiele für Sortierung

Sortierung von Rohdaten:

firewallEventsAdaptive (orderBy: [clientCountryName_ASC]) {
    clientCountryName
}

Sortierung von Rohdaten mithilfe mehrerer Felder:

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

Gruppensortierung nach Aggregationsfunktion:

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

Seitenaufteilung

Die Paginierung, bei der Abfrageergebnisse in kleinere Teile aufgeteilt werden, kann mit limit, orderByund Filterparametern durchgeführt werden. Die GraphQL Analytics API unterstützt keine Cursor für die Paginierung.

  • limit (integer) definiert, wie viele Datensätze zurückgegeben werden sollen.
  • orderBy (string) definiert die Sortierreihenfolge für die Daten.

Abfragen von Seiten ohne Cursor

In den folgenden Beispielen wird davon ausgegangen, dass die Beziehungen zwischen date und clientCountryName eindeutig sind.

Ruft die ersten n Ergebnisse einer Abfrage ab.

Zum Begrenzen der Ergebnisse fügen Sie den Parameter limit hinzu. Sie können zum Beispiel die ersten beiden Datensätze abfragen.

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

Die Angabe einer Sortierreihenfolge nach Datum gibt weniger spezifische Ergebnisse zurück als die Angabe einer Sortierreihenfolge nach Datum und Land.

Die Abfrageantwort lautet wie folgt:

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

Abfrage für die nächste Seite mithilfe eines Filters

Um die nächsten n Ergebnisse abzurufen, geben Sie einen Filter an, um das letzte Ergebnis aus der vorherigen Abfrage auszuschließen. Mit dem vorherigen Beispiel können Sie den Größer-als-Operator (_gt) an das Feld clientCountryName und den Größer-gleich-Operator an das Feld datetime anhängen. Wenn Sie eine bestimmte Reihenfolge angeben, erhalten Sie die vollständigsten Ergebnisse.

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

Die Abfrageantwort lautet wie folgt:

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

Abfrage der vorherigen Seite

Um die vorherigen n -Ergebnisse abzurufen, kehren Sie die Filter und die Sortierreihenfolge um.

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

Die Abfrageantwort lautet wie folgt:

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

Filtern

Filter beschränken Abfragen auf ein bestimmtes Konto oder eine bestimmte Gruppe von Zonen (Domänen), auf Anforderungen nach Datum oder einen bestimmten Abfrageagenten. Ohne Filter nimmt die Leistung möglicherweise ab und die Ergebnisse es enthalten möglicherweise unwichtige Daten.

Struktur

Der Filter GraphQL wird durch das Eingabeobjekt GraphQL dargestellt.

Filter können als Argument für die folgenden Ressourcen verwendet werden:

  • Zonen (Domänen)
  • Tabellen (Datasets)
  • Konten

Zonenfilter (Domäne)

Der Zonenfilter ermöglicht die Abfrage zonenbezogener Daten nach Zonen-ID (Domäne) (zoneTag).

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

Der Zonenfilter muss der folgenden Grammatik entsprechen:

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

Zusammengesetzte Filter (kommagetrennt, AND, OR) werden nicht unterstützt. Zonen werden immer alphanumerisch sortiert.

Tabellenfilter (Dataset)

Für Tabellenfilter ist es erforderlich, dass Sie mindestens einen Knoten abfragen. Der Operator AND kann verwendet werden, um Filter für mehrere Knoten zu erstellen und zu kombinieren.

Kontenfilter

Das Filtern auf Kontoebene wird unterstützt und es gibt einen erforderlichen Filterparameter. Zum Beispiel:

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

Operatoren

Die unterstützten Operatoren variieren nach Knotentyp und Knotenname. Die folgenden Operatoren werden für alle Typen unterstützt:

Unterstützte Operatoren
Operator Vergleich
gt größer als
lt kleiner als
geq größer oder gleich
leq kleiner oder gleich
neq ungleich
in in

Beispiele

Allgemeines Beispiel:

{
  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"
    }
  )
}

Filtern eines bestimmten Knotens:

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

Filtern nach mehreren Feldern:

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

Filtern mit dem Operator OR:

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