Ein Blog über Code, Hardware und Co

Storj

Das Monitoring von Storj-Storagenodes

Zuletzt aktualisiert am 2. November 2021.

Um über einen längeren Zeitraum hinweg erfolgreich Storagenodes im Storj-Netzwerk zu betreiben, ist es wichtig die Storagenodes zu monitoren.

Vorteile des Monitorings von Storagenodes:
- Übersichtlichkeit bei größeren Setups: Alle Nodes auf einen Blick
- Übersicht der Gesamtbandbreite, des Gesamtspeichers und der Einnahmen
- Schnelle Reaktionsmöglichkeit, wenn etwas nicht stimmt
- Aufbau einer Datenhistorie mit der Möglichkeit, später Auswertungen und statistische Analysen vorzunehmen

Wieso sollte man Storagenodes monitoren?

Grundsätzlich ist es sinnvoll, wichtige Dienste zu monitoren. Das gilt natürlich in erster Linie für Webserver, Mailserver und Co, wo ein Ausfall gravierende Folgen haben kann.

Aber auch der Ausfall eines oder mehrere Storagenodes kann aufgrund vorgegebener Onlinezeiten (Uptime-Requirements) im Storj-Netzwerk unangenehme Folgen haben. Diese reichen von einer temporären Suspendierung bis hin zur dauerhaften Disqualifizierung.

Die Quick-and-Dirty-Lösung: Storj-Monitoring in wenigen Sekunden

Wenn es dir nur darum geht, zu überprüfen, ob deine Storagenodes online sind, und du eine Benachrichtigung bekommen möchtest, wenn deine Nodes offline sind, dann kannst du ganz einfach auf "Uptimerobot.com" zurückgreifen:

1) App von Uptimerobot.com installieren bzw. Account auf der Webseite uptimerobot.com anlegen

2) Du kannst nu  bis zu 50 "Monitors" erstellen. Für jeden Storagenode brauchst du einen Monitor.

3) Einfach die IP/den Hostnamen des Storagenodes gepaart mit dem Port des Storagenodes monitoren:


Fertig! 

Dashboard: Alle Wichtigen Infos auf einen Blick

Zudem ist es mit einem sinnigen Monitoring möglich, sich ein Dashboard zu erstellen, und so – das ist besonders beim Betrieb mehrere Storagenodes sinnvoll – den Überblick über den Status aller einzelnen Nodes auf einer Übersichtsseite zu erhalten.

Daten sammeln und auswerten

Besonders spannend ist, dass man mit Hilfe eines sinnvollen Monitorings Daten sammeln, speichern und später auch auswerten und analysieren kann.
So kann eine Historie aufgebaut werden und z.B. ausgewertet werden, welche Monate besonders viel Traffic gebracht haben, welche eher weniger, wie lange der Vetting-Prozess bei neuen Nodes gedauert hat usw.
Auch die historische Entwicklung der Einnahmen aller einzelnen Nodes ist eine sehr spannende Information.

Wie sieht das Monitoring aus?

Grundsätzlich ist hier viel möglich. Je nach verwendeter Software und den persönlichen Vorlieben kann das Monitoring unterschiedliche Daten sammeln und darstellen.

Ich richte mich, wie ein Großteil der Community an einem Grafana-Dashboard aus.

Mein Monitoring sieht wie folgt aus:

Abbildung 1: Ein Dashboard, das den aktuellen Status von 6 Storagenodes zeigt.
Abbildung 2: Zweiter Teil des Dashboards mit Informationen zu einem einzelnen Storagenode.

Es zeigt mir folgende Daten und baut eine Historie dieser Daten auf:

Allgemein

  • Anzahl der aktuellen Nodes, die online sind
  • Der gesamte eingehende Traffic im aktuellen Monat
  • Der gesamte ausgehende Traffic im aktuellen Monat
  • Die (bisherigen) Einnahmen des aktuellen Tages
  • Die Einnahmen des aktuellen Monats
  • Der insgesamt belegte Speicher
  • Die aktuelle Bandbreite, die von den Storagenodes genutzt wird

Spezifisch zu den einzelnen Nodes

  • Der ausgehende Traffic jeweils für jeden einzelnen Node
  • Der eingehende Traffic jeweils für jeden einzelnen Node
  • Der aktuelle Audit-Status für jeden Node (Wie viele Audits waren erfolgreich?)
  • Der belegte Speicherplatz je Storagenode
  • Der gesamt verfügbare Speicher je Storagenode
  • Die geschätzten Einnahmen je Storagenode
  • Der Repair-Traffic je Node
  • Der Uptime-Status jedes einzelnen Nodes

Tipp: Einige Live-Daten aus meinem Monitoring stelle ich euch hier zur Verfügung:
https://addictedtocode.de/storj/statistiken-zu-meinen-storagenodes/

Wie richtet man das Monitoring ein?

Das Einrichten eines Monitoringsystems – es gibt hier natürlich viele Möglichkeiten – ist zwar keine Raketenwissenschaft, aber leider auch nicht ganz trivial.

Die grundlegende Architektur unseres Monitorings sieht wie folgt aus:

Storagenode -> Storagenode-Exporter -> Datenbank (Prometheus) -> Darstellung (Grafana).

  • Storagenode: Hier handelt es sich um den Storagenode an sich. Dieser muss natürlich laufen und über die API (Standardmäßig Port 14002) Daten bereitstellen.
  • Storagenode-Exporter: Ein Python Script, welches die API des Storagenodes anzapft und die Daten als JSON-String bereitstellt.
  • Datenbank (Prometheus): Eine Instanz, die den JSON-String verarbeiten kann und in einer Datenbank persistent speichert. Wir nutzen hier Prometheus.
  • Darstellung (Grafana): Die besten Daten bringen nichts, wenn man sie nicht ansprechend visualisiert, um sofort Abnormale Zustände zu erkennen und die Daten auswerten zu können. Dafür nutzen wir Grafana.

Alle einzelnen Dienste/Instanzen werden jeweils in einem eigenen Docker-Container laufen.

Schritt 1: Überprüfen, ob der Storagenode läuft und Daten bereitstellt.

Das geht schnell. Einfach die URL deines laufenden Storagenodes aufrufen (Port 14002) und dann /api/sno/ an die URL anhängen.

Eine vollständige URL könnte dann so aussehen:

http://192.168.177.2:14002/api/sno/

Wenn Du hier nun Daten in Textform angezeigt bekommst, stimmt alles.

Schritt 2: Storagenode-Exporter aufsetzen

Wir verwenden für das Monitoring den folgenden Exporter:
https://github.com/anclrii/Storj-Exporter

Es ist natürlich möglich, einfach nur das “storj-exporter.py“-Script zu nutzen. Allerdings machen wir es uns hier etwas einfacher und nutzen direkt das zur Verfügung gestellte Docker-Image: https://hub.docker.com/r/anclrii/storj-exporter

Also einfach das Docker-Image herunterladen und mit folgendem Kommando als Docker-Container starten:

docker run -d --link=storagenode --name=storj-exporter -p 9651:9651 anclrii/storj-exporter:latest
Parameter
docker runDas Standard “docker -run” Kommando für die Erstellung eines Docker-Containers.
-dDer Container soll im “detached”-Modus, also im Hintergrund laufen.
–link=storagenodeDamit der Storj-Exporter Daten exportieren kann, MUSS er sich im gleichen Netzwerk wie der Docker-Container des Storagenodes befinden. Das erreicht man z.B. mit dem “link=” Parameter.
–name=storj-exporterDer Name des Containers. Ich nutze hier immer storj-exporter und eine Nummer. Für meinen 8. Node also z.B. storj-exporter8
-p 9651:9651Der Port, auf dem der Exporter lauscht (Der Port innerhalb des Containers und außerhalb des Containers)
anclrii/storj-exporter:latestDas Image, aus dem der Container gebaut wird. In diesem Fall “anclrii/storj-exporter” in der “latest” Version, also immer die aktuellste Version.
Tabelle 1: Erklärung der Parameter.

Storagenode-Exporter auf Synology NAS starten

Da meine Nodes auf einem Synology-NAS laufen, gehe ich meistens einen etwas anderen (und bequemeren) Weg über das GUI des NAS.

Schritt 2a: Docker GUI öffnen und Storj-Exporter Image laden

Synology NAS bieten ein tolles GUI für Docker. Wir öffnen Docker, klicken auf “Registrierung”, suchen nach “Storj-Exporter”, wählen das anclrii/storj-exporter image und klicken auf Download.
Das Image wird nun heruntergeladen und kann im nächsten Schritt gestartet werden.

Abbildung 3: Herunterladen des Storj-Exporter-Images.
Schritt 2b: Container starten

Zum Erstellen und Starten des Containers klicken wir auf “Abbild”, wählen das heruntergeladene anclrii/storj-exporter image aus und klicken auf “Starten”.

Abbildung 4: Einrichtung/Starten des Docker-Containers.
Schritt 2c: Container konfigurieren

Dasmit der Exporter funktioniert und die Daten im passenden Format bei der Datenbank (Prometheus) ankommen, müssen wir ein paar Einstellungen vornehmen.

Nachdem wir dem Container einen Namen gegeben haben, klicken wir im Erstell-Dialog auf “Erweiterte Einstellungen”.

Abbildung 5: Erstell-Dialog des Containers

