1
mirror of https://github.com/jakejarvis/mastodon-utils.git synced 2025-04-26 09:05:21 -04:00
mastodon-utils/notes/prometheus.md

6.9 KiB

Prometheus & Grafana notes

Exporters


wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xvf node_exporter-1.3.1.linux-amd64.tar.gz
cp node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/

useradd --no-create-home --shell /bin/false node_exporter
chown node_exporter:node_exporter /usr/local/bin/node_exporter

nano /etc/system/systemd/node-exporter.service # see below

systemctl daemon-reload
systemctl enable --now redis-exporter.service

Config

/etc/prometheus/prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node_exporter_metrics"
    static_configs:
      - targets: ["localhost:9100"]

  - job_name: "redis_exporter_targets"
    static_configs:
      - targets: ["redis://localhost:6379"]
    metrics_path: /scrape
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: localhost:9121

  - job_name: "redis_exporter_metrics"
    static_configs:
      - targets: ["localhost:9121"]

  - job_name: "postgres_exporter_metrics"
    static_configs:
      - targets: ["localhost:9187"]

  - job_name: "nginx_exporter_metrics"
    static_configs:
      - targets: ["localhost:9113"]

  - job_name: "statsd_exporter_metrics"
    static_configs:
      - targets: ["localhost:9102"]

  - job_name: "elasticsearch_exporter_metrics"
    static_configs:
      - targets: ["localhost:9114"]

  - job_name: "json_exporter_metrics"
    static_configs:
      - targets: ["localhost:9079"]

  - job_name: "json_exporter_targets"
    metrics_path: /probe
    scrape_interval: 30s
    params:
      module: [linode]
    static_configs:
      - targets:
        - https://api.linode.com/v4/object-storage/buckets/us-east-1/jarvis-mastodon
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: localhost:9079

json-config.yml:

modules:
  linode:
    metrics:
    - name: json_linode_size
      path: "{.size}"
      labels:
        bucket: "{.label}"
        zone: "{.cluster}"
        hostname: "{.hostname}"

    - name: json_linode_objects
      path: "{.objects}"
      labels:
        bucket: "{.label}"
        zone: "{.cluster}"
        hostname: "{.hostname}"

    headers:
      Authorization: "Bearer XXXXXX"

/etc/prometheus/statsd-mapping.yml:

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

/home/mastodon/live/.env.production:

STATSD_ADDR=localhost:9125

(example) /etc/systemd/system/redis-exporter.service:

[Unit]
Description=Redis Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=redis_exporter
Group=redis_exporter
Type=simple
ExecStart=/usr/local/bin/redis_exporter
Restart=always

[Install]
WantedBy=multi-user.target

/etc/grafana/grafana.ini:

[server]
http_addr =
http_port = 3003
root_url = https://grafana.pipe.fail

[analytics]
reporting_enabled = false
check_for_updates = false
check_for_plugin_updates = false
feedback_links_enabled = false

[security]
disable_initial_admin_creation = true
disable_gravatar = true
cookie_secure = true

[snapshots]
external_enabled = false

[dashboards]
versions_to_keep = 100

[users]
allow_sign_up = false
default_theme = dark

[auth]
disable_login = true
disable_login_form = true

[auth.grafana_com]
enabled = true
allow_sign_up = false
client_id =
client_secret =
scopes = user:email
allowed_organizations =

[metrics]
enabled = false

[live]
max_connections = 10

[feature_toggles]
publicDashboards = true