Warum GraphQL anders überwacht werden muss als REST
GraphQL bricht mit einer zentralen Annahme des klassischen Uptime-Monitorings: dass der HTTP-Statuscode den Zustand der Anfrage widerspiegelt. Bei GraphQL liegt die eigentliche Fehlerinformation im Antwort-Body, nicht im Statuscode. Die Spezifikation sieht vor, dass eine Antwort sowohl ein data-Objekt als auch ein errors-Array enthalten kann — die erfolgreich aufgelösten Felder werden ausgeliefert, die fehlgeschlagenen erscheinen als null und werden im errors-Array beschrieben (GraphQL Foundation). Das nennt sich Partial Response: Eine Antwort mit Daten und Fehlern gleichzeitig ist in GraphQL völlig normal.
Die Konsequenz ist konkret: Ein Monitor, der nur prüft, ob der Endpoint mit 200 antwortet, meldet eine gesunde API — obwohl ein zentraler Resolver in einen Timeout läuft und Nutzer eine halb leere Seite sehen. Auch ein einzelner Endpunkt ist trügerisch: Anders als bei REST, wo /users und /orders getrennte URLs sind, läuft bei GraphQL der gesamte Verkehr über eine URL (meist /graphql). Die Unterscheidung zwischen funktionierenden und kaputten Operationen passiert nicht im Pfad, sondern in der Query selbst.
Diese Eigenheit ist kein Randthema mehr. Laut Postman setzen 33 % der Teams GraphQL ein (Postman State of the API 2025), in technologiegetriebenen und mobile-first Unternehmen liegt der Anteil client-seitiger GraphQL-APIs sogar deutlich höher. Wer GraphQL produktiv betreibt, braucht eine Überwachung, die in die Antwort hineinschaut — nicht nur an die Tür klopft. Die Grundlagen dazu beschreibt der Beitrag API-Monitoring: Endpoints richtig überwachen.
Hinzu kommt eine zweite Besonderheit: GraphQL erlaubt es Clients, Queries flexibel zusammenzustellen. Zwei Anfragen an denselben Endpoint können völlig unterschiedliche Felder, Tiefen und Backend-Dienste beanspruchen. Ein Monitoring, das nur eine generische Anfrage absetzt, prüft möglicherweise nicht denselben Code-Pfad, den die wichtigsten Nutzer-Queries durchlaufen. Deshalb lohnt es sich, die Monitoring-Query an den real eingesetzten Operationen auszurichten — und mehrere benannte Operationen zu prüfen, wenn verschiedene Clients sehr unterschiedliche Teile des Schemas nutzen.
Bei GraphQL kann eine Anfrage mit HTTP 200 antworten und trotzdem gescheitert sein — die fehlgeschlagenen Felder werden zu null, der Fehler steht im errors-Array (GraphQL Foundation / Apollo). Ein Monitoring, das nur den Statuscode prüft, übersieht solche Teilfehler systematisch. Deshalb gehört die Prüfung des Response-Bodys zum Pflichtprogramm jedes GraphQL-Checks.
Query- und Mutation-Checks: Den Endpoint funktional prüfen
Der erste Baustein eines belastbaren GraphQL-Monitorings ist eine echte Query gegen den Endpoint — kein blosser Verbindungstest. Eine kleine, gezielte Health-Query liefert genau die Felder, deren Verfügbarkeit geschäftskritisch ist. Statt die komplette API abzufragen, wählt man wenige repräsentative Felder aus mehreren Resolvern, sodass ein Ausfall in einem Backend-Dienst sichtbar wird.
# POST /graphql mit JSON-Body { "query": "..." }
query MonitorHealth {
viewer {
id
name
}
orders(first: 5) {
edges {
node { id total status }
}
}
catalog: products(first: 1) {
totalCount
}
}Mutations verdienen besondere Vorsicht. Eine Mutation verändert Daten — ein Monitor, der minütlich eine echte Bestellung anlegt, richtet Schaden an. Für das Monitoring eignen sich daher idempotente oder lesende Operationen, ein dedizierter Health-Mutation-Endpoint, der nichts Bleibendes schreibt, oder eine Test-Mutation gegen eine Sandbox-Umgebung. Wichtig ist, dass der Check den Mutation-Pfad berührt, ohne Nebenwirkungen im Produktivdatenbestand zu erzeugen. In der Praxis hilft es, für das Monitoring eine eigene Operation mit klarem Namen wie MonitorHealth zu definieren: So lassen sich die Monitoring-Anfragen in den Server-Logs eindeutig von echtem Nutzerverkehr trennen und bei Bedarf gezielt von Rate-Limits ausnehmen.
Eine lesende Health-Query gegen mehrere Resolver. Prüft, ob die wichtigsten Datenfelder ausgeliefert werden und ob data die erwartete Struktur hat.
Idempotente oder Sandbox-Mutation, die den Schreibpfad testet, ohne echte Daten zu verändern. Niemals destruktive Mutations gegen Produktion fahren.
GraphQL läuft über eine URL — die Unterscheidung gesund/kaputt passiert in der Query. Mehrere benannte Operationen decken verschiedene Backend-Dienste ab.
Viele Felder sind erst mit gültigem Token erreichbar. Der Monitor sendet einen Service-Token im Header und prüft, ob viewer korrekt aufgelöst wird.
Partial Errors erkennen: Das errors-Array auswerten
Das Herzstück eines GraphQL-Checks ist die Auswertung des errors-Arrays. Best-Practice-Empfehlungen für GraphQL über HTTP raten dazu, 200 zu senden, sobald eine Operation überhaupt ausgeführt wurde — selbst wenn dabei Fehler auftraten (GraphQL Foundation). Die fehlgeschlagenen Felder werden dann zu null, und das errors-Array nennt für jeden Fehler den genauen path, also welches Feld an welcher Stelle gescheitert ist (Apollo). Ein GraphQL-Monitor muss diese Struktur kennen und gezielt prüfen.
{
"data": {
"viewer": { "id": "u_42", "name": "Beispiel GmbH" },
"orders": { "edges": [ /* ... */, { "node": { "total": null } } ] }
},
"errors": [
{
"message": "Resolver timeout",
"path": ["orders", "edges", 2, "node", "total"],
"extensions": { "code": "DOWNSTREAM_SERVICE_ERROR" }
}
]
}Aus dieser Struktur lassen sich mehrere Assertions ableiten. Die wichtigste: errors muss fehlen oder leer sein. Findet der Monitor ein gefülltes errors-Array, ist die Operation degradiert — auch wenn der Statuscode 200 lautet. Zusätzlich lassen sich erwartete Datenfelder per JSONPath prüfen (data.viewer.id muss vorhanden sein) und Fehler-Codes im extensions.code-Feld klassifizieren, um zwischen einer Validierungsmeldung und einem echten Backend-Ausfall zu unterscheiden. Nicht jeder Eintrag im errors-Array wiegt gleich schwer: Eine Validierungsmeldung wie ein abgelaufenes Token signalisiert ein anderes Problem als ein DOWNSTREAM_SERVICE_ERROR, der auf einen ausgefallenen Backend-Dienst hindeutet. Ein durchdachtes Monitoring nutzt das extensions.code-Feld deshalb, um Schweregrade zu unterscheiden und nur bei tatsächlich kritischen Fehlern eine Eskalation auszulösen.
Wie solche inhaltlichen Prüfungen aufgebaut werden, vertieft der Beitrag API-Monitoring mit Assertions und Schwellenwerten. Für GraphQL gilt: Eine reine Verfügbarkeitsprüfung reicht nicht — erst die kombinierte Auswertung von Statuscode, errors-Array und Datenfeldern ergibt ein realistisches Bild des Endpoint-Zustands.
Schema- und Introspection-Monitoring
GraphQL beschreibt seine eigene Struktur über das Schema, das per Introspection abgefragt werden kann. Diese Fähigkeit ist im Standard vorgesehen und für die Entwicklung praktisch — sie ist aber zugleich ein Sicherheitsrisiko. Die OWASP-Empfehlungen raten ausdrücklich dazu, Introspection in Produktions- und öffentlich erreichbaren Umgebungen zu deaktivieren, weil sie Angreifern erlaubt, das komplette Schema zu enumerieren und gezielt nach sensiblen Feldern zu suchen (OWASP GraphQL Cheat Sheet).
Für das Monitoring ergeben sich daraus zwei Aufgaben. Erstens die Sicherheitsprüfung: Ist Introspection in Produktion versehentlich aktiviert? Ein Monitor kann eine Introspection-Query absetzen und Alarm schlagen, wenn das Schema offen zugänglich ist. Zweitens die Drift-Erkennung: Ändert sich das Schema unerwartet — verschwindet ein Feld, ändert sich ein Typ — können Clients brechen. Wo Introspection bewusst aktiviert bleibt (etwa in Staging), lässt sich das Schema regelmäßig erfassen und mit dem erwarteten Sollzustand vergleichen.
| Prüfung | Was sie erkennt | Empfohlene Reaktion |
|---|---|---|
| Introspection-Status | Ob das Schema in Produktion offen abfragbar ist | Alarm, wenn Introspection in Produktion aktiv ist (OWASP) |
| Schema-Drift | Verschwundene Felder, geänderte Typen, entfernte Operationen | Benachrichtigung, damit Clients angepasst werden können |
| Deprecation-Hinweise | Mit @deprecated markierte Felder, die noch genutzt werden | Migration planen, bevor das Feld entfernt wird |
| Feldverfügbarkeit | Ob ein geschäftskritisches Feld weiterhin auflöst | Sofort-Alert bei Wegfall eines erwarteten Felds |
Das OWASP-GraphQL-Cheat-Sheet empfiehlt, Introspection-Queries und Schema-Explorer wie GraphiQL in öffentlich erreichbaren Umgebungen abzuschalten (OWASP). Ein Monitoring-Check, der gezielt eine Introspection-Anfrage stellt und bei einer erfolgreichen Antwort warnt, deckt diese häufige Fehlkonfiguration zuverlässig auf — bevor es ein Angreifer tut.
Resolver-Latenz und Performance überwachen
GraphQL verschiebt die Performance-Frage von der URL auf das einzelne Feld. Weil ein Client beliebig viele Felder in einer Anfrage kombinieren kann, hängt die Antwortzeit nicht vom Endpunkt ab, sondern davon, welche Resolver beteiligt sind. Ein langsamer Resolver — etwa eine Datenbankabfrage ohne Index oder ein träger Downstream-Dienst — kann eine ansonsten schnelle Query ausbremsen. Best-Practice-Quellen empfehlen daher, Resolver-Fehlerraten und Operations-Latenz getrennt zu beobachten (GraphQL Foundation).
Für das Monitoring heißt das: Die End-to-End-Latenz der Health-Query ist die erste Kennzahl, ergänzt um Schwellenwerte für Warnung und Fehler. Steigt die Antwortzeit über einen definierten Wert — im Mockup etwa über 500 ms — wird der Check als degradiert markiert, lange bevor die Query in einen harten Timeout läuft. Diese frühe Warnung ist besonders wertvoll, weil ein einzelner langsamer Resolver oft das erste Anzeichen eines beginnenden Backend-Problems ist.
- End-to-End-Latenz der Health-Query mit Warn- und Fehler-Schwelle — erkennt langsame Resolver, bevor sie zu Timeouts werden
- N+1-Problem im Blick behalten — verschachtelte Felder können pro Element eine Backend-Anfrage auslösen und die Latenz unbemerkt vervielfachen
- Query-Tiefe und -Komplexität begrenzen — tiefe, verschachtelte Queries belasten den Server und sind ein bekannter DoS-Vektor (OWASP)
- Latenz pro Region messen — von mehreren Standorten aus prüfen, um regionale Engpässe von globalen zu unterscheiden
- Trend statt Momentaufnahme — eine einzelne langsame Antwort ist Rauschen, ein steigender Trend über Stunden ist ein Signal
Ein GraphQL-Check, der Statuscode, errors-Array, Datenfelder per JSONPath und Resolver-Latenz kombiniert, beantwortet nicht nur die Frage "läuft die API?", sondern "liefert sie korrekte Daten in akzeptabler Zeit?". Genau diese inhaltliche Tiefe unterscheidet ein belastbares API-Monitoring von einem reinen Ping.
GraphQL-Sicherheit: Mehr als Verfügbarkeit
Die Überwachung von GraphQL hat eine Sicherheitsdimension, die über reine Verfügbarkeit hinausgeht. APIs sind 2025 zum primären Angriffsziel geworden: Die Zahl der API-Angriffe stieg laut Akamai um 113 % im Jahresvergleich, von durchschnittlich 121 auf 258 tägliche Angriffe pro Organisation, und 87 % der Organisationen erlebten 2025 einen API-bezogenen Sicherheitsvorfall (Akamai SOTI 2025). APIs wickeln inzwischen rund 83 % des Web-Traffics ab und sind damit eine der größten Angriffsflächen moderner Software (Akamai SOTI 2025).
GraphQL bringt eigene Risiken mit. Das OWASP API Security Project listet GraphQL-spezifische Beispiele inzwischen quer durch die Top-10-Risiken (OWASP). Besonders relevant sind Broken Object Level Authorization (BOLA) und Broken Function Level Authorization (BFLA): Wenn die Feld-Autorisierung nicht greift, können Angreifer über das per Introspection enumerierte Schema gezielt sensible Felder abfragen. Eine aktivierte Introspection in Produktion vergrößert diese Angriffsfläche erheblich.
Monitoring ersetzt keine Sicherheitsarchitektur, ergänzt sie aber: Ein Check, der Introspection-Status, ungewöhnliche Fehler-Codes im extensions-Feld und auffällige Latenzspitzen beobachtet, liefert frühe Signale. In Kombination mit einer sauberen Alert-Konfiguration und einem belastbaren Incident-Management mit Eskalation wird aus einem technischen Signal eine handhabbare Reaktion — bevor aus einer Fehlkonfiguration ein Vorfall wird.
GraphQL im Kontext moderner Protokolle
GraphQL ist Teil eines breiteren Wandels in der API-Landschaft. Während REST mit 93 % weiterhin dominiert, gewinnen spezialisierte Muster an Boden: Webhooks (50 %), WebSockets (35 %) und GraphQL (33 %) werden zunehmend ergänzend eingesetzt (Postman State of the API 2025). Jedes dieser Protokolle stellt eigene Anforderungen an das Monitoring — und keines davon lässt sich mit einem reinen HTTP-Statuscheck vollständig abbilden.
Echtzeit-Verbindungen über WebSockets etwa bleiben offen und übertragen kontinuierlich Daten — hier zählt nicht der einmalige Statuscode, sondern die dauerhafte Verbindungsqualität. Wie sich solche persistenten Endpunkte überwachen lassen, beschreibt der Beitrag zum WebSocket- und Realtime-Endpoint-Monitoring. Auf der Transportebene wiederum verändert HTTP/3 über QUIC die Latenz- und Verbindungscharakteristik grundlegend, was eigene Prüfmethoden erfordert — Details dazu im Beitrag zum HTTP/3- und QUIC-Protokoll-Monitoring.
Der gemeinsame Nenner: Moderne Schnittstellen erfordern ein Monitoring, das den jeweiligen Protokoll-Eigenheiten gerecht wird. Bei GraphQL ist das die Auswertung des Response-Bodys, bei WebSockets die Verbindungsdauer, bei HTTP/3 die Transport-Performance. Das XICTRAQ API-Monitoring bündelt diese Prüfungen unter einem Dach, sodass GraphQL-, REST- und Realtime-Endpunkte gemeinsam überwacht werden können.
GraphQL-Monitoring mit XICTRAQ einrichten
Die folgende Checkliste fasst zusammen, was ein belastbares GraphQL-Monitoring abdecken sollte. Sie eignet sich als Ausgangspunkt, um einen vorhandenen Endpoint zu prüfen oder eine neue Überwachung aufzusetzen.
- Echte Query absetzen statt nur die Verbindung zu testen — eine Health-Query gegen mehrere Resolver deckt verschiedene Backend-Dienste ab
- Statuscode UND
errors-Array prüfen — bei GraphQL kann HTTP 200 trotz Teilfehler antworten (GraphQL Foundation) - Datenfelder per JSONPath verifizieren —
data.viewer.idund andere geschäftskritische Felder müssen vorhanden sein - Resolver-Latenz mit Schwellenwerten überwachen — Warn- und Fehlergrenze setzen, bevor harte Timeouts auftreten
- Introspection in Produktion prüfen — Alarm, wenn das Schema offen abfragbar ist (OWASP)
- Authentifizierung einbeziehen — Service-Token im Header, um geschützte Felder realistisch zu testen
- Mutations vorsichtig testen — nur idempotente oder Sandbox-Operationen, niemals destruktive Schreibvorgänge gegen Produktion
- Eskalation definieren — bei degradiertem Zustand über E-Mail, Slack, Discord oder Telegram benachrichtigen
Das XICTRAQ API-Monitoring prüft GraphQL-Endpoints in einstellbaren Intervallen über einen minütlichen Cron, setzt eine konfigurierbare Query oder Mutation ab und wertet die Antwort gegen Ihre Assertions aus. Erkennt der Check ein gefülltes errors-Array, ein fehlendes Datenfeld oder eine überschrittene Latenzschwelle, wird der Endpoint als degradiert markiert und eine Benachrichtigung ausgelöst — über dieselben Kanäle wie das übrige Monitoring.
Damit fügt sich GraphQL nahtlos in eine durchgängige Überwachung ein: REST- und GraphQL-APIs, WebSocket-Verbindungen und klassische Uptime-Checks laufen unter einem Dach, mit gemeinsamer Alert-Logik und Eskalation. Wie sich Schwellenwerte und Assertions im Detail konfigurieren lassen, vertieft der Beitrag API-Monitoring mit Assertions und Schwellenwerten — die Grundlage für ein Monitoring, das nicht nur Verfügbarkeit, sondern Korrektheit anstrebt.
Dieser Artikel basiert auf Daten von: GraphQL Foundation (Spezifikation, Partial Response, GraphQL over HTTP), Apollo GraphQL (Error-Handling, errors-Array, path), OWASP (API Security Top 10, GraphQL Cheat Sheet, Introspection-Empfehlung), Akamai (State of the Internet / Apps and API Security Report 2025: +113 % API-Angriffe, 87 % betroffene Organisationen, 83 % API-Traffic), Postman (State of the API Report 2025: API-Architektur-Verteilung REST 93 %, Webhooks 50 %, WebSockets 35 %, GraphQL 33 %).
Häufig gestellte Fragen zum GraphQL-API-Monitoring
Warum reicht ein HTTP-Statuscheck für GraphQL nicht aus?
errors-Array des Response-Bodys. Ein Monitoring, das nur den Statuscode prüft, übersieht solche Teilfehler in der Regel — deshalb ist die Auswertung des Antwort-Inhalts erfahrungsgemäß unverzichtbar.Was sind Partial Errors bei GraphQL?
null und werden im errors-Array beschrieben (Apollo). Eine Antwort kann also gleichzeitig Daten und Fehler enthalten, was bei GraphQL völlig normal ist.