Im nun öffnenden Fenster können wir detailliertere Einstellungen vornehmen.
So müssen wir unter dem Reiter “Netzwerk” das Netzwerk des Storagenodes auswählen und hinzufügen, dessen Daten wir exportieren wollen, z.B. “node8_default”:

Abbildung 6: Node-Container und Storagenode-Exporter-Container müssen im gleichen Netzwerk sein.

Als nächstes stellen wir den Port ein, auf dem der Storj-Exporter lauscht. Dafür klicken wir auf den Reiter “Port-Einstellungen”.
Der lokale Port ist der Port, unter dem der Container erreichbar ist. Der Container-Port ist der Port, auf dem der Dienst im Container lauscht. Der Container-Port muss hier immer 9651 sein, der lokale Port kann beliebig sein. Wichtig ist, dass der Port nicht bereits belegt ist.

Abbildung 7: Einstellen des Ports, auf dem der Exporter lauscht. Der lokale Port ist der Port, unter dem der Container erreichbar ist. Der Container-Port ist der Port, auf dem der Dienst im Container lauscht.

Wir müssen zu guter letzt noch eine Umgebungsvariable anpassen. Dadurch, dass sich beide Container im gleichen Netzwerk befinden, können diese über Hostnames kommunizieren.

Unter “STORJ_HOST_ADDRESS” müssen wir den Namen des Storagenode-Containers eintragen. In meinem Fall “node8”.

Abbildung 8: Anpassung von Umgebungsvariablen.

Jetzt können wir den Container starten.

Tipp: Um zu überprüfen, ob der Storagenode-Exporter richtig läuft, kannst Du ihn einfach in Deinem Browser aufrufen: Einfach die IP Deines NAS zusammen mit dem Port des Exporters aufrufen, also z.B.:

http://192.168.177.2:9658

Du solltest nun eine Textausgabe im Browser erhalten, die ungefähr so aussieht und alle möglichen Informationen zu Deinem Storagenode enthält:

