Mastodon Grafana Statistiken (Docker)

Ursprünglich veröffentlicht unter: https://adminforge.de/tools/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.

adminForge Mastodon Grafana Dashboard

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:

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

  1. Tauscht kanoa.de gegen eure Mastodon Domain aus.
  2. Wenn Prometheus NICHT auf dem selben Host läuft, ändert 127.0.0.1 gegen eure interne IP-Adresse aus.
  3. Solltet ihr Prometheus und Mastodon in einem Docker Netzwerk betreiben, könnt ihr natürlich auch direkt mastodon-exporter:13120 und statsd-exporter:9102 in Promehteus ansprechen und die Ports in der Config weglassen.

Punkt 2: Mastodon Konfiguration

Fügt in eurer .env.production diese Statsd Zeile hinzu.

STATSD_ADDR=statsd-exporter:9125

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.

## 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.

[..]
  - 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‘ ]
  1. Wenn Mastodon NICHT auf dem selben Host läuft, ändert 127.0.0.1 gegen eure interne IP-Adresse aus.
  2. Solltet ihr Prometheus und Mastodon in einem Docker Netzwerk betreiben, könnt ihr natürlich auch direkt mastodon-exporter:13120 und statsd-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

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.

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.

  1. Unter General vergebt ihr euren individuellen Namen.
  2. Im Menü Variables ändern wir diese Variablen ab:
    1. node Regex von web03 auf euren node-exporter Servernamen
    2. mountpoint Regex auf euren Mountpoint des Mastodon Cache Ordners ändern
    3. 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

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende.