prometheus libvirt exporter

스르륵·2022년 7월 14일
0

Metric Monitoring

목록 보기
1/1
post-custom-banner

agentless metric 수집의 일환으로 프로메테우스와 libvirt exporter를 사용했다.
KVM 가상화를 통해 만들어진 VM들에 대한 정보들이 모두 호스트 서버에 있을 것으로 예상이 되고
해당 정보를 exporter를 통해 수집하고 프로메테우스가 pull하여 저장하게 할 것이다.

구성 환경

  • Openstack 가상머신과 하이퍼바이저
  • prometheus 2.35.0
  • libvirt exporter (gihub Link)
    libvirt exporter는 공식 exporter는 아니다.

Libvirt?

사실 libvirt라는게 있는 줄도 몰랐다. libvirt는 플랫폼 가상화를 위한 오픈 소스 API 데몬이자 관리도구라고 한다. libvirt를 사용하면서 만나는 용어들을 간단하게 소개하면

  • node : 하나의 물리 장비
  • hypervisor : 노드에 있는 가상화 계층. 여러개의 VM을 실행할 수 있음
  • domain : 하이퍼바이저가 제공하는 VM을 실행한 인스턴스

따라서 우리는 각 VM들의 metric을 수집하기 때문에 domain의 정보를 불러오면 된다.
libvirt를 다룰 때는 virsh라는 명령어를 주로 사용한다.
help
이렇게 다양한 명령어가 있고 위 사진에서는 도메인에 관한 명령어들이 나와있다.

libvirt-exporter

exporter는 모니터링 대상의 metric을 수집하고 프로메테우스가 pull해갈 수 있도록 해주는 역할을 한다. libvirt-exporter는 github에 많은 프로젝트들이 있지만 그 중에서 이 프로젝트를 선택했다. 이유는 더 많은 스타를 받은 프로젝트에 비해 컨트리뷰터도 많았고 어떤 레포를 포크해왔는지 기록도 남아있었기 때문이다. (기능 자체는 크게 차이 없는 것 같아 보인다)
exporter는 go로 이루어져 있고 커스텀을 하기 위해서는 go를 알아야 할 것 같다. 이 exporter는 크게 block_stat, cpu, memory, interface(network)의 metric을 수집한다.
이 metric들을 보면서 운영체제 공부가 도움이 많이 됐던 것 같다.

prometheus 설정

먼저 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인지 파악할 수 있다.

수집하지 못한 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 명령어로 볼 수 있느 결과는 얻을 수 없었다.

profile
기록하는 블로그
post-custom-banner

0개의 댓글