# HELP python_gc_objects_collected_total Objects collected during gc
# TYPE python_gc_objects_collected_total counter
python_gc_objects_collected_total{generation="0"} 207.0
python_gc_objects_collected_total{generation="1"} 149.0
python_gc_objects_collected_total{generation="2"} 0.0
# HELP python_gc_objects_uncollectable_total Uncollectable object found during GC
# TYPE python_gc_objects_uncollectable_total counter
python_gc_objects_uncollectable_total{generation="0"} 0.0
python_gc_objects_uncollectable_total{generation="1"} 0.0
python_gc_objects_uncollectable_total{generation="2"} 0.0
# HELP python_gc_collections_total Number of times this generation was collected
# TYPE python_gc_collections_total counter
python_gc_collections_total{generation="0"} 51.0
python_gc_collections_total{generation="1"} 4.0
python_gc_collections_total{generation="2"} 0.0
# HELP python_info Python platform information
# TYPE python_info gauge
python_info{implementation="CPython",major="3",minor="7",patchlevel="8",version="3.7.8"} 1.0
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 2.7049984e+07
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 1.5732736e+07
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.60856339021e+09
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 9.11
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 7.0
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 524288.0
# HELP storj_nodeID_info Storj nodeID
# TYPE storj_nodeID_info gauge
storj_nodeID_info{nodeID="XXXXXXXXXXXXXXXXXXXXXXXXX"} 1.0
# HELP storj_wallet_info Storj wallet
# TYPE storj_wallet_info gauge
storj_wallet_info{wallet="XXXXXXXXXXXXXXXXXXXXXXXXXXXX"} 1.0
# HELP storj_lastPinged_info Storj lastPinged
# TYPE storj_lastPinged_info gauge
storj_lastPinged_info{lastPinged="2020-12-22T09:46:24.793286234Z"} 1.0
# HELP storj_upToDate_info Storj upToDate
# TYPE storj_upToDate_info gauge
storj_upToDate_info{upToDate="True"} 1.0
# HELP storj_version_info Storj version
# TYPE storj_version_info gauge
storj_version_info{version="1.18.1"} 1.0
# HELP storj_allowedVersion_info Storj allowedVersion
# TYPE storj_allowedVersion_info gauge
storj_allowedVersion_info{allowedVersion="1.13.0"} 1.0
# HELP storj_total_diskspace Storj total diskspace metrics
# TYPE storj_total_diskspace gauge
storj_total_diskspace{type="used"} 5.1062745984e+010
storj_total_diskspace{type="available"} 1e+013
# HELP storj_total_bandwidth Storj total bandwidth metrics
# TYPE storj_total_bandwidth gauge
storj_total_bandwidth{type="used"} 5.8287912448e+010
storj_total_bandwidth{type="available"} 0.0
# HELP storj_sat_summary Storj satellite summary metrics
# TYPE storj_sat_summary gauge
storj_sat_summary{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="storageSummary",url="saltlake.tardigrade.io:7777"} 3.0886337118353423e+012
storj_sat_summary{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="bandwidthSummary",url="saltlake.tardigrade.io:7777"} 1.576267904e+010
storj_sat_summary{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="disqualified",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="suspended",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="storageSummary",url="asia-east-1.tardigrade.io:7777"} 1.0186350511279784e+012
storj_sat_summary{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="bandwidthSummary",url="asia-east-1.tardigrade.io:7777"} 1.0788745216e+010
storj_sat_summary{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="disqualified",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="suspended",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="storageSummary",url="us-central-1.tardigrade.io:7777"} 1.1735204211911904e+012
storj_sat_summary{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="bandwidthSummary",url="us-central-1.tardigrade.io:7777"} 1.4185223168e+010
storj_sat_summary{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="disqualified",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="suspended",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="storageSummary",url="europe-west-1.tardigrade.io:7777"} 1.1339181092748848e+012
storj_sat_summary{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="bandwidthSummary",url="europe-west-1.tardigrade.io:7777"} 1.2314555648e+010
storj_sat_summary{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="disqualified",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="suspended",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="storageSummary",url="europe-north-1.tardigrade.io:7777"} 7.893088241720792e+011
storj_sat_summary{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="bandwidthSummary",url="europe-north-1.tardigrade.io:7777"} 5.236709376e+09
storj_sat_summary{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="disqualified",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_summary{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="suspended",url="europe-north-1.tardigrade.io:7777"} 0.0
# HELP storj_sat_audit Storj satellite audit metrics
# TYPE storj_sat_audit gauge
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="totalCount",url="saltlake.tardigrade.io:7777"} 16.0
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="successCount",url="saltlake.tardigrade.io:7777"} 16.0
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="alpha",url="saltlake.tardigrade.io:7777"} 11.637592
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="beta",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="unknownAlpha",url="saltlake.tardigrade.io:7777"} 11.637592
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="unknownBeta",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="score",url="saltlake.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="unknownScore",url="saltlake.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="totalCount",url="asia-east-1.tardigrade.io:7777"} 15.0
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="successCount",url="asia-east-1.tardigrade.io:7777"} 15.0
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="alpha",url="asia-east-1.tardigrade.io:7777"} 11.197465
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="beta",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="unknownAlpha",url="asia-east-1.tardigrade.io:7777"} 11.197465
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="unknownBeta",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="score",url="asia-east-1.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="unknownScore",url="asia-east-1.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="totalCount",url="us-central-1.tardigrade.io:7777"} 15.0
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="successCount",url="us-central-1.tardigrade.io:7777"} 15.0
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="alpha",url="us-central-1.tardigrade.io:7777"} 11.197465
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="beta",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="unknownAlpha",url="us-central-1.tardigrade.io:7777"} 11.197465
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="unknownBeta",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="score",url="us-central-1.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="unknownScore",url="us-central-1.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="totalCount",url="europe-west-1.tardigrade.io:7777"} 10.0
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="successCount",url="europe-west-1.tardigrade.io:7777"} 10.0
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="alpha",url="europe-west-1.tardigrade.io:7777"} 8.623997
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="beta",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="unknownAlpha",url="europe-west-1.tardigrade.io:7777"} 8.623997
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="unknownBeta",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="score",url="europe-west-1.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="unknownScore",url="europe-west-1.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="totalCount",url="europe-north-1.tardigrade.io:7777"} 3.0
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="successCount",url="europe-north-1.tardigrade.io:7777"} 3.0
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="alpha",url="europe-north-1.tardigrade.io:7777"} 3.709875
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="beta",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="unknownAlpha",url="europe-north-1.tardigrade.io:7777"} 3.709875
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="unknownBeta",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="score",url="europe-north-1.tardigrade.io:7777"} 1.0
storj_sat_audit{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="unknownScore",url="europe-north-1.tardigrade.io:7777"} 1.0
# HELP storj_sat_uptime Storj satellite uptime metrics
# TYPE storj_sat_uptime gauge
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="totalCount",url="saltlake.tardigrade.io:7777"} 393.0
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="successCount",url="saltlake.tardigrade.io:7777"} 349.0
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="alpha",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="beta",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="unknownAlpha",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="unknownBeta",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="score",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="unknownScore",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="totalCount",url="asia-east-1.tardigrade.io:7777"} 391.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="successCount",url="asia-east-1.tardigrade.io:7777"} 348.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="alpha",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="beta",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="unknownAlpha",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="unknownBeta",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="score",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="unknownScore",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="totalCount",url="us-central-1.tardigrade.io:7777"} 392.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="successCount",url="us-central-1.tardigrade.io:7777"} 348.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="alpha",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="beta",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="unknownAlpha",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="unknownBeta",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="score",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="unknownScore",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="totalCount",url="europe-west-1.tardigrade.io:7777"} 387.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="successCount",url="europe-west-1.tardigrade.io:7777"} 343.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="alpha",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="beta",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="unknownAlpha",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="unknownBeta",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="score",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="unknownScore",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="totalCount",url="europe-north-1.tardigrade.io:7777"} 380.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="successCount",url="europe-north-1.tardigrade.io:7777"} 336.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="alpha",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="beta",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="unknownAlpha",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="unknownBeta",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="score",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_uptime{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="unknownScore",url="europe-north-1.tardigrade.io:7777"} 0.0
# HELP storj_sat_month_egress Storj satellite egress since current month start
# TYPE storj_sat_month_egress gauge
storj_sat_month_egress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="repair",url="saltlake.tardigrade.io:7777"} 6.95808e+06
storj_sat_month_egress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="audit",url="saltlake.tardigrade.io:7777"} 4096.0
storj_sat_month_egress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="usage",url="saltlake.tardigrade.io:7777"} 8.61681408e+08
storj_sat_month_egress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="repair",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_month_egress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="audit",url="asia-east-1.tardigrade.io:7777"} 3840.0
storj_sat_month_egress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="usage",url="asia-east-1.tardigrade.io:7777"} 1.3236736e+08
storj_sat_month_egress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="repair",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_month_egress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="audit",url="us-central-1.tardigrade.io:7777"} 3840.0
storj_sat_month_egress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="usage",url="us-central-1.tardigrade.io:7777"} 1.91156224e+08
storj_sat_month_egress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="repair",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_month_egress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="audit",url="europe-west-1.tardigrade.io:7777"} 2560.0
storj_sat_month_egress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="usage",url="europe-west-1.tardigrade.io:7777"} 1.59559168e+08
storj_sat_month_egress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="repair",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_month_egress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="audit",url="europe-north-1.tardigrade.io:7777"} 768.0
storj_sat_month_egress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="usage",url="europe-north-1.tardigrade.io:7777"} 1.23858176e+08
# HELP storj_sat_month_ingress Storj satellite ingress since current month start
# TYPE storj_sat_month_ingress gauge
storj_sat_month_ingress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="repair",url="saltlake.tardigrade.io:7777"} 1.4673401088e+010
storj_sat_month_ingress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="usage",url="saltlake.tardigrade.io:7777"} 2.20634368e+08
storj_sat_month_ingress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="repair",url="asia-east-1.tardigrade.io:7777"} 1.98454016e+08
storj_sat_month_ingress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="usage",url="asia-east-1.tardigrade.io:7777"} 1.045792e+010
storj_sat_month_ingress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="repair",url="us-central-1.tardigrade.io:7777"} 2.55466496e+08
storj_sat_month_ingress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="usage",url="us-central-1.tardigrade.io:7777"} 1.3738596608e+010
storj_sat_month_ingress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="repair",url="europe-west-1.tardigrade.io:7777"} 2.88091392e+08
storj_sat_month_ingress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="usage",url="europe-west-1.tardigrade.io:7777"} 1.1866902528e+010
storj_sat_month_ingress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="repair",url="europe-north-1.tardigrade.io:7777"} 4.994917376e+09
storj_sat_month_ingress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="usage",url="europe-north-1.tardigrade.io:7777"} 1.17933056e+08
# HELP storj_sat_day_egress Storj satellite egress since current day start
# TYPE storj_sat_day_egress gauge
storj_sat_day_egress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="repair",url="saltlake.tardigrade.io:7777"} 2.31936e+06
storj_sat_day_egress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="audit",url="saltlake.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="usage",url="saltlake.tardigrade.io:7777"} 5.3288704e+07
storj_sat_day_egress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="repair",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="audit",url="asia-east-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="usage",url="asia-east-1.tardigrade.io:7777"} 2.444544e+06
storj_sat_day_egress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="repair",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="audit",url="us-central-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="usage",url="us-central-1.tardigrade.io:7777"} 2.648576e+06
storj_sat_day_egress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="repair",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="audit",url="europe-west-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="usage",url="europe-west-1.tardigrade.io:7777"} 13312.0
storj_sat_day_egress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="repair",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="audit",url="europe-north-1.tardigrade.io:7777"} 0.0
storj_sat_day_egress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="usage",url="europe-north-1.tardigrade.io:7777"} 4.249344e+06
# HELP storj_sat_day_ingress Storj satellite ingress since current day start
# TYPE storj_sat_day_ingress gauge
storj_sat_day_ingress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="repair",url="saltlake.tardigrade.io:7777"} 3.63295744e+08
storj_sat_day_ingress{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="usage",url="saltlake.tardigrade.io:7777"} 2.31936e+06
storj_sat_day_ingress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="repair",url="asia-east-1.tardigrade.io:7777"} 1.1511808e+07
storj_sat_day_ingress{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="usage",url="asia-east-1.tardigrade.io:7777"} 1.5321856e+08
storj_sat_day_ingress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="repair",url="us-central-1.tardigrade.io:7777"} 4.6784e+06
storj_sat_day_ingress{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="usage",url="us-central-1.tardigrade.io:7777"} 2.86240768e+08
storj_sat_day_ingress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="repair",url="europe-west-1.tardigrade.io:7777"} 7.416832e+06
storj_sat_day_ingress{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="usage",url="europe-west-1.tardigrade.io:7777"} 1.76900352e+08
storj_sat_day_ingress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="repair",url="europe-north-1.tardigrade.io:7777"} 1.1864832e+08
storj_sat_day_ingress{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="usage",url="europe-north-1.tardigrade.io:7777"} 4.374784e+06
# HELP storj_sat_day_storage Storj satellite data stored on disk since current day start
# TYPE storj_sat_day_storage gauge
storj_sat_day_storage{satellite="1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE",type="atRestTotal",url="saltlake.tardigrade.io:7777"} 1.006825624661148e+011
storj_sat_day_storage{satellite="121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6",type="atRestTotal",url="asia-east-1.tardigrade.io:7777"} 7.794560347457602e+010
storj_sat_day_storage{satellite="12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S",type="atRestTotal",url="us-central-1.tardigrade.io:7777"} 9.393335011022546e+010
storj_sat_day_storage{satellite="12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs",type="atRestTotal",url="europe-west-1.tardigrade.io:7777"} 9.68303803245109e+010
storj_sat_day_storage{satellite="12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB",type="atRestTotal",url="europe-north-1.tardigrade.io:7777"} 3.739283020213596e+010

