So funktioniert der Ingest
- Du sendest Batches per HTTPS an
logs.uptimeeye.com, mit einem Ingest-Key. - Der Key führt zu deiner Organisation; die Zeilen werden im isolierten Tenant deiner Organisation gespeichert.
- Jede Zeile wird zu einem Eintrag mit einer Nachricht, einer Zeit und beliebig vielen Feldern. Kein Schema, keine Index-Konfiguration.
- Etwa eine Sekunde später ist der Eintrag auf der Logs-Seite durchsuchbar; Live-Tail zeigt ihn nach rund 6 s.
Ingest-Keys
Erstell Keys unter API-Keys → Neuer API-Key mit dem Typ „Log-Ingest“. Sie beginnen mit ue_ingest_, werden nur einmal angezeigt und können nur Logs schreiben – ein Management-Key (ue_live_) wird von den Ingest-Endpoints abgelehnt, und ein Ingest-Key kann in deinem Konto nichts lesen oder ändern.
Schick den Key als Bearer-Token oder, für Tools, die nur Benutzer und Passwort kennen, per HTTP Basic Auth (beliebiger Benutzername, der Key als Passwort):
Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# or
Authorization: Basic base64("key:ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")Endpoints
Basis-URL https://logs.uptimeeye.com. Alle Endpoints akzeptieren gzip-komprimierte Bodys (Content-Encoding: gzip) bis 16 MiB unkomprimiert.
| Endpoint | Format | Typische Absender |
|---|---|---|
| POST /v1/ingest/jsonline | Ein JSON-Objekt pro Zeile (NDJSON) | curl, Skripte, Fluent Bit http, Logging-Bibliotheken |
| POST /v1/ingest/text | Klartext, ein Eintrag pro Zeile; Zeit und Level werden erkannt, Stacktraces zusammengefasst | Logdateien, docker logs, Ausgabe von Spring/log4j |
| POST /v1/ingest/elasticsearch/_bulk | Elasticsearch-Bulk-API (GET / und /_license beantworten den Handshake) | Vector, Filebeat, Fluent Bit es |
| POST /v1/ingest/otlp/v1/logs | OTLP/HTTP-Logs (protobuf) | OpenTelemetry Collector und SDKs, Serilog |
| POST /v1/ingest/loki/api/v1/push | Loki Push (JSON oder Snappy-Protobuf); Labels werden zu Stream-Feldern | Promtail, Grafana Alloy, Docker-Loki-Treiber |
Nachricht, Zeit und Felder
Ein Eintrag ist eine flache Menge von String-Feldern. Drei Namen sind besonders; alles andere gehört dir:
| Feld | Bedeutung | Standard |
|---|---|---|
| _msg | Die Nachricht, die in der Liste steht und von Wortabfragen durchsucht wird | der in _msg_field genannte Key, sonst leer |
| _time | Ereigniszeit, RFC 3339 / ISO 8601 oder Unix-Sekunden, -Millisekunden oder -Nanosekunden | der in _time_field genannte Key, sonst die Ankunftszeit |
| _stream | Stream-Labels, gebildet aus _stream_fields | service,host, falls vorhanden |
Verschachteltes JSON wird zu Namen mit Punkten aufgelöst: {"http":{"status":500}} wird zum Feld http.status. Arrays werden als JSON-Strings gespeichert. Feldnamen unterscheiden Groß- und Kleinschreibung.
Gute Feldhygiene
- Schick immer
serviceundenvmit – sie steuern den Bereich „Felder“, die Setup-Beispiele und die meisten Filter. - Pack Kennungen (
order_id,user_id,trace_id) in Felder, nicht in den Nachrichtentext. - Bleib über alle Services hinweg bei einem Namen pro Konzept (
duration_ms, nichtlatencyhier undtookdort). - Log-Level als kleingeschriebene Wörter (
info,warn,error), damitlevel:errorüberall funktioniert.
Stream-Felder
Ein Stream ist die Menge der Einträge mit denselben Werten der Stream-Felder – etwa {service="api", env="prod"}. Streams werden zusammen gespeichert, deshalb ist ein Filter darauf (_stream:{...} oder einfach ein angeklickter Wert eines Stream-Felds) der schnellste Weg, eine Suche einzugrenzen, und der Bereich „Felder“ listet Stream-Felder zuerst.
- Wähl sie pro Request mit
_stream_fields=service,env(Query-Argument oder HeaderVL-Stream-Fields). Bis zu 6 Felder; Standard istservice,host. - Nimm Felder mit wenigen verschiedenen Werten, nach denen du ständig filterst:
service,env,namespace,region,host. - Nimm nie Werte mit hoher Kardinalität (
request_id,podauf einem vollen Cluster,user_id) – jede eindeutige Kombination ist ein eigener Stream.
Ingest-Optionen
Optionen übergibst du bei jedem Endpoint als Query-Argumente oder, für Agents, die die URL nicht setzen können, als Header. Query-Argumente haben Vorrang.
| Query-Argument | Header | Wirkung |
|---|---|---|
| _stream_fields | VL-Stream-Fields | kommagetrennte Felder, die den Stream bilden (max. 6) |
| _msg_field | VL-Msg-Field | welcher Key die Nachricht enthält (z. B. message, log, msg) |
| _time_field | VL-Time-Field | welcher Key den Zeitstempel enthält (z. B. @timestamp, time, ts) |
| _ignore_fields | VL-Ignore-Fields | Keys, die vor dem Speichern verworfen werden |
| _extra_fields | VL-Extra-Fields | konstante Felder, die hinzugefügt werden, k1=v1,k2=v2 |
| _default_msg_value | VL-Default-Msg-Value | Nachricht für Einträge ohne eigene Nachricht |
Der Klartext-Endpoint kennt zusätzlich _time_source=ingest und _multiline=off und behandelt jedes Query-Argument ohne Unterstrich als konstantes Feld.
Limits, Kontingent, Aufbewahrung
| Limit | Wert |
|---|---|
| Request-Body | 16 MiB unkomprimiert; gzip wird akzeptiert |
| Stream-Felder | 6 pro Request |
| Monatliches Volumen | je nach Plan, gemessen in unkomprimierten Bytes, wie sie ankommen; auf der Logs-Seite angezeigt |
| Aufbewahrung | je nach Plan; ältere Einträge werden automatisch entfernt, und der Suchzeitraum ist darauf begrenzt |
| Kontingent aufgebraucht | 429 Too Many Requests mit einem Retry-After-Header, bis der Monat wechselt; der Batch, der die Grenze überschreitet, wird noch angenommen |
Response-Codes
| Status | Bedeutung | Was tun |
|---|---|---|
| 200 | angenommen (/text antwortet mit {"entries": N}) | – |
| 400 | fehlerhaftes JSON, Text ohne Zeilen oder kaputte Kompression | Payload korrigieren; der Body nennt die erste fehlerhafte Zeile |
| 401 | fehlender, fehlerhafter oder unbekannter Ingest-Key | den Authorization-Header prüfen und ob der Key vom Typ Log-Ingest ist |
| 403 | der Plan enthält keine Logs, oder die Organisation hat noch keinen Log-Tenant | upgraden oder zuerst einen Ingest-Key erstellen |
| 413 | Body über 16 MiB | kleinere Batches senden |
| 415 | nicht unterstütztes Content-Encoding | gzip oder keins verwenden |
| 429 | monatliches Kontingent aufgebraucht | bis Retry-After warten; Agents wiederholen von selbst |
| 502 / 503 | Speicher oder Key-Abfrage vorübergehend nicht verfügbar | mit Backoff erneut versuchen; es wurde nichts angenommen |
Integration wählen
Überprüfen
Öffne Logs, wähl den Zeitraum „15 Min.“ und such nach service:=<your service>. Erscheint nichts, schau im Log des Agents nach dem HTTP-Status seiner letzten Anfrage (siehe Tabelle oben) und nach der Zeit: Ein Agent, dessen Uhr um Minuten falsch geht, legt Zeilen außerhalb des 15-Minuten-Fensters ab – probier „24 Std.“.
Weiter geht es mit Logs durchsuchen.
FAQ
Können sich mehrere Services einen Ingest-Key teilen?
service. Getrennte Keys pro Umgebung oder Team erleichtern die Rotation.Was passiert, wenn ich einen Key widerrufe?
401 abgelehnt (das Gateway speichert Key-Abfragen kurz zwischen). Bereits angenommene Zeilen bleiben durchsuchbar.Sind Zeitstempel Pflicht?
_time (oder den in _time_field genannten Key) wird die Ankunftszeit verwendet. Schick Zeitstempel mit, wenn du Dateien erneut einspielst oder wenn Agents länger als ein paar Sekunden puffern.