Mimir / Prometheus Metrik Backfilling

Vorwort

Hinweis

Die Anleitung ist noch nicht komplett fertig und die generierten Metriken sind nicht generisch für jeden Sensor nutzbar. In diesem Beispiel wird die Metrik homeassistant_binary_sensor_state genannt, aber viele andere Sensoren erhalten andere Metriknamen!

Prometheus selbst unterstützt das rückwirkende Einspielen von Metriken nicht, hierzu sind Anwendungen wie Thanos oder Mimir notwendig.
Grob gesagt werden diese mittels Remote_Write von Prometheus mit Metriken versorgt, stehen als Query-Endpunkt für Grafana parat und verwalten die zugespielten Daten selbständig.
Ältere Daten können später auf einem S3 Storage (als Langzeitspeicher) gespeichert werden.

In diesem Beispiel sollen ältere Messwerte von HomeAssistant aus einer Mariadb gelesen und in Mimir via Backfilling gespeichert werden.

Hierfür sind folgende Voraussetzungen notwendig, damit die Datentypen (Gauge / Counter) der Metriken bekannt sind:

  • HomeAssistant stellt bereits Prometheus Metriken bereit und diese wurden schon gescraped
  • Mimir hat bereits Daten von Prometheus erhalten

Sind die Metriken noch nicht im System bekannt, können diese auch eingespielt werden, allerdings kann die Typisierung notwendig sein (wird später erklärt…)

Hinweis

Promtool und Mimirtool werden benötigt!

Metriken abfragen

Die Daten müssen aus der MariaDB Datenbank gelesen werden, dies lässt sich folgenderweise erreichen.
Hierbei müssen die oben stehenden Variablen folgenderweise angepasst werden:

Variable Inhalb
@instance Instanzname von HomeAssistant, kann aus Prometheus ermittelt werden (Targets)
@job Jobname in Prometheus, ebenfalls über Targets ermittelbar
@reg_in Regex, Matches werden in die Metriken aufgenommen
@reg_ex Regex, Matches werden nicht exportiert, Exklude ist gewichtiger als Inklude!

Bei den Regexes handelt es sich um keine Wildcards wenn * verwendet wird. Wie ein Regex zu bauen ist, sollte online nachgelesen werden …

Zur Verdeutlichung hier ein Beispiel für die HomeAssistant Konfiguration von Prometheus:

component_config_glob:
filter:
  include_domains:
    - sensor
    - binary_sensor
    - switch
    - person
  exclude_entity_globs:
    - sensor.weather_*
    - sensor.xyz_*
SET @instance = "__PROM_INSTANCE__";
SET @job = "__PROM_JOB__";
SET @reg_in = "^(sensor|binary_sensor|switch|person)\..+";
SET @reg_ex = "^(sensor\.weather_|sensor\.xyz_).+";

SELECT
    CONCAT('homeassistant_binary_sensor_state{domain="',substring_index(sm.entity_id, ".", 1),'",entity="',sm.entity_id,'",friendly_name="',JSON_VALUE(sa.shared_attrs,'$.friendly_name'),'",instance="',@instance,'",job="',@job,'"}'), CASE WHEN s.state = "on" THEN 1 ELSE 0 END,
    floor(s.last_updated_ts)
FROM states s
LEFT JOIN states_meta sm ON (sm.metadata_id = s.metadata_id)
LEFT JOIN state_attributes sa ON (s.attributes_id = sa.attributes_id)
WHERE sm.entity_id REGEXP @reg_in
AND sm.entity_id NOT REGEXP @reg_ex
ORDER BY sm.entity_id,s.last_updated_ts;

Es empfiehlt sich den SQL Ausdruck komplett in eine Datei (metric_dump.sql) zu schreiben, danach können die Daten aus der Datenbank homeassistant gedumpt werden.
Fehlerhafte Metriken die NULL-Values erhalten, werden vorweg ausgefiltert (könnte auch in der MySQL Query getan werden, allerdings wollte ich diese nicht noch weiter verkomplizieren …):

mysql homeassistant < metric_dump.sql | | grep -v -E '^NULL' | awk 'BEGIN { FS = "\\t" } ; {print $1" "$2" "$3}' > my_metrics
# oder bei MariaDB-Client
mariadb homeassistant < metric_dump.sql | grep -v -E '^NULL' | awk 'BEGIN { FS = "\\t" } ; {print $1" "$2" "$3}' > my_metrics

Im Anschluss muss noch eine EOF Zeile angehängt werden:

echo "# EOF" >> my_metrics

Promtool Blocks generieren

mkdir -p output
promtool tsdb create-blocks-from openmetrics xxx3.my_metrics output

Blöcke in Mimir importieren

Sollte die Mimir Instanz mit Tenants arbeiten, muss –id noch gesetzt werden…

mimirtool backfill --address=https://mimir.instance.local --id=anonymous output/*

Das Backfilling kann je nach Menge der Daten gerne auch mal Stunden dauern, weil die Blöcke durchgearbeitet werden müssen …
Eingespielte Blöcke und Metriken sind nicht direkt verfügbar, nach ca 12 Stunden sollten diese dann abfragbar sein.
Informationen zu diesem Thema finden sich zu genüge im Internet.