Logs mit Fluent Bit an UptimeEye senden

Fluent Bit ist ein kleiner Agent (wenige MB), der Dateien mitliest, in Felder zerlegt und gebündelt verschickt. Sein http-Output mit Format json_lines passt eins zu eins auf den JSON-Lines-Endpoint von UptimeEye – kein Plugin nötig.

Endpunkt: https://logs.uptimeeye.com/v1/ingest/jsonline

1.Dateien auf einem Host oder einer VM mitlesen

Der Filter record_modifier ergänzt die Felder, nach denen du filtern willst. _msg_field=log sagt UptimeEye, welcher Key die Nachricht enthält; json_date_key _time legt den Zeitstempel dort ab, wo UptimeEye ihn erwartet.

fluent-bit.conf
[SERVICE]
    Flush        2
    storage.path /var/lib/fluent-bit/buffer

[INPUT]
    Name              tail
    Path              /var/log/myapp/*.log
    Tag               myapp
    Refresh_Interval  5
    Skip_Long_Lines   On
    storage.type      filesystem

[FILTER]
    Name    record_modifier
    Match   *
    Record  service myapp
    Record  env prod
    Record  host ${HOSTNAME}

[OUTPUT]
    Name             http
    Match            *
    Host             logs.uptimeeye.com
    Port             443
    tls              On
    URI              /v1/ingest/jsonline?_msg_field=log&_stream_fields=service,env
    Format           json_lines
    json_date_key    _time
    json_date_format iso8601
    Header           Authorization Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    compress         gzip
    Retry_Limit      False

2.Anwendungslogs in JSON? Mit einem Parser zerlegen

Ergänz einen Parser, damit jeder JSON-Key ein eigenes Feld wird statt eines undurchsichtigen log-Strings.

fluent-bit.conf (addition)
[INPUT]
    Name    tail
    Path    /var/log/myapp/*.log
    Tag     myapp
    Parser  json

# parsers.conf
[PARSER]
    Name        json
    Format      json
    Time_Key    time
    Time_Format %Y-%m-%dT%H:%M:%S.%L%z
Note: Mit einem JSON-Parser ist der Key der Nachricht der, den deine App verwendet – setz _msg_field passend, zum Beispiel _msg_field=message.

3.Kubernetes

Behalte beim offiziellen Helm-Chart den kubernetes-Filter (er hängt Namespace, Pod und Container an) und richte den Output auf UptimeEye.

values.yaml (fluent/fluent-bit chart)
config:
  outputs: |
    [OUTPUT]
        Name             http
        Match            kube.*
        Host             logs.uptimeeye.com
        Port             443
        tls              On
        URI              /v1/ingest/jsonline?_msg_field=log&_stream_fields=kubernetes.namespace_name,kubernetes.container_name
        Format           json_lines
        json_date_key    _time
        json_date_format iso8601
        Header           Authorization Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        compress         gzip

4.Suchen

service:=myapp auf einem Host, kubernetes.container_name:=api auf Kubernetes. Verschachtelte Keys kommen als Feldnamen mit Punkten an.

Felder, die du bekommst

Diese Felder erscheinen im Panel „Felder“ und funktionieren in jedem Filter:

  • service, env, host (aus dem Filter)
  • kubernetes.namespace_name, kubernetes.pod_name, kubernetes.container_name auf Kubernetes
  • die JSON-Keys aus dem Parser

Tipps

  • Mit Retry_Limit False versucht Fluent Bit es aus dem Dateisystem-Puffer immer wieder, so kostet ein kurzer Netzaussetzer keine Zeilen.
  • Mehrzeilige Stacktraces: Setz vor den Output den eingebauten multiline-Filter mit multiline.parser java (oder python, go).
  • Der Elasticsearch-Output von Fluent Bit geht auch: Name es, Host logs.uptimeeye.com, Port 443, tls On, Path /v1/ingest/elasticsearch, HTTP_User key, HTTP_Passwd <ingest key>, Suppress_Type_Name On.

FAQ

Welchen Output nehme ich, http oder es?

http mit json_lines ist einfacher, und du kannst Ingest-Optionen in der URI mitgeben. Nimm es nur, wenn du schon eine Pipeline im Elasticsearch-Format hast.

Wo bekomme ich den Ingest-Key?

In der App unter API-Keys → Neuer API-Key → Typ „Log-Ingest“. Der Key beginnt mit ue_ingest_ und wird nur einmal angezeigt. Management-Keys (ue_live_) lehnt der Ingest-Endpoint ab.

Wie sehe ich, ob Logs ankommen?

Öffne Logs in der App, wähl den Zeitraum „15 Min.“ und such nach service:=<your service>. Neue Zeilen sind nach etwa einer Sekunde durchsuchbar; Live-Tail zeigt sie mit etwa 6 s Verzögerung.