Ubuntu server에 grafana를 설치하고, cpu util이 90%를 넘으면 discord webhook으로 noti를 보내는 실습(과제)이다.
Ubuntu 설치
# 필수 패키지
sudo apt-get update
sudo apt-get install -y ca-certificates curl
# Docker 공식 GPG 키 등록
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 저장소 추가
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 부팅 시 자동 시작
sudo systemctl enable --now docker
# sudo 없이 docker 명령을 쓰기 위해 현재 유저를 docker 그룹에 추가
sudo usermod -aG docker $USER스택 올리기
폴더를 만든다.
mkdir -p monitoring/prometheus monitoring/grafana/provisioning/datasources
cd monitoringdocker-compose.yml
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
ports:
- "9090:9090"
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
pid: host
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- "9100:9100"
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
volumes:
- grafana-data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning:ro
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=changeme # 꼭 바꿀 것
volumes:
prometheus-data:
grafana-data:prometheus/prometheus.yml
Prometheus가 무엇을 수집할지 정의하는 파일이다.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100'] # 같은 Compose 네트워크라 서비스명으로 접근올리기 & 확인
docker compose up -d
docker compose ps
docker compose logs -f grafana이제 grafana 올리기는 끝났다.
외부에서는 grafana만 접속하면 되므로, 3000포트만 외부에 개방해주면 된다.
Grafana 세팅
등록한 도메인으로 접속하면, 아래와 같이 grafana login화면이 나온다.

default 계정은 admin/changeme 이다.
이제 grafana에 데이터소스(prom)을 연결해줘야 한다.
Connections -> Data sources -> Add -> Prometheus -> Add new data source
URL칸에 http://prometheus:9090 을 입력한다. (같은 네트워크라 컨테이너 이름으로 접근됨)
Save&test 를 클릭했을때, Success가 뜨면 성공이다람쥐.




메트릭을 정말 잘 긁어오는지 확인해보기 위해 대시보드를 하나 추가해보자.
Dashboards -> New -> Import
ID: 1860 대시보드를 import 해오면, 메트릭이 잘 긁혀오는것을 볼 수 있다.


그럼 이제 웹훅연동을 해보자.
Alerting -> New alert rule
Name은 원하는걸 입력하고, query를 code모드로 바꾼다음에, PromQL을 입력한다.
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)그리고 하단에 Alert condition: IS ABOVE를 90으로 설정한다. (cpu util이 90이상일경우 발동)


이제 contact point를 만들어야한다.
하단에 Contact point 드롭다운 오른쪽의 View or create contact points 링크를 클릭한다.
Add contact point에 들어와서 이름은 알아서 입력하고, Integration 목록에서 Discord를 선택한다.



webhook URL은 discord에서 채널 설정 -> 연동 -> 웹후크 -> 새 웹후크 -> 웹후크 URL 복사
복사된 URL을 grafana의 webhook URL에 붙여넣는다.
Test를 누르면 해당 채널에 테스트 메시지가 온다.
Save contact point -> 아까 alert rules로 돌아와서 생성한 Contact point 선택 -> Save




그러면 지정한 interval마다 cpu util값을 검사하고, 조건 충족시 discord로 노티가 온다.
테스트하기위해 아래 명령어로 cpu를 갈구면, noti가 오는것을 볼 수 있다.
for i in $(seq $(nproc)); do yes > /dev/null & done