Logs mit Vector an UptimeEye senden

Vector ist ein einzelnes Binary, das aus vielen Quellen liest, Events mit VRL umformt und zuverlässig verschickt. UptimeEye nimmt den elasticsearch-Sink von Vector (Bulk-Protokoll) an – die Konfiguration unten ist die Vorlage, auf der jede Vector-Anleitung auf dieser Website aufbaut.

Endpunkt: https://logs.uptimeeye.com/v1/ingest/elasticsearch/_bulk

1.Installieren

shell
curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev | bash
# or: apt/yum packages and Docker images at vector.dev/docs/setup/installation/

2.Dateien und das systemd-Journal

/etc/vector/vector.yaml
# The ingest key is read from /etc/vector/secrets/key through Vector's
# secret backend; ${ENV} placeholders are not expanded in the config.
secret:
  local:
    type: directory
    path: /etc/vector/secrets

sources:
  app_files:
    type: file
    include: [/var/log/myapp/*.log]
    ignore_older_secs: 86400
  journal:
    type: journald
    include_units: [nginx.service, postgresql.service]

transforms:
  enrich:
    type: remap
    inputs: [app_files, journal]
    source: |
      .host = get_hostname!()
      .env  = "prod"
      # files: service from the path; journald: from the unit
      if exists(.file) { .service = replace(basename!(string!(.file)), r'\.log$', "") }
      if exists(._SYSTEMD_UNIT) { .service = replace(string!(._SYSTEMD_UNIT), ".service", "") }
      parsed, err = parse_json(string!(.message))
      if err == null { . = merge(., parsed) }

sinks:
  uptimeeye:
    type: elasticsearch
    inputs: [enrich]
    endpoints: ["https://logs.uptimeeye.com/v1/ingest/elasticsearch/"]
    api_version: v8
    compression: gzip
    healthcheck: { enabled: false }
    request:
      headers:
        Authorization: "Bearer SECRET[local.key]"
    query:
      _msg_field: message
      _time_field: timestamp
      _stream_fields: service,host,env
    buffer:
      type: disk
      max_size: 268435488
      when_full: block

3.Starten und prüfen

shell
install -d -m 700 -o vector /etc/vector/secrets
printf '%s' 'ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' > /etc/vector/secrets/key
chown vector /etc/vector/secrets/key && chmod 600 /etc/vector/secrets/key
vector validate /etc/vector/vector.yaml
systemctl enable --now vector
vector top   # live view of events per component

Felder, die du bekommst

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

  • service
  • host
  • env
  • file bei Datei-Sources
  • journald-Metadaten wie _SYSTEMD_UNIT, PRIORITY

Tipps

  • Stacktraces: Nutz die Option multiline der file-Source (multiline: { start_pattern: '^\\d{4}-\\d{2}-\\d{2}', mode: halt_before, condition_pattern: '^\\d{4}-\\d{2}-\\d{2}', timeout_ms: 1000 }).
  • Wirf Rauschen weg, bevor es auf dein Kontingent zählt: ein filter-Transform mit condition: '.level != "debug"'.
  • Der http-Sink von Vector geht auch: uri: https://logs.uptimeeye.com/v1/ingest/jsonline?_stream_fields=service,env, encoding: { codec: json }, framing: { method: newline_delimited }, auth: { strategy: bearer, token: … }.

FAQ

Warum der elasticsearch-Sink und nicht http?

Beides geht. Mit dem Bulk-Protokoll von Elasticsearch bekommt Vector Bestätigungen pro Zeile und Back-Pressure gratis; der http-Sink ist eine gute Alternative, wenn dir JSON-Lines lieber sind.

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.