Mastodon Grafana Statistiken (Docker)
Für die adminForge Mastodon Instanz kanoa.de habe ich vor kurzem ein Grafana Dashboard erstellt.
In dieser Anleitung möchte ich euch zeigen, welche Tools ihr benötigt um das Dashboard bei eurer Mastodon Instanz ans laufen zu bekommen.
Als Grundlage benötigt ihr folgende Services aus der Anleitung Jitsi Meet Grafana Statistiken (Docker)
- Grafana
- Prometheus
- Node-Exporter
- Cadvisor
sowie einer funktionierenden Docker Mastodon Installation.
Für Mastodon kommen diese Services hinzu:
- mastodon-exporter
- statsd-exporter
Erklärung der einzelnen Services:
- prometheus: sammelt Metriken bei den Exportern ein
- node-exporter: liefert System Metriken
- cadvisor: liefert Docker Metriken
- grafana: holt Metriken von Prometheus und stellt diese grafisch ansprechend dar
- mastodon-exporter: liefert uns die Benutzeranzahl Metrik
- statsd-exporter: liefert Mastodon Metriken zu Puma, SQL, Cache und Sidekiq
Punkt 1: Installation der Exporter
Um die registrierten Benutzer zu erfassen nutzen wir den prometheus-mastodon-exporter von systemli, dieser ist schlank und leicht zu konfigurieren. Die restlichen Metriken werden über den statsd-exporter gesammelt.
Fügt beide Exporter in eurer Mastodon docker-compose.yml
Konfiguration hinzu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | version: '3' services: [..] mastodon-exporter: image: systemli/prometheus-mastodon-exporter:latest restart: always ports: - "127.0.0.1:13120:13120" command: - '-mastodon-url=https://kanoa.de' statsd-exporter: image: prom/statsd-exporter:latest restart: always command: "--statsd.mapping-config=/tmp/statsd-mapping.yaml" ports: - "127.0.0.1:9102:9102" volumes: - "./statsd-mapping.yaml:/tmp/statsd-mapping.yaml" networks: - external_network - internal_network [..] networks: external_network: internal_network: internal: true |
- Tauscht
kanoa.de
gegen eure Mastodon Domain aus. - Wenn Prometheus NICHT auf dem selben Host läuft, ändert
127.0.0.1
gegen eure interne IP-Adresse aus. - Solltet ihr Prometheus und Mastodon in einem Docker Netzwerk betreiben, könnt ihr natürlich auch direkt
mastodon-exporter:13120
undstatsd-exporter:9102
in Promehteus ansprechen und die Ports in der Config weglassen.
Punkt 2: Mastodon Konfiguration
Fügt in eurer .env.production
diese Statsd Zeilen hinzu.
1 2 3 | STATSD_ADDR=statsd-exporter:9125 STATSD_NAMESPACE=Mastodon.production STATSD_SIDEKIQ=true |
Das direkte ansprechen per Hostname ist möglich, da der Exporter im selben Netzwerk wie Mastodon läuft.
Punkt 3: statsd-mapping.yaml erstellen
Als Grundlage habe ich das Grafana Dashboard von IPng Networks genutzt und erweitert. Dies erfordert Statsd und das passende Statsd Mapping.
Erstellt eine Datei statsd-mapping.yaml
mit folgenden Inhalt direkt in eurem Mastodon Ordner.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | ## Prometheus Statsd Exporter mapping for Mastodon 4.0+ ## ## Version 1.0, November 2022 ## ## Documentation: https://ipng.ch/s/articles/2022/11/27/mastodon-3.html mappings: ## Web collector - match: Mastodon\.production\.web\.(.+)\.(.+)\.(.+)\.status\.(.+) match_type: regex name: "mastodon_controller_status" labels: controller: $1 action: $2 format: $3 status: $4 mastodon: "web" - match: Mastodon\.production\.web\.(.+)\.(.+)\.(.+)\.db_time match_type: regex name: "mastodon_controller_db_time" labels: controller: $1 action: $2 format: $3 mastodon: "web" - match: Mastodon\.production\.web\.(.+)\.(.+)\.(.+)\.view_time match_type: regex name: "mastodon_controller_view_time" labels: controller: $1 action: $2 format: $3 mastodon: "web" - match: Mastodon\.production\.web\.(.+)\.(.+)\.(.+)\.total_duration match_type: regex name: "mastodon_controller_duration" labels: controller: $1 action: $2 format: $3 mastodon: "web" ## Database collector - match: Mastodon\.production\.db\.tables\.(.+)\.queries\.(.+)\.duration match_type: regex name: "mastodon_db_operation" labels: table: "$1" operation: "$2" mastodon: "db" ## Cache collector - match: Mastodon\.production\.cache\.(.+)\.duration match_type: regex name: "mastodon_cache_duration" labels: operation: "$1" mastodon: "cache" ## Sidekiq collector - match: Mastodon\.production\.sidekiq\.(.+)\.processing_time match_type: regex name: "mastodon_sidekiq_worker_processing_time" labels: worker: "$1" mastodon: "sidekiq" - match: Mastodon\.production\.sidekiq\.(.+)\.success match_type: regex name: "mastodon_sidekiq_worker_success_total" labels: worker: "$1" mastodon: "sidekiq" - match: Mastodon\.production\.sidekiq\.(.+)\.failure match_type: regex name: "mastodon_sidekiq_worker_failure_total" labels: worker: "$1" mastodon: "sidekiq" - match: Mastodon\.production\.sidekiq\.queues\.(.+)\.enqueued match_type: regex name: "mastodon_sidekiq_queue_enqueued" labels: queue: "$1" mastodon: "sidekiq" - match: Mastodon\.production\.sidekiq\.queues\.(.+)\.latency match_type: regex name: "mastodon_sidekiq_queue_latency" labels: queue: "$1" mastodon: "sidekiq" - match: Mastodon\.production\.sidekiq\.(.+) match_type: regex name: "mastodon_sidekiq_$1" labels: mastodon: "sidekiq" |
Mit docker-compose up -d
aktiviert ihr eure Mastodon Änderungen.
Punkt 4: Prometheus Konfiguration
Wechselt in die Konfigurationsdatei prometheus.yml
eures Prometheus und fügt diese Zeilen hinzu.
1 2 3 4 5 6 7 8 9 10 11 12 | [..] - job_name: "mastodon" scrape_interval: 5s metrics_path: "/metrics" static_configs: - targets: [ '127.0.0.1:13120' ] - job_name: "statsd-exporter" scrape_interval: 5s metrics_path: "/metrics" static_configs: - targets: [ '127.0.0.1:9102' ] |
- Wenn Mastodon NICHT auf dem selben Host läuft, ändert
127.0.0.1
gegen eure interne IP-Adresse aus. - Solltet ihr Prometheus und Mastodon in einem Docker Netzwerk betreiben, könnt ihr natürlich auch direkt
mastodon-exporter:13120
undstatsd-exporter:9102
in Promehteus ansprechen.
Mit docker-compose up -d
aktiviert ihr eure Prometheus Änderungen.
Punkt 5: Node-Exporter anpassen (optional)
Der Node-Exporter kann ohne Anpassung nur auf Netzwerkinterfaces eth0
und lo
zugreifen. Wenn ihr wie ich ens18
als öffentliches Interface habt, muss der Netzwerkmodus geändert werden: network_mode: host
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | node-exporter: image: prom/node-exporter:latest restart: unless-stopped network_mode: host volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--path.rootfs=/rootfs' - '--collector.filesystem.ignored-mount-points="^(/rootfs|/host|)/(sys|proc|dev|host|etc)($$|/)"' - '--collector.filesystem.ignored-fs-types="^(sys|proc|auto|cgroup|devpts|ns|au|fuse\.lxc|mqueue)(fs|)$$"' |
ACHTUNG: Damit werden die Metriken unter Port 9100 auch über öffentliche IP-Adressen erreichbar sein! Sperrt die Zugriffe z.B. über iptables.
1 2 | iptables -A INPUT -d PUBLIC-IPv4 -p tcp -m tcp --dport 9100 -j REJECT ip6tables -A INPUT -d PUBLIC-IPv6 -p tcp -m tcp --dport 9100 -j REJECT |
Mit docker-compose up -d
aktiviert ihr eure Node-Exporter Änderungen.
Punkt 6: Grafana Dashboard importieren
Jetzt öffnet euer Grafana und klickt links im Menü auf Dashboards > Import.
Speichert das JSON File adminForge Mastodon.json ab und importiert es mit einem Klick auf Upload JSON file.
Wählt euer Prometheus als Datasource aus und klick auf Import.
Punkt 7: Dashboard Variablen anpassen
Im Dashboard angekommen klicken wir oben rechts auf Dashboard settings.
- Unter General vergebt ihr euren individuellen Namen.
- Im Menü Variables ändern wir diese Variablen ab:
- node Regex von web03 auf euren node-exporter Servernamen
- mountpoint Regex auf euren Mountpoint des Mastodon Cache Ordners ändern
- nic Regex von ens18 auf eure Netzwerkkarte einstellen
Fertig! Viel Spaß mit dem Dashboard.
Verpasse keine Neuigkeiten und folge adminForge auf Mastodon.
Euer adminForge Team
Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld. Unterstütze unsere Arbeit mit einer Spende. |
Starte eine Diskussion unter community.adminforge.de