이전까지 과정을 통해 docker swram
환경에서 prometheus
, grafana
, node-exporter
, cadvisor
를 띄웠다.
이 글에서는 prometheus의 상세한 설정과, 데이터 수집 확인 및 grafana에서 시각화에 대한 방법을 다룬다.
앞선 docker-compose.yml
파일을 보면 prometheus 설정에 prometheus.yml
을 마운트 하는것을 확인할 수 있다.
prometheus.yml
은 프로메테우스에서 수집할 데이터들을 설정하는 파일로써 어떤 데이터를 어떤 주기로 수집하는지에 대한 설정이 들어있다.
아래는 내가 작성한 prometheus.yml
파일이다.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node-exporter'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: nodes
relabel_configs:
- source_labels: [__meta_dockerswarm_node_address]
target_label: __address__
replacement: $1:9100
- job_name: 'node-exporter-host'
static_configs:
- targets: ['192.168.123.1:9100']
- job_name: 'mysql-exporter'
static_configs:
- targets: ['db_mysql-master:9104']
- job_name: 'dockerswarm'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
relabel_configs:
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: (.+)
action: keep
target_label: job
- source_labels: [__address__]
regex: .*:0
action: drop
- job_name: 'jshop'
scrape_interval: 2s
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
relabel_configs:
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
- source_labels: [__meta_dockerswarm_service_label_jshop]
regex: (.+)
action: keep
target_label: was
- source_labels: [__meta_dockerswarm_network_name]
regex: jshop
action: keep
- target_label: __metrics_path__
replacement: /actuator/prometheus
- source_labels: [__address__]
target_label: __address__
regex: "(.+):([0-9]+)"
replacement: "$1:8080"
하나씩 자세히 알아보자.
prom/node-exporter
컨테이너 제공하는 데이터를 수집하는 job으로 각 노드의 cpu, memory, network, io 등을 수집한다.
- job_name: 'node-exporter'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: nodes
relabel_configs:
- source_labels: [__meta_dockerswarm_node_address]
target_label: __address__
replacement: $1:9100
여기에는 docker swarm의 서비스 디스커버리가 사용되었다.
만약 서비스 디스커버리를 사용하지 않는다면 앞에서 설명했듯, 노드를 추가할때마다 설정 파일에서 노드를 추가해 줘야 한다는 치명적인 단점이 있다.
이러한 문제를 해결하기 위해 추상화된 서비스 디스커버리를 사용해 실제 어떤 노드가 있는지는 알필요 없이 데이터 수집을 설정할 수 있다.
__meta_dockerswarm_node_address
를 사용하게 되면 swarm 에 참여한 노드들의 ip 를 알 수 있다.
그리고, node-exporter
는 모든 노드의 9100 포트에서 데이터를 제공하고 있다.
이 두 정보를 조합해 리라밸링을 통해 job이 데이터를 긁어올 타겟을 설정해준다.
실제 설정된 정보는 prometheus 웹 콘솔에서 확인하면 다음과 같다.
각 노드들 의 ${ip}:9100/metrics
로 데이터를 수집하도록 설정되어있고 안정적이게 잘 수집하는것을 볼 수 있다.
vm을 띄우고 있는 호스트의 모니터링을 위한 job이다.
vm의 네트워크를 --network network=default
로 설정했기 때문에 vm에서 호스트 네트워크에 접근할 수 있다.
그리고 구조에서 보다싶이 vm 의 네트워크 대역은 192.168.123.0/24
를 사용하고 있고, 호스트의 가상 인터페이스 주소는 192.168.123.1
이다.
그리고 컨테이너 내부에서 192.168.123.1
로 요청을 보내면, 컨테이너 인터페이스
-> vm 인터페이스
-> 호스트 인터페이스
를 거쳐 찾아가게 된다.
즉 vm과 docker 네트워크가 모두 브릿지로 구성되어 있기 때문에 이러한 동작이 가능한것이다.
mysql-exporter
를 사용하여 mysql 모니터링을 위한 job이다.
서비스 이름을 사용한 dns를 제공하기 떄문에 서비스 이름으로 타겟을 지정했다.
google/cadvisor
컨테이너에서 제공하는 데이터를 수집하는 job으로 각 컨테이너의 cpu, memory 등을 수집한다.
- job_name: 'dockerswarm'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
relabel_configs:
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: (.+)
action: keep
target_label: job
- source_labels: [__address__]
regex: .*:0
action: drop
하나씩 자세히 알아보면, 이역시 서비스 디스커버리를 사용해 데이터를 수집한다.
cadvisor
컨테이너는 한번 뜨게 되면 영구적인 컨테이너가 아니다. 어떠한 문제로든 재시작을 할 수 있고 이럴때마다 내부 overlay 네트워크 ip 가 변경되게 된다.
그때마다 ip를 설정에서 바꿔줄 수 없으니 서비스 디스커버리 추상화를 통해 접근하는것이 편리하다.
서비스의 라벨을 통해 디스커버리를 하기 때문에 포트와 상관없이 엔드포인트를 잡을 수 있다.
여기까지 확인되었다면, prometheus 설정은 끝이다.
spring actuator 의 메트릭 수집을 위한 job이다. 이또한 수평확장을 염두해 두고 있기 때문에 추상화를 통한 접근을했다.
spring actuator설정은 다음 글에서 다룬다.
grafana 에 prometheus 데이터 소스를 추가한다.
grafana -> connections -> data sources
에서 추가할 수 있다.
URL로 추가할때 prometheus의 서비스 이름으로 dns를 할 수 있다.
현재 docker swarm stack 을 통해 띄웠기 때문에 prometheus
의 서비스 이름은 monitoring_prometheus
다. 그렇기 때문에 이 이름을 사용해서 dns를 할 수 있다.
만약 다른 데이터 소스를 추가하더라도 서비스 이름으로 dns를 할 수 있기 때문에 편리하다.
URL을 설정하고 save & test
를 눌러 다음과 같은 화면이 나오게 되면 연결에 성공한것이다.
이제 데이터 소스를 통해 대시보드를 생성해야 하는데, 이 글은 grafana 패널이나 PromQL에 대한 글이 아니기 때문에 이것에 대한 설명은 하지 않는다.
간단하게 다른 사람의 대시보드를 import 하는 방법에 대해 설명한다.
그라파나는 대시보드 정보를 json으로 가지고 있고, 이걸 직접 넣거나 허브에 올라와 있는 다른 사람의 대시보드를 import 할 수 있다.
cadvisor 관련된 대시보드 또한 존재하며 이걸 추가하는 방법에 대해 간단하게만 짚고 넘어간다.
dashboard -> import
로 들어가면 id 를 통해 import 를 할 수 있다.
여기다 11939
를 넣어 load 하게 되면 대시보드를 import 할 수 있다.
import 한 대시보드에서 사용할 데이터 소스, 이름들을 설정하고 import 하게 되면 간단한 대시보드를 확인할 수 있다.
아래 사진은 기본 대시보드를 베이스로 내가 필요한 정보들을 넣어 만든 대시보드다.
다만 모든 대시보드에서 사용하는 데이터가 버전마다 다르고, 환경마다 따르기 때문에 확인할 수 없는 패널도 있다.
한마디로 이렇게 대시보드를 사용할 수 있다는 참고정도다.