Grafana Monitoring on a Raspberry Pi

Grafana Monitoring on a Raspberry Pi

by | 3 min read
Published:
Updated:

As you might have seen from my last few posts I have quite a lot running on my Raspberry Pi.

I am currently using a Raspberry Pi 2 B which is a great device but only has 1GB of RAM and 900 MHz CPU. So I am a little worried sometimes that I am going to overload it with all the docker services I am running on it.

I use Grafana a lot at work and love it, so I thought it would be good to use it to monitor my Raspberry Pi.

Monitoring Aim

With any monitoring, it is important to know what you want to keep an eye on.

In my case I am interested in the following:

  • CPU - If the CPU ends up running at 100% a lot of the time, I might need to scale down the services running on it
  • Memory - With only 1GB of memory I need to keep an eye on how much I run on it.
  • Hard Disk Space - I have a 32GB SD card in my Pi but I have had one fill up before which makes the whole thing unresponsive.
  • Container data - I want to know which containers are causing high CPU and Memory usage.

What we need

There are probably quite a few services that work with Grafana for monitoring. However, I am using the following:

  • Grafana - obviously!
  • Prometheus - for gathering the data in a time series.
  • cAdvisor - A container monitor from Google to monitor the resources used by containers.
  • Node Exporter - Prometheus exporter for hardware and OS metrics
  • Docker - obviously
  • Traefik - I use this as my reverse proxy if you don’t have a reverse proxy set up you can follow my previous post, Traefik vs Nginx for Reverse Proxy with Docker on a Raspberry Pi.
🚀 Are you looking to level up your engineering career?

You might like my free weekly newsletter, The Curious Engineer, where I give career advice and tackle complex engineering topics.

📨 Don't miss out on this week's issue

Docker Compose Set up

I will go straight to the Docker Compose file you need and will explain what you need to change for your setup:

version: '3.4'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: monitoring_prometheus
    restart: unless-stopped
    volumes:
      - ./data/prometheus/config:/etc/prometheus/
      - ./data/prometheus/data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    expose:
      - 9090
    links:
      - cadvisor:cadvisor
      - node-exporter:node-exporter
    networks:
      - pi

  node-exporter:
    image: prom/node-exporter:latest
    container_name: monitoring_node_exporter
    restart: unless-stopped
    expose:
      - 9100
    networks:
      - pi

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: monitoring_cadvisor
    privileged: true
    restart: unless-stopped
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    devices:
      - /dev/kmsg
    expose:
      - 8080
    networks:
      - pi

  grafana:
    image: grafana/grafana:latest
    container_name: monitoring_grafana
    restart: unless-stopped
    links:
      - prometheus:prometheus
    volumes:
      - ./data/grafana:/var/lib/grafana
    environment:
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_SERVER_DOMAIN=yourdomain.com
      - GF_SERVER_ROOT_URL=https://yourdomain.com/grafana/
      - GF_SERVER_SERVE_FROM_SUB_PATH=true
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.grafana.rule=PathPrefix(`/grafana{regex:$$|/.*}`)'
      - 'traefik.http.services.grafana.loadbalancer.server.port=3000'
      - 'traefik.frontend.headers.customRequestHeaders=Authorization:-'
    networks:
      - pi

networks:
  pi:
    external: true

You only need to change the following environment variables to match the domain for your Raspberry Pi. If you are running locally you could use localhost and http://localhost/grafana.

- GF_SERVER_DOMAIN=yourdomain.com
- GF_SERVER_ROOT_URL=https://yourdomain.com/grafana/

This is the Prometheus config file I am using, prometheus.yml:

# my global config
global:
  scrape_interval: 120s # By default, scrape targets every 15 seconds.
  evaluation_interval: 120s # By default, scrape targets every 15 seconds.
  # 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: 'my-project'

# Load and evaluate rules in this file every 'evaluation_interval' seconds.
rule_files:
  # - "alert.rules"
  # - "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'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 120s

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

    static_configs:
      - targets: ['localhost:9090', 'cadvisor:8080', 'node-exporter:9100']

Dashboard Set Up

This is what my Grafana dashboard looks like. If you want something similar then you can copy my dashboard json.

Full Grafana Dashboard

There are quite a few other metrics available from node-exporter and cAdvisor I could have used. Let me know in the comments if find any useful ones.


🙏 Was this helpful? If you want to say thanks, I love coffee ☕️ , any support is appreciated.


ALSO ON ALEXHYETT.COM

What is Event Driven Architecture?

What is Event Driven Architecture?

  • 14 April 2023
One of the leading architecture patterns used with microservices is event-driven architecture. Event-driven architecture has many benefits…
Hosting n8n for Free with Railway

Hosting n8n for Free with Railway

  • 30 January 2023
I have been using n8n for a couple of months now, and it has allowed me to automate so much of my daily workflow. These are some of the…
Using GitHub Actions to Deploy to S3

Using GitHub Actions to Deploy to S3

  • 26 March 2021
Recently I went through the process of setting up Drone CI on my Raspberry Pi. The plan was to use my Raspberry Pi as a build server for…
Getting Started with AWS Step Functions

Getting Started with AWS Step Functions

  • 12 March 2021
I have recently been looking into AWS Step Functions. For those not familiar with them, Step Functions are Amazon’s way of providing a state…
Useful Docker Commands Worth Saving

Useful Docker Commands Worth Saving

  • 12 February 2021
I use docker every day. All the applications I write at work or at home end up in docker containers. Most of the time though, I am only…
How to set up Drone CI on Raspberry Pi (and why you shouldn't)

How to set up Drone CI on Raspberry Pi (and why you shouldn't)

  • 27 January 2021
I wanted to put together my home build server using my Raspberry Pi. After looking at the options I picked Drone CI, it has a nice interface…
Traefik vs Nginx for Reverse Proxy with Docker on a Raspberry Pi

Traefik vs Nginx for Reverse Proxy with Docker on a Raspberry Pi

  • 20 January 2021
I use my Raspberry Pi as my own personal home server. Up until recently, I have been using nginx as a reverse proxy for my docker containers…
Hosting a Secure Static Website on AWS S3 using Terraform (Step By Step Guide)

Hosting a Secure Static Website on AWS S3 using Terraform (Step By Step Guide)

  • 14 January 2021
By the time you finish reading this article, you will know how to get your static websites up and running securely on AWS using Terraform…