Schritt 3: Prometheus aufsetzen

Mit Hilfe von Prometheus sammeln wir die entstehenden Daten aus dem Exporter (oder mehreren Exportern) ein, aggregieren diese und speichern sie persistent ab.
So können wir den Status der Storagenodes langfristig verfolgen und auf Probleme schnell reagieren sowie statistische Auswertungen vornehmen.

Schritt 3a: Containerimage laden

Auch Prometheus werden wir als Docker-Container laufen lassen. So haben wir den Dienst dauerhaft unter Kontrolle und zugleich in einer eigenen Umgebung vom Rest des Hosts und anderen Containern isoliert.

Analog zu Schritt 2 laden wir das Docke-Image “pom-prometheus:latest“.

Schritt 3b: Konfigurationsdatei erstellen

Bevor wir mit der Containererstellung starten, müssen wir im DSM ein Verzeichnis anlegen. Prinzipiell kann dieses Verzeichnis beliebig heißen. Ich habe alle meine Docker-Verzeichnisse unter dem Pfad “docker/” liegen. Das Verzeichnis für Prometheus nenne ich wenig überraschen “prometheus”.
In dem Verzeichnis erstelle ich noch ein Unterverzeichnis “data”.

Wir können nicht die gesamte Prometheus Konfiguration im Docker-Container vornehmen. Und die Konfiguration soll persistent sein, also auch den Neustart des Docker-Containers überdauern.

Daher erstellen wir im prometheus-Verzeichnis eine Datei namens “prometheus.yml”. In dieser Datei werden auch die Jobs für die zu monitorenden Storagenodes eingetragen. Ein Job wird nach folgendem Schema eingetragen:

  - job_name: 'storjnode1'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node1:9651']

Meine prometheus.yml sieht so aus:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'storjnode1'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node1:9651']
      
  - job_name: 'storjnode3'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node3:9651']  
      
  - job_name: 'storjnode4'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node4:9651']
      
  - job_name: 'storjnode5'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node5:9651']
      
  - job_name: 'storjnode6'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node6:9651']
      
  - job_name: 'storjnode7'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node7:9651']
  
  - job_name: 'storjnode8'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['node8:9651'] 

Die finalen Pfade sind dann z.B.

/volume1/docker/prometheus/data
/volume1/docker/prometheus/prometheus.yml
Abbildung 8: Erstelltes Datenverzeichnis für Prometheus (Ansicht: Im Finder von DSM).

TL;DR: Wieso erstellen wir dieses Verzeichnis und die prometheus.yml?

Ein großer Vorteil von Docker ist es, dass man Dienste in Containern laufen lassen kann, die keine “Spuren” auf dem Hostsystem hinterlassen. Der Container erfüllt seinen Job, erhält Input, und erzeugt Output, speichert aber KEINE Daten.
Wird der Container beendet, werde sämtliche erzeugten Daten gelöscht und bei einem Neustart des Containers ist dieser wieder exakt auf dem gleichen Stand wie bei der initialen Erstellung.

