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.
- Herunterladen und installieren GraphiQL.
- Öffnen Sie die GraphiQL-Anwendung und geben Sie die HTTP-Header ein, die Sie autorisieren möchten.
- 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.
- Wählen Sie
POSTim Listenmenü Method aus. - Klicken Sie auf Edit HTTP Headers.
- 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.
| 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.
| 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.
| 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
maxNumberOfFieldsinsettingsangegeben werden. - Die Antworten können bis zu 10.000 Datensätze zurückgeben. Dieser Grenzwert wird durch
maxPageSizeinsettingsangegeben.
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:
| 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"}]) {
...
}