Een Complete DevOps Monitoring Stack Opzetten

Leer hoe je een robuuste monitoring stack bouwt met Prometheus, Grafana en alerting voor production workloads.

Jean-Pierre Broeders

Freelance DevOps Engineer

16 februari 20266 min. leestijd
Een Complete DevOps Monitoring Stack Opzetten

Een Complete DevOps Monitoring Stack Opzetten

Monitoring is het zenuwstelsel van je infrastructure. Zonder goede observability vlieg je blind en ontdek je problemen pas wanneer gebruikers al klagen. In deze post laat ik zien hoe je een professionele monitoring stack opzet die je real-time inzicht geeft in je systemen.

Waarom Monitoring Essentieel Is

Production systemen zijn complex. Applicaties crashen, disks raken vol, databases worden traag, en netwerk connections timeout. Goede monitoring helpt je:

  • Problemen vroegtijdig detecteren voordat ze impact hebben
  • Root cause analysis sneller uitvoeren
  • Trends identificeren die wijzen op toekomstige problemen
  • SLA's handhaven met concrete metrics

De Stack: Prometheus + Grafana + Alertmanager

De meest populaire open-source monitoring stack bestaat uit:

  • Prometheus: Time-series database en metrics collector
  • Grafana: Dashboarding en visualisatie
  • Alertmanager: Intelligent alert routing en grouping
  • Node Exporter: Systeem metrics (CPU, RAM, disk)
  • cAdvisor: Container metrics

Opzetten met Docker Compose

Hier is een production-ready setup:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'
    ports:
      - "9090:9090"
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/dashboards:/etc/grafana/provisioning/dashboards
      - ./grafana/datasources:/etc/grafana/provisioning/datasources
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=changeme
      - GF_USERS_ALLOW_SIGN_UP=false
    ports:
      - "3000:3000"
    restart: unless-stopped

  alertmanager:
    image: prom/alertmanager:latest
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
    ports:
      - "9093:9093"
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    command:
      - '--path.rootfs=/host'
    volumes:
      - '/:/host:ro,rslave'
    ports:
      - "9100:9100"
    restart: unless-stopped

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - "8080:8080"
    restart: unless-stopped

volumes:
  prometheus-data:
  grafana-data:

Prometheus Configuratie

Maak prometheus.yml met je scrape targets:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

rule_files:
  - "alerts.yml"

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

  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100']

  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

Alert Rules Configureren

Maak alerts.yml voor kritieke situaties:

groups:
  - name: system_alerts
    interval: 30s
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage detected"
          description: "CPU usage is above 80% for 5 minutes on {{ $labels.instance }}"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 < 10
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Disk space critically low"
          description: "Only {{ $value }}% disk space remaining on {{ $labels.instance }}"

      - alert: ServiceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Service is down"
          description: "{{ $labels.job }} on {{ $labels.instance }} has been down for 2 minutes"

Alertmanager Setup

Configureer alertmanager.yml voor notificaties:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'default'

receivers:
  - name: 'default'
    webhook_configs:
      - url: 'http://your-webhook-endpoint'
        send_resolved: true

Grafana Dashboards

Na het opstarten van de stack:

  1. Open http://localhost:3000
  2. Login met admin/changeme
  3. Voeg Prometheus toe als datasource (http://prometheus:9090)
  4. Import community dashboards:
    • Node Exporter Full (ID: 1860)
    • Docker Container & Host Metrics (ID: 179)

Best Practices

Retention instellen: Bewaar metrics niet eindeloos. 30 dagen is vaak voldoende voor troubleshooting.

Labeling strategie: Gebruik consistente labels zoals environment, service, instance voor betere filtering.

Alert fatigue voorkomen: Te veel alerts = geen alerts. Focus op actionable warnings.

Dashboard per service: Maak dedicated dashboards voor elke applicatie met relevante metrics.

Backup je configuratie: Prometheus data is vervangbaar, maar je dashboards en alerts niet.

Conclusie

Een goede monitoring stack is niet optioneel voor production workloads. Met Prometheus en Grafana bouw je in een middag een professioneel systeem dat je waarschuwt voor problemen en inzicht geeft in je infrastructure. Start simpel, voeg incremental metrics toe, en verfijn je alerts op basis van ervaring.

English summary: This article explains how to build a complete DevOps monitoring stack using Prometheus, Grafana, and Alertmanager. It covers Docker Compose setup, alert configuration, and best practices for production observability.

Wil je op de hoogte blijven?

Schrijf je in voor mijn nieuwsbrief of neem contact op voor freelance projecten.

Neem Contact Op