agentless metric 수집의 일환으로 프로메테우스와 libvirt exporter를 사용했다.
KVM 가상화를 통해 만들어진 VM들에 대한 정보들이 모두 호스트 서버에 있을 것으로 예상이 되고
해당 정보를 exporter를 통해 수집하고 프로메테우스가 pull하여 저장하게 할 것이다.
사실 libvirt라는게 있는 줄도 몰랐다. libvirt는 플랫폼 가상화를 위한 오픈 소스 API 데몬이자 관리도구라고 한다. libvirt를 사용하면서 만나는 용어들을 간단하게 소개하면
따라서 우리는 각 VM들의 metric을 수집하기 때문에 domain의 정보를 불러오면 된다.
libvirt를 다룰 때는 virsh
라는 명령어를 주로 사용한다.
이렇게 다양한 명령어가 있고 위 사진에서는 도메인에 관한 명령어들이 나와있다.
exporter는 모니터링 대상의 metric을 수집하고 프로메테우스가 pull해갈 수 있도록 해주는 역할을 한다. libvirt-exporter는 github에 많은 프로젝트들이 있지만 그 중에서 이 프로젝트를 선택했다. 이유는 더 많은 스타를 받은 프로젝트에 비해 컨트리뷰터도 많았고 어떤 레포를 포크해왔는지 기록도 남아있었기 때문이다. (기능 자체는 크게 차이 없는 것 같아 보인다)
exporter는 go로 이루어져 있고 커스텀을 하기 위해서는 go를 알아야 할 것 같다. 이 exporter는 크게 block_stat
, cpu
, memory
, interface
(network)의 metric을 수집한다.
이 metric들을 보면서 운영체제 공부가 도움이 많이 됐던 것 같다.
먼저 libvirt-exporter를 하이퍼바이저가 있는 노드들에 설치했다. 내 경우에는 각 노드들에 모두 go가 설치된게 아니었기 떄문에 로컬에서 go로 빌드한 후 실행 파일만 각 노드로 scp를 사용해 전송했다. 그리고 service파일로 exporter를 등록했다.
# libvirt-exporter service
[Unit]
Description=Node Exporter
[Service]
User=root
ExecStart=/root/libvirt-exporter/libvirt-exporter
[Install]
WantedBy=multi-user.target
그 후 프로메테우스에 exporter를 등록해주면 설정은 완료된다.
# prometheus.yml에 추가
...
scrape_configs:
- job_name: "libvirt-exporter"
static_configs:
- targets: ['<host1 ip>:9177', '<host ip2>:9177', '<host3 ip>:9177']
이렇게 프로메테우스에서 작동하는 것을 확인할 수 있다.
libvirt-exporter는 여러 virsh
명령어에서 나오는 결과들을 수집하는데 대표적으로 위와 같이 virsh domstats <domain>
이 있다. 그리고 대부분의 metric은 자동완성 시에 간단하게 설명이 있어서 어떤 metric인지 파악할 수 있다.
각 VM의 metric 중 수집하지 못하는 것이 있다. filesystem에 관한 것이었는데, 그 중에서도 현재 VM이 사용하는 disk 사용 용량을 수집할 수 없었다. 이를 위해서는 libguestfs
라는 라이브러리를 설치하면 virt df
같은 명령어로 터미널 상에서는 확인할 수 있었는데, 일단 현재 개발된 exporter에서는 수집하지 못한다. 그리고 libguestfs
의 크기가 150Mb정도로 꽤 큰편이다.
libvirt가 제공하는 filesystem에 대한 metric은 block에 관한 것들인데, libvirt_domain_block_stats_capacity_bytes
, libvirt_domain_block_stats_allocation
이렇게 이름만 보면 원하는 metric일 것 같았지만 capacity_bytes
의 경우 해당 VM에 할당된 전체 disk 크기를 가리키며 allocation
의 경우 할당된 전체 disk 중 파티션으로 할당된 영역의 크기를 말한다. 실제 사용 가능한 공간과 유사하게 볼 수 있었지만 내가 원하던 현재 사용중인 disk 크기, 즉 df
명령어로 볼 수 있느 결과는 얻을 수 없었다.