Dieser prinzipielle Vorteil wird bei unserem Prometheus jedoch zum Nachteil, da wir die einmal erstellte Konfiguration auch nach einem Neustart weiter verwenden möchten und da wir die gesammelten Daten ebenfalls nach einem Neustart des Containers erhalten wollen.
Daher mounten wir ein Verzeichnis vom Docker-Hostsystem in den Container. Alle dort gespeicherten Daten bleiben nach einem Neustart des Containers erhalten. Im Fachchinesisch werden sie “persistiert”.

Schritt 3c: Container konfigurieren und starten

Analog zu Schritt 2 müssen wir den Container nun zunächst konfigurieren und dann starten. Der Name ist wie immer beliebig.

Abbildung 9: Erstellung des Docker-Containers für Prometheus

Jetzt mounten wir das eben erstellte Prometheus-Verzeichnis und die prometheus.yml in den Container:

Abbildung 10: Gemountete Volumes und Files bei der Prometheus-Containererstellung.

Wie bei den anderen Containern stellen wir noch den Port ein. Der interne Port (Container-Port) muss 9090 sein, der externe/lokale Port ist beliebig, ich belasse ihn ebenfalls bei 9090.

Abbildung 11: Porteinstellungen des Prometheus Containers.

Nun kommen wir zu einer wichtigen Einstellung: Die Verlinkung der vorhin erstellten Storj-Exporter-Container. Damit Prometheus Daten empfangen kann, muss der Container mit den eben angelegten Storj-Exporter-Containern verlinkt sein. Pro Storagenode habe ich z.B. einen Exporter. Diese habe ich alle mit dem Prometheus-Container verlinkt (und jeweils ein Alias vergeben).

Abbildung 12: Gelinkte Container im Prometheus-Container.

Super, jetzt kannst Du den Prometheus-Container starten.

Ob der Container ordnungsgemäß läuft, kannst du überprüfen, indem du Prometheus in deinem Browser aufrufst und die Targets/Jobs checkst:

http://192.168.177.2:9090/targets

Die IP musst du wie immer mit deiner IP ersetzen.

Wenn der Container funktioniert, sollte das Ganze ungefähr so aussehen:

Abbildung 13: Prometheus Targets/Jobs.

Schritt 4: Grafana aufsetzen

Grafana ist die Software, die die grafische Darstellung, also die Visualisierung der gesammelten Daten für uns übernimmt.

Auch diese Software lassen wir in einem Docker-Container laufen. Wir laden dafür wie gewohnt im DSM das Docker Image “grafana” herunter (“Registrieren”).

Schritt 4a: Verzeichnisse anlegen

Auch für Grafana richten wir zunächst Verzeichnisse ein, die persistente Daten enthalten sollen:

/volume1/docker/grafana

Wichtig: Damit grafana später starten kann, müssen wir die Schreibrechte in dem Verzeichnis anpassen:

Abbildung 14: Schreibrechte für den Grafana-Container im spezifischen grafana-Verzeichnis einrichten.

Achtung: Ich habe hier exemplarisch jedem Schreibrechte auf dem grafana-Verzeichnis gegeben. Eigentlich sollte man die Berechtigungen hier feingranularer vergeben.

Schritt 4b: Container einstellen und starten

Dann erstellen wir wie gewohnt den Container mit folgenden Einstellungen:

Abbildung 15: In den Grafana-Container gemountetes Verzeichnis.
Abbildung 16: Porteinstellungen des Grafana-Containers.
Abbildung 17: Verlinkte Container.

Direkt nach dem Anlegen kannst du den Container starten.

Schritt 4c: Datenquelle anlegen

Nachdem wir den Container gestartet haben, können wir über folgende URL die Grafana-Instanz aufrufen (wie immer die IP mit deiner IP ersetzen):

http://192.168.177.2:3001/

Es sollte der Login-Bildschirm laden. Du kannst dich mit den Standard-Login-Daten einloggen (Benutzername: admin; Passwort: admin), die du natürlich nach der Einrichtung ändern solltest!

Wir klicken nun auf “Configuration”, “Data Sources”, “Add data source” um eine neue Datenquellle (unser eben aufgesetztes Prometheus) zu verbinden.

Abbildung 18: Hinzufügen einer Datenquelle.

In der dann öffnenden Liste wählen wir “Prometheus”.

