Demo 1
What we are going to build
- We are building a prometheus installation demo.
 - We'll be using a node-exporter, which is a a Prometheus exporter specifically designed to collect and expose system-level metrics from Unix-like operating systems.
( a Prometheus exporter is a specialized software component that collects metrics from a system, application, or service and converts them into the Prometheus metrics format, making them available for scraping by a Prometheus server. ) - We'll:
- run an ec2 instance in AWS (for a node exporter)
 - install node-exporter on it
 - run Prometheus using Docker on our personal computer
 
 
Run an EC2 instance
- Run an ec2 instance globally accessible from the Internet: (so place in a public subnet)
 - Configure a security group for it:
- allow inbound SSH (port 22)
 - allow inbount connection from Prometheus (tcp port 9100)
 - allow all traffic outbound
 
 - Off course, use a key-pair that'll allow you to connect to it
 
Install node_exporter
- The following will:
- download, extract and copy node_exporter to /usr/local/bin
 - Create a user for it
 - Create, run and enable a service that will run node_exporter
 
 - You can include this script in the user data part of an EC2 instance
 
 1wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
 2tar xvfz node_exporter-1.5.0.linux-amd64.tar.gz
 3cd node_exporter-1.5.0.linux-amd64
 4sudo cp node_exporter /usr/local/bin/
 5
 6# Create systemd service for node_exporter
 7sudo bash -c 'cat > /etc/systemd/system/node_exporter.service << EOF
 8[Unit]
 9Description=Node Exporter
10Wants=network-online.target
11After=network-online.target
12
13[Service]
14User=node_exporter
15Group=node_exporter
16Type=simple
17ExecStart=/usr/local/bin/node_exporter
18
19[Install]
20WantedBy=multi-user.target
21EOF'
22
23# Create user, set permissions and start service
24sudo useradd -rs /bin/false node_exporter
25sudo systemctl daemon-reload
26sudo systemctl start node_exporter
27sudo systemctl enable node_exporter
Running Prometheus on my virtual machine
- I am running a local ubuntu on VmWare Workstation
 - Cretae an empty working directory somewhere, and cd into it:
 
1osboxes@osboxes:~$ mkdir prometheus
2osboxes@osboxes:~$ cd prometheus/
- Create a basic prometheus.yml configuration file. Here's what I was using (so the IP address is my node-exporter running in aws):
 
 1global:
 2  scrape_interval: 15s
 3scrape_configs:
 4  - job_name: 'prometheus'
 5    static_configs:
 6      - targets: ['localhost:9090']  # Prometheus itself
 7    
 8  - job_name: 'node_exporter'
 9    static_configs:
10      - targets: ['52.207.251.32:9100']  # Node exporter on EC2
11        labels:
12          instance: 'ec2-node'
- Run prometheus in a container, using the conf file:
 
1docker run -d --name prometheus \
2  -p 9090:9090 \
3  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
4  prom/prometheus
- Browse to localhost:9090 to get into Prometheus
 
Try prometheus
CPU Usage
- Use this query:
 
1100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
Explanation:
- node_cpu_seconds_total{mode="idle"}
This metric tracks the total CPU time spent in idle mode for each CPU core. - irate(node_cpu_seconds_total{mode="idle"}[1m])
The irate() function calculates the per-second rate of increase of this metric over the last minute. This gives you the fraction of time each CPU core spent idle during the last minute (a value between 0 and 1).
Really this is the cpu usage (but per core and in fraction - not percent) - avg by(instance) (...)
This averages the idle rates across all CPU cores for each instance, giving you the average idle rate per instance. - (...) * 100
This converts the idle rate from a fraction to a percentage. - 100 - (...)
Finally, this subtracts the idle percentage from 100 to get the CPU usage percentage. If your CPU is 30% idle, then it's 70% used. 
Memory Usage
- Use this query:
 
1100 * (1 - ((node_memory_MemAvailable_bytes) / (node_memory_MemTotal_bytes)))
Disk Usage
- Use this query:
 
1100 - ((node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100)