July 13, 2023

Building an Effective Monitoring Stack for Docker Containers: Exploring Grafana, Prometheus, and cAdvisor

INTRODUCTION: 

In this blog post, we will delve into the world of container monitoring and explore the essential components of building a robust monitoring stack for Docker containers. Our focus will be on the Grafana Monitoring Stack, a powerful combination of tools and techniques that enable us to gain deep insights into our containerized applications' performance, health, and security. By the end of this article, you'll have the knowledge and tools necessary to ensure the stability and optimal performance of your Dockerized environments.

To accomplish this, we will concentrate on three key tools: Grafana, Prometheus, and cAdvisor. When combined, these tools offer a complete and scalable solution for monitoring Docker containers.

Grafana, an open-source visualization and analytics platform, plays a pivotal role in our monitoring stack. It empowers us to create customizable dashboards, allowing us to monitor and analyze data from various sources effortlessly.

Prometheus, another open-source tool, excels at collecting and storing time-series data. With its powerful monitoring and alerting capabilities, Prometheus enables us to effectively track and respond to changes in our containerized environments.

Completing our monitoring stack is cAdvisor (Container Advisor), an open-source tool developed by Google that provides detailed insights into individual containers' resource usage and performance characteristics. By leveraging cAdvisor, we can closely monitor container-level metrics and diagnose any potential bottlenecks or issues.

Through the combination of Grafana, Prometheus, and cAdvisor, we can establish a comprehensive monitoring solution that empowers us to make informed decisions and ensure the smooth operation of our containerized applications.

PROBLEM STATEMENT:

As we delve into the implementation of this monitoring stack, it is crucial to understand the challenges that necessitate its adoption. Let's examine some of the key difficulties I encountered when monitoring Docker containers: 

  1. Lack of Visibility: Docker containers introduce an additional layer of abstraction, making it challenging to gain comprehensive visibility into the health and performance of individual containers. This lack of visibility hinders effective monitoring and can lead to difficulties in identifying and resolving issues promptly. 
  2. Resource Bottlenecks: Without proper monitoring, it becomes challenging to identify resource bottlenecks within the Docker environment. This can result in degraded application performance, response time delays, and even container crashes. Effective monitoring is essential to detect and address these bottlenecks proactively.
  3. Reactive Troubleshooting: Relying solely on reactive troubleshooting can be time-consuming and disruptive. Reactively addressing issues can lead to performance degradation and security breaches in the Docker environment. A proactive monitoring approach is crucial for early detection and timely resolution of problems.
  4. Security and Compliance: Monitoring Docker containers goes beyond performance optimization; it is also vital for ensuring the security and compliance of your applications. Effective monitoring helps detect vulnerabilities, unauthorized access attempts, and adherence to compliance standards, safeguarding your Docker environment. 

SOLUTION:

By implementing a monitoring stack with Grafana, Prometheus, and cAdvisor, we can overcome the challenges mentioned earlier and gain comprehensive insights into our Docker containers. 


Installing Grafana:  

1. Prepare the RHEL (Linux) Operating System with the latest packages. Ensure Docker and Docker Compose are pre-installed for this setup. 

2. Create a directory for Grafana configuration: mkdir grafana

3. Navigate to the directory: cd grafana

4. Create a file named docker-compose.yml and open it for editing: nano docker-compose.yml

5. Paste the following contents into the file:
version: '3'
services:
  grafana:
    image: grafana/grafana-enterprise
    container_name: grafana
    restart: unless-stopped
    ports:
      - '3000:3000'
    volumes:
      - 'grafana_storage:/var/lib/grafana'
volumes:
  grafana_storage: {}

6. Save the file and Start the Grafana container: docker-compose up -d

7. Access Grafana in your web browser using the server's IP address or domain name and port 3000 (e.g., http://your-server-ip:3000).






8. Create a new dashboard and set up the desired metrics and alerts for your Docker containers. This requires the installation of Prometheus and cAdvisor. 


Installing Prometheus:  

1. Create a directory for Prometheus configuration: mkdir prometheus

2. Navigate to the directory: cd prometheus

3. Create a file named docker-compose.yml and open it for editing: nano docker-compose.yml. Paste the following contents into that file:
version: '3'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./data:/prometheus

4. Create another file named prometheus.yml and open it for editing: nano prometheus.yml. Paste the following contents into that file:
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

5. Once we have saved both the above YAML files, we will create a Prometheus service file for RHEL (Red Hat Enterprise Linux) operating system. The below contents should be pasted in the service file and saved in /etc/systemd/system/prometheus.service location. 
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/data
ExecReload=/bin/kill -HUP $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target

6. Once we have these files in place, we will start the Prometheus container: docker-compose up -d, and we will execute the below commands for the changes to take effect. 

sudo systemctl daemon-reload          # Reload systemd after modifying the service file
sudo systemctl start prometheus       # Start Prometheus service
sudo systemctl enable prometheus      # Enable Prometheus to start on boot
sudo systemctl status prometheus      # Check the status of Prometheus service

7. The status command will give the active indicator in green. 






8. Verify that Prometheus is running by accessing the Prometheus UI. Open a web browser and visit http://<your_server_ip>:9090. We should see the Prometheus UI, indicating that Prometheus is up and running.


Installing cAdvisor: 

1. Use the following docker command to install and configure cAdvisor:
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--device=/dev/kmsg \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

Running the above command will launch cAdvisor as a Docker container in a detached mode with port as 8080. 

2. Verify that cAdvisor is running by accessing the cAdvisor UI. Open a web browser and visit http://<your_server_ip>:8080. We should see the cAdvisor UI, indicating that cAdvisor is up and running.


Integrating Grafana, Prometheus and cAdvisor to make them work as an effective Monitoring Stack: 

1. In Grafana, add Prometheus as a data source using the URL where Prometheus is running, because of which the monitoring of Docker containers can start effectively. 

2. For adding this, Navigate to Home > Connections > Data sources > Prometheus. Once added, we will have it in the list of data sources. 

3. Then, we need to import pre-built Grafana dashboards for Docker and cAdvisor metrics from the Grafana community and create a custom dashboard based on our monitoring needs, which for me included the memory usage, CPU usage, Network I/O and container counts. Below are the default data sources that need to be imported. 

4. So, once we have the data sources sorted and cAdvisor running alongside Prometheus as configured in the above steps, we will have a custom dashboard with all the live information with a refresh interval of 5 seconds to 60 minutes, which can be customized based on requirements. 

5. Below are the dashboard details for different live information received from Docker containers, where each line color represents a different container.

Memory usage per container: 

CPU Usage per container: 

Network I/O per container: 


6. Now we have the monitoring stack setup complete, we can also configure alerts via Alert Manager with this Grafana Web UI. Alert Manager is an open-source component that handles and manages alerts generated by Prometheus. It provides advanced features for deduplicating, grouping, and routing alerts to different receivers, such as email, PagerDuty, or other custom integrations. 

CONCLUSION:

In conclusion, implementing a monitoring stack consisting of Grafana, Prometheus, and cAdvisor for Docker containers is crucial for ensuring the stability and performance of our applications. This powerful combination allows us to gain comprehensive visibility into resource utilization, track performance metrics, and set up proactive alerts for potential issues. Hope this helps!

If you have any questions you can reach out our SharePoint Consulting team here.