Nun können wir die Verbindungsdaten zu unserem Prometheus-Container eintragen. Im Feld “URL” geben wir “http://192.168.177.2:9090” an – also unsere IP mit dem passenden Port.

Dann haken wir noch “Skip TLS verify” an, da wir die Instanz nur lokal in unserem eigenen Netzwerk nutzen wollen.

Nach einem Klick auf “Speichern und Testen” ist das Dashboard angelegt. Wir erhalten zugleich Feedback, ob die Datenquelle funktioniert. Fertig.

Abbildung 19: Nach einem klick auf “Speichern und Testen” ist das Dashboard angelegt. Wir erhalten zugleich Feedback, ob die Datenquelle funktioniert.

Schritt 4d: Dashboard-Layout installieren

Wir haben nun einen funktionsfähigen Grafana-Container am laufen und die Datenquelle Prometheus eingebunden. Super!
Jetzt müssen wir uns die gesammelten Daten nur noch schön anzeigen lassen 😉

Dafür laden wir uns ein von der Storj-Community erstelltes Dashboard Layout bei GitHub herunter: https://github.com/anclrii/Storj-Exporter-dashboard
Es reicht genau genommen, hier die JSON-Datei herunterzuladen.

Nachdem du das Dashboard hinzugefügt hast, kannst du dein Grafana aufrufen und das Dashboard auswählen. as sieht dan z.B. so aus:

Abbildung 20: So könnte das fertige Dashboard aussehen.

Schritt 5: Daten sammeln und auswerten 😉

Herzlichen Glückwunsch!
Nun hast du ein umfangreiches Monitoring für deine Storagenodes eingerichtet.

PS: Ich monitore meine Storagenodes ebenfalls. Aktuelle Statistiken zu meinen Nodes findest du hier: https://addictedtocode.de/storj/statistiken-zu-meinen-storagenodes/

Quelle: https://forum.storj.io/t/prometheus-storj-exporter/1939

  1. Avatar-Foto

    Felix

    Hallo und vielen Dank für die super Anleitung. Leider hänge ich an dem Punkt, wo ich im Container des Storagenode-Exporter unter Netzwerk mein Node hinzufügen soll. Dies ist leider nicht möglich. Ich erhalte die Nachricht, dass “keine weiteren Netzwerke verfügbar” sein. Wo liegt mein Fehler?

    • Avatar-Foto
      Kommentar des Beitrags-Autors

      Jan-Dirk

      Hallo Felix,

      vermutlich befindet sich dein Storagenode-Container dann im Default-Netzwerk und hat kein eigenes Netzwerk. In diesem Fall würde ich einfach mal versuchen, ob auch so eine Verbindung hergestellt und die Daten ausgelesen werden können.
      Ggf. musst Du später in der Umgebungsvariable “STORJ_HOST_ADDRESS” dann statt dem Container- bzw. Hostnamen die IP 127.0.0.1 eintragen.

      Beste Grüße
      Jan-Dirk

  2. Avatar-Foto

    Felix

    Danke, hat tatsächlich sofunktioniert.

  3. Avatar-Foto

    Kevin

    Hi, wirklich tolle Anleitung. Mich würde noch interessieren wie man das Monitoring mehrerer Nodes lösen würde, wenn diese an unterschiedlichen Internetanschlüssen hängen. Vorhanden als zentrales Monitoring System wäre dann ein vorhandener Webserver im Internet

    • Avatar-Foto
      Kommentar des Beitrags-Autors

      Jan-Dirk

      Hallo Kevin,

      das ist im Prinzip kein Problem. Alle “Bestandteile” des Monitoring-Systems arbeiten über TCP/IP und/oder Hostnames. Im Prinzip könnte man hier auch “entfernte” feste IP-Adressen oder dynamische-dns-hostnames eintragen. Die entsprechenden Portfreigaben muss man natürlich beachten und im besten Fall nutzt man noch einen Authentifizierungsmechanismus, damit die Daten der Storagenodes nicht frei über das Internet abrufbar sind.

      Welche Komponenten/Container man nun wo laufen lässt ist dabei fast egal.
      Auf jeden Fall empfiehlt es sich, den Grafana-Container zentral laufen zu lassen.

      Beste Grüße
      Jan-Dirk

  4. Avatar-Foto

    Sven

    Hallo,
    ich hab anhand deiner Anleitung dies für meine storagenode zum Laufen bekommen. Vielen Dank! 😊
    Ich möchte nun eine zweite Storagenode auf meiner zweiten Synology starten. Kannst du mir bitte sagen, wie ich beide Nodes in Grafana angezeigt bekomme?
    Funktioniert das überhaupt, wenn die Nodes zwar im gleichen Netzwerk, aber auf unterschiedlichen NAS laufend?

Schreibe eine Antwort