• Linux 시스템의 디스크 I/O 사용량과 파일 시스템 및 inode 사용량을 모니터링
  • Prometheus를 사용하여 Disk I/O를 확인 가능
  • Prometheus는 메트릭 수집 시스템이며, node_exporter는 다양한 시스템 메트릭을 노출
  • 디스크 I/O에 대한 개별 메트릭을 분석 → 디스크 성능, 디스크 사용량 및 애플리케이션에서 발생하는 I/O 대기 시간에 대한 중요한 정보를 제공

디스크 I/O

  • Linux 시스템에서 디스크 I/O 메트릭은 파일 시스템에서 몇 개의 파일을 읽음으로써 모니터링 가능
  • 디스크 또는 프로세스가 파일인 경우 지정된 시점에 연결된 메트릭을 저장하는 파일이 있음

Node exporter의 원시 디스크 통계

  • Linux 시스템에서 node_exporter는 디스크 메트릭을 /proc/diskstats 파일에서 얻어옮
  • /proc/diskstat 파일의 형식 → https://www.kernel.org/doc/Documentation/iostats.txt
  • 각 prometheus 메트릭은 NewDiskstatsCollector의 소스 코드에서 볼 수 있듯이 해당 파일의 필드 중 하나에 직접 대응함
  • prometheus 메트릭 값을 커널 소스 데이터와 일치시키는 것이 중요 → node_exporter는 몇 가지 크기 조정 요소를 제외하고 커널에서 반환된 원시 데이터를 추출함
  • 커널이 여러 섹터를 반환하는 경우 node_exporter는 섹터 크기를 곱하여 바이트 수가 됨
  • 커널이 시간을 밀리초 단위로 보고하는 경우 node_exporter는 0.001을 곱하여 초를 만듦

Node exporter의 I/O 메트릭 값

1. node_disk_reads_completed_total

  • field 1
  • 성공적으로 완료된 총 읽기 수

2. node_disk_reads_merged_total

  • field 2
  • 서로 인접한 읽기를 효율성의 위해 병합하는 횟수를 표시

3. node_disk_writes_merged_total

  • field 6
  • 서로 인접한 쓰기를 효율성의 위해 병합하는 횟수를 표시

4. node_disk_discards_merged_total

  • field 13
  • 서로 인접한 읽기 및 쓰기는 효율성을 위해 병합될 수 있음
  • 두 개의 4K 읽기는 궁극적으로 디스크에 전달되기 전에 하나의 8K 읽기가 될 수 있으므로 하나의 I/O로만 계산(및 대기열에 추가)
  • node_disk_discards_merged_total 필드를 통해 읽기 및 쓰기 병합 작업이 얼마나 자주 수행되었는지 알 수 있음

5. node_disk_read_bytes_total

  • field 3
  • 성공적으로 읽은 총 바이트 수

6. node_disk_read_time_seconds_total

  • field 4
  • 모든 읽기에 소요된 총 시간(초) → __make_request()에서 end_that_request_last()까지 측정

7. node_disk_writes_completed_total

  • field 5
  • 성공적으로 완료된 총 쓰기 수

8. node_disk_written_bytes_total

  • field 7
  • 성공적으로 쓰기가 완료된 총 바이트 수

9. node_disk_write_time_seconds_total

  • field 8
  • 모든 쓰기에 소요된 총 시간(초) → __make_request()에서 end_that_request_last()까지 측정

10. node_disk_io_now

  • field 9
  • 0으로 가야 하는 유일한 필드
  • 요청이 request_queue 구조체에 제공되면 증가하고 완료되면 감소

11. node_disk_io_time_seconds_total

  • field 10
  • I/O를 수행하는 데 소요된 시간(초)
  • node_disk_io_time_seconds_total 필드는 node_disk_io_now가 0이 아닌 한 증가

12. node_disk_io_time_weighted_seconds_total

  • field 11
  • I/O를 수행하는 데 소요된 가중치(초)
  • I/O를 수행하는 데 소요된 시간(초)에 동시 I/O 요청 수를 곱한 값을 계산
  • I/O 완료 시간과 누적될 수 있는 백로그(backlog)를 쉽게 측정 가능

13. node_disk_discards_completed_total

  • field 12
  • 성공적으로 완료된 총 폐기(discard) 수

14. node_disk_discarded_sectors_total

  • field 14
  • 성공적으로 폐기(discard)된 총 섹터 수

15. node_disk_discard_time_seconds_total

  • field 15
  • 모든 폐기(discard)에 소요된 총 시간(초) → __make_request()에서 end_that_request_last()까지 측정

16. node_disk_flush_requests_total

  • field 16
  • 성공적으로 완료된 총 플러시(flush) 요청 수

17. node_disk_flush_requests_time_seconds_total

  • field 17
  • 모든 플러시(flush) 요청에 소요된 총 시간(초)
  • PromQL을 이용해서 Alert Rule을 작성하면, 알람을 만들 수 있음
  • Prometheus에서 만들 알람에 대한 정보를 저장할 파일을 rule file이라고 함
  • rule file은 prometheus.yml과 같은 위치에 rules 디렉토리를 만들고 규칙을 작성할 Job과 같은 이름으로 작성
  • 알람이 많아질수록 모니터링 요소가 많아져 Prometheus에 부하가 발생 → 카디널리티를 줄이고 시계열을 쿼리하는 비용을 최적화하기 위해서 Recording Rule이라는 것을 이용

hardware_rule.yml 파일에 중요한 요소 → Prometheus 알람을 설정하는 코드

  1. record → Recording Rule으로 해당 값으로 설정한 이름으로 쿼리할 때 사용
  2. alert → 알람 발생 이름
  3. expr → Prometheus는 expr에 해당하는 쿼리를 계속 감시, PromQL을 하나의 시계열로 생성
  4. labels → 발생한 알람의 labeling
  5. for → 지정한 시간 동안 조건을 충족하게 되면 알림을 발생

1. DELL 서버 hardware 알람 rule의 yaml 파일 내용

$ mkdir -p /etc/prometheus/rules/

$ vi /etc/prometheus/rules/hardware_rule.yml
groups:
- name: hardware
  rules:
  - record: job:chassis
    expr: dell_hw_scrape_collector_success{collector="chassis"}

  - record: job:hardware_log
    expr: dell_hw_chassis_status{component="Hardware_Log"}

  - record: job:intrusion
    expr: dell_hw_chassis_status{component="Intrusion"}

  - record: job:chassis_batteries
    expr: dell_hw_scrape_collector_success{collector="chassis_batteries"}

  - record: job:batteries_status
    expr: dell_hw_chassis_status{component="Batteries"}

  - record: job:power_managemet
    expr: dell_hw_chassis_status{component="Power_Management"}

  - record: job:power_supplies
    expr: dell_hw_chassis_status{component="Power_Supplies"}

  - record: job:fans
    expr: dell_hw_scrape_collector_success{collector="fans"}

  - record: job:firmwares
    expr: dell_hw_scrape_collector_success{collector="firmwares"}

  - record: job:memory
    expr: dell_hw_scrape_collector_success{collector="memory"}

  - record: job:memory_status
    expr : dell_hw_chassis_memory_status{memory=~"DIMM_.*"}

  - record: job:nics
    expr: dell_hw_scrape_collector_success{collector="nics"}

  - record: job:processors
    expr: dell_hw_scrape_collector_success{collector="processors"}

  - record: job:cpu_status
    expr: dell_hw_chassis_processor_status{processor=~"CPU.*"}

  - record: job:ps
    expr: dell_hw_scrape_collector_success{collector="ps"}

  - record: job:ps_amps_sysboard_pwr
    expr: dell_hw_scrape_collector_success{collector="ps_amps_sysboard_pwr"}

  - record: job:storage_battery
    expr: dell_hw_scrape_collector_success{collector="storage_battery"}

  - record: job:storage_controller
    expr: dell_hw_scrape_collector_success{collector="storage_controller"}

  - record: job:storage_enclosure
    expr: dell_hw_scrape_collector_success{collector="storage_enclosure"}

  - record: job:storage_pdisk
    expr: dell_hw_scrape_collector_success{collector="storage_pdisk"}

  - record: job:storage_vdisk
    expr: dell_hw_scrape_collector_success{collector="storage_vdisk"}

  - record: job:system
    expr: dell_hw_scrape_collector_success{collector="system"}

  - record: job:temps
    expr: dell_hw_scrape_collector_success{collector="temps"}

  - record: job:temperatures
    expr: dell_hw_chassis_status{component="Temperatures"}

  - record: job:volts
    expr: dell_hw_scrape_collector_success{collector="volts"}

  - record: job:voltages
    expr: dell_hw_chassis_status{component="Voltages"}

  - alert: HardwareErrorandWarning
    expr: |
      ( job:chassis ) < 1 or
      ( job:hardware_log ) >= 1 or
      ( job:intrusion ) >= 1 or
      ( job:chassis_batteries ) < 1 or
      ( job:batteries_status ) >= 1 or
      ( job:power_managemet ) >= 1 or
      ( job:power_supplies ) >= 1 or
      ( job:fans ) < 1 or
      ( job:firmwares ) < 1 or
      ( job:memory ) < 1 or
      ( job:memory_status ) >= 1 or
      ( job:nics ) < 1 or
      ( job:processors ) < 1 or
      ( job:cpu_status ) >= 1 or
      ( job:ps ) < 1 or
      ( job:ps_amps_sysboard_pwr ) < 1 or
      ( job:storage_battery ) < 1 or
      ( job:storage_controller ) < 1 or
      ( job:storage_enclosure ) < 1 or
      ( job:storage_pdisk ) < 1 or
      ( job:storage_vdisk ) < 1 or
      ( job:system ) < 1 or
      ( job:temps ) < 1 or
      ( job:temperatures ) >= 1 or
      ( job:voltages ) >= 1 or
      ( job:volts ) < 1
    for: 30m
    labels:
      hardware_status: 'critical'
    annotations:
      summary: "{{ $labels.instance }}'s {{ $labels.collector }}  Hardware Error"

2. 디스크 관련 알람 rule의 yaml 파일 내용

cat /etc/prometheus/rules/disk_rule.yml
groups:
- name: disk-alarm
  rules:
  - record: job:pdisk
    expr: dell_hw_storage_pdisk_status{disk=~".*"}
  - record: job:vdisk
    expr: dell_hw_storage_vdisk_status{vdisk=~".*"}

  - alert: DiskErrorandWarning
    expr: |
      ( job:pdisk ) >= 1 or
      ( job:vdisk ) >= 1
    for: 30m
    labels:
      physical_disk_status: 'critical'
    annotations:
      summary: "{{ $labels.instance }}'s Disk Error"



Prometheus에서 알람을 정의

  • Prometheus 설정 파일인 promethes.yml에 알람 yml 파일 추가

    $ vi /etc/prometheus/prometheus.yml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
      external_labels:
        cluster: prometheus
        replica: 0
    
    rule_files:
      - '/etc/prometheus/rules/hardware_rule.yml'
      - '/etc/prometheus/rules/disk_rule.yml'
    
    scrape_configs:
      - job_name: 'node-exporter'
        scrape_interval: 5s
        static_configs:
          - targets:
            - [node-exporter 서버 IP]:9100
    
      - job_name: 'dellhw_exporter'
        scrape_interval: 60s
        static_configs:
          - targets:
            - [dellhw_exporter 서버 IP]:9137

  • 일정 시간 Pending 상태로 유지 → 계속 fault가 발생하면 State에 Firing 표시

  • 알람에 문제가 발생하여 State에 Firing 표시


Alertmanager 설치

1. Alertmanager 다운로드

# Alertmanager 다운로드
$ cd /root
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
$ tar xvzf alertmanager-0.24.0.linux-amd64.tar.gz
alertmanager-0.24.0.linux-amd64/
alertmanager-0.24.0.linux-amd64/alertmanager.yml
alertmanager-0.24.0.linux-amd64/LICENSE
alertmanager-0.24.0.linux-amd64/NOTICE
alertmanager-0.24.0.linux-amd64/alertmanager
alertmanager-0.24.0.linux-amd64/amtool

$ mkdir /etc/alertmanager
$ cp /root/alertmanager-0.24.0.linux-amd64/* /etc/alertmanager/
$ rm -rf /root/alertmanager-0.24.0.linux-amd64

2. systemd로 Alertmanager 서비스 관리

# Alertmanager 서비스를 systemd로 관리
$ cat << EOF | tee /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=Alert Manager
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/etc/alertmanager/alertmanager --config.file=/etc/alertmanager/alertmanager.yml

[Install]
WantedBy=multi-user.target
EOF

# Alertmanager 서비스 실행  
$ /bin/systemctl daemon-reload
$ /bin/systemctl restart alertmanager.service
$ /bin/systemctl status alertmanager.service
Loaded: loaded (/usr/lib/systemd/system/alertmanager.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-04-04 12:38:19 KST; 5s ago
 Main PID: 55991 (alertmanager)
    Tasks: 24
   Memory: 28.0M
   CGroup: /system.slice/alertmanager.service
           └─55991 /etc/alertmanager/alertmanager --config.file=/etc/alertmanager/alertmanager.yml

Alertmanger의 설정 파일인 alertmanager.yml 생성

  • Slack App의 웹훅 URL을 설정

    $ vi /etc/alertmanager/alertmanager.yml
    global:
      resolve_timeout: 5m
      slack_api_url: "https://hooks.slack.com/services/???????????????????????????"    # slack 웹훅 URL 필요
    
    route:
      receiver: 'slack-notifications'
      repeat_interval: 2m
    receivers:
      - name: 'slack-notifications'
        slack_configs:
        - channel: '[#slack channel 이름]'
          username: "Prometheus"
          send_resolved: true
          title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
          text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"
    
    # alertmanager 재실행 및 상태 확인
    $ systemctl restart alertmanager
    $ systemctl status alertmanager
    ● alertmanager.service - Alert Manager
       Loaded: loaded (/usr/lib/systemd/system/alertmanager.service; disabled; vendor preset: disabled)
       Active: active (running) since Tue 2022-04-05 01:56:21 KST; 4s ago
     Main PID: 108698 (alertmanager)
       Tasks: 24
     Memory: 26.6M
     CGroup: /system.slice/alertmanager.service
              └─108698 /etc/alertmanager/alertmanager --config.file=/etc/alertmanager/alertmanager.yml

Alertmanger의 설정을 prometheus.yml 파일에 추가

$ vi /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: prometheus
    replica: 0

rule_files:
  - '/etc/prometheus/rules/hardware_rule.yml'

alerting:
  alertmanagers:
  - scheme: http
    static_configs:
    - targets:
      - "[alertmanager가 설치된 서버 IP]:9093"   # <alertmanager ip:port>

scrape_configs:
  - job_name: 'node-exporter'
    scrape_interval: 5s
    static_configs:
      - targets:
        - [node-exporter 서버 IP]:9100

  - job_name: 'dellhw_exporter'
    scrape_interval: 60s
    static_configs:
      - targets:
        - [dellhw_exporter 서버 IP]:9137
        - [dellhw_exporter 서버 IP]:9137

Alertmanager 웹 UI

  • http://[alertmanager가 설치된 서버 IP:9093/#/alerts)에서 Prometheus에서 발생한 알람
  • 알람 관리 UI 확인

  • blackbox monitoring은 증상이 발생한 부분을 확인하며, 예측되지 않은 활성 문제를 모니터링
  • blackbox monitoring을 통해 시스템이 제대로 작동하지 않음을 확인 한 이후에 whiteblox monitoring의 계측을 통해 로그 또는 HTTP 엔드 포인트와 같은 시스템 내부를 검사하는 기능
  • blackbox monitoring은 외부에서 시스템 상태를 확인(예 : 서버가 200 개의 HTTP 코드로 응답)
  • whiteblox monitoring은 내부 메트릭과 로그를 사용하여 시스템 문제를 표면화

blackbox monitoring과 whiteblox monitoring의 차이

  • 모니터링은 어떤 방법을 체택하는지에 따라 크게 writebox monitoring과 blackbox monitoring으로 구분

1. whitebox monitoring

  • 에이전트 혹은 소프트웨어를 설치해서 모니터링
  • Zabbix, PRTG, Prometheus 등이 whitebox monitoring에 속함 → 일반적인 모니터링 기술들
  • whitebox monitoring은 접근성은 좋으나 실제 모니터링 시스템을 구축할 때 모니터링 "소스(source)"가 되는 기술에 대한 이해도가 높아야함

2. blackbox monitoring

  • 시스템 내부가 어떻게 동작하는지보다 관측 가능한 행위에 초점을 두는 모니터링
  • CPU가 어떻게 동작하는지, Memory가 어떻게 동작하는지 몰라도 됨 → CPU 사용량이 얼마인지, Memory 사용량이 얼마인지가 중요
  • TCP가 어떻게 동작하는지 알 필요 X → 실행되는 프로세스에 TCP 연결이 가능한지 여부가 중요
  • 모니터링하려고 하는 내용의 동작 원리를 알지 못하여도 문제되지 않음
  • blackbox monitoring 쪽에서 유명한 기술은 Nagios

3. Prometheus는 whitebox monitoring과 blackbox monitoring 둘다 가능

  • Prometheus는 기본적으로 whitebox monitoring에 속하지만, 프로메테우스 재단은 Prometheus로 blackbox monitoring을 지원하기 위해서, 공식적으로 blackbox-exporter를 지원
  • blackbox-exporter는 HTTP, HTTPS는 물론 TCP, ICMP, DNS 등의 프로토콜 위에서 동작하는 엔드포인트들에 대한 blackbox monitoring을 가능하게 해줌
  • Prometheus쪽에서 해당 IP:PORT 정보를 제공해야만 모니터링 가능


blackbox-exporter와 설치

1. 서버 환경에서는 blackbox-exporter 스크립트 명령어 설치 및 구동

# 현재 디렉토리 위치
$ pwd
/root

# blackbox-exporter를 설치할 디렉토리 생성
$ mkdir black

# 디렉토리 이동
$ cd black

# 최신 버전 blackbox-exporter 설치
$ wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.18.0/blackbox_exporter-0.18.0.linux-amd64.tar.gz

# 압축 파일 해제
$ tar zxvf blackbox_exporter-0.18.0.linux-amd64.tar.gz
blackbox_exporter-0.18.0.linux-amd64/
blackbox_exporter-0.18.0.linux-amd64/blackbox_exporter
blackbox_exporter-0.18.0.linux-amd64/LICENSE
blackbox_exporter-0.18.0.linux-amd64/blackbox.yml
blackbox_exporter-0.18.0.linux-amd64/NOTICE

# 압축해제된 디렉토리에 접근
$ cd blackbox_exporter-0.18.0.linux-amd64/

# blackbox-exporter 실행
$ ./blackbox_exporter

2. blackbox.yml 설정 파일을 토대로 blackbox-exporter 스크립트 실행

# <blackbox_exporter 경로> --config.file=<blackbox_exporter 설정 파일 경로>
$ ./blackbox_exporter --config.file=./blackbox.yml

3. blackbox-exporter 서비스로 실행 → blackbox-exporter 명령어를 systemd로 관리

$ pwd
/root/black/blackbox_exporter-0.18.0.linux-amd64/

# user 추가
$ useradd --no-create-home --shell /bin/false blackbox_exporter

# 생성한 blackbox_exporter 계정 확인
$ cat /etc/passwd | grep blackbox_exporter
blackbox_exporter:x:1004:1004::/home/blackbox_exporter:/bin/false

# 실행 파일 및 설정 파일 /usr/local/bin/으로 경로 이동
$ cp ./blackbox_exporter /usr/local/bin
$ cp ./blackbox.yml /usr/local/bin

# /usr/local/bin/blackbox_exporter blackbox_exporter 유저, 그룹 권한 주기
$ chown blackbox_exporter:blackbox_exporter /usr/local/bin/blackbox_exporter

# 명령어 복사 및 사용 권환 변경 확인
$ ls -al /usr/local/bin/blackbox_exporter
-rwxr-xr-x 1 blackbox_exporter blackbox_exporter 18264924 Nov 22 17:34 /usr/local/bin/blackbox_exporter

# 서비스 파일 등록
$ cat << EOF | tee /etc/systemd/system/blackbox_exporter.service
[Unit]
Description=Blackbox Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=blackbox_exporter
Group=blackbox_exporter
Type=simple
ExecStart=/usr/local/bin/blackbox_exporter --config.file=/usr/local/bin/blackbox.yml

[Install]
WantedBy=multi-user.target
EOF

# 데몬 리로드
$ systemctl daemon-reload

# 서비스 구동
$ systemctl restart blackbox_exporter

# 서비스 상태 확인
$ systemctl status blackbox_exporter
● blackbox_exporter.service - Blackbox Exporter
   Loaded: loaded (/etc/systemd/system/blackbox_exporter.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-11-22 17:35:28 KST; 4s ago
 Main PID: 6615 (blackbox_export)
    Tasks: 7
   Memory: 2.2M
   CGroup: /system.slice/blackbox_exporter.service
           └─6615 /usr/local/bin/blackbox_exporter --config.file=/usr/local/bin/blackbox.yml

4. blackbox-exporter 설정

  • blackbox-exporter가 Prometheus가 설정한 IP:PORT에서 TCP 통신이 가능한지 여부에 대한 메트릭을 수집하게 하려면 설정 파일에서 모듈 생성 필요
  • 지정한 IP:PORT에서 5초 주기로 TCP 통신을 시도
  • 다른 프로토콜도 확인 가능 : https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md
    # tcp 프토토콜 5초 간격으로 connect 확인
    $ vi /usr/local/bin/blackbox.yml
    modules:
      tcp_connect:
        prober: tcp
        timeout: 5s
  • 최초 blackbox.yaml의 기본 내용
    $ vi /usr/local/bin/blackbox.yml
    modules:
      http_2xx:
        prober: http
      http_post_2xx:
        prober: http
        http:
          method: POST
      tcp_connect:
        prober: tcp
      pop3s_banner:
        prober: tcp
        tcp:
          query_response:
          - expect: "^+OK"
          tls: true
          tls_config:
            insecure_skip_verify: false
      ssh_banner:
        prober: tcp
        tcp:
          query_response:
          - expect: "^SSH-2.0-"
      irc_banner:
        prober: tcp
        tcp:
          query_response:
          - send: "NICK prober"
          - send: "USER prober prober prober :prober"
          - expect: "PING :([^ ]+)"
            send: "PONG ${1}"
          - expect: "^:[^ ]+ 001"
      icmp:
        prober: icmp

5. blackbox-exporter 서비스로 재실행

$ systemctl restart blackbox_exporter

# 서비스 상태 확인
$ systemctl status blackbox_exporter
● blackbox_exporter.service - Blackbox Exporter
   Loaded: loaded (/etc/systemd/system/blackbox_exporter.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-11-22 17:37:32 KST; 5s ago
 Main PID: 8674 (blackbox_export)
    Tasks: 8
   Memory: 2.1M
   CGroup: /system.slice/blackbox_exporter.service
           └─8674 /usr/local/bin/blackbox_exporter --config.file=/usr/local/bin/blackbox.yml



Prometheus에서 blackbox-exporter 연동

  • Prometheus에서 blackbox-exporter가 수집하고 있는 메트릭을 스크래이핑
  • Prometheus 설정 파일을 보면 scrape_config 밑에 job이 등록
  • blackbox-exporter 추출 : http://:9115/probe?target=<static_configs.targets의IP:PORT>&module=<params.module의 모듈>
    1. static_configs.targets에 있는 "IP:PORT" 별로 데이터를 수집
    2. params.module은 blackbox-exporter 설정 파일에서 작성한 모듈 목록
    3. 현재는 TCP 연결만 확인하는 tcp_connect
  • Prometheus가 scrape_interval에 설정된 주기마다 각 인스턴스들에서 수집되는 메트릭을 스크래이핑하여 저장
    1. blackbox-exporter와 prometheus의 timeout 시간이 각각 있기에 주기는 2개 합산
    2. blackbox-exporter의 timeout인 5s + prometheus의 scrape_interval인 5s = 10s
  • metric_path가 "/probe"로 지정

  • relabel_configs는 설정 파일 형식 토대로 생성 → replacement는 "<blackbox 설치된 인스턴스 IP:9115>"

    $ vi /etc/prometheus/prometheus.yml
    # my global config
    global:
      scrape_interval:     15s # By default, scrape targets every 15 seconds.
      evaluation_interval: 15s # By default, scrape targets every 15 seconds.
    
      external_labels:
        monitor: 'kubernetes-monitoring'
    
       # prometheus에 blackbox-exporter를 추가
      - job_name: 'blackbox-exporter'
        scrape_interval: 5s
        metrics_path: /probe
        params:
          module: [tcp_connect] 
        static_configs:
          - targets:
            - [모니터링 서버 IP]:80
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - source_labels: [__param_target]
            target_label: instance
          - target_label: __address__
            replacement: [blackbox 설치된 인스턴스 IP]:9115
  • Prometheus 재구동

    # Prometheus 서비스 재시작
    $ systemctl restart prometheus
    
    # prometheus 서비스 상태 확인
    $ systemctl status prometheus

  • Prometheus UI에서 쿼리를 입력 → blackbox-exporter 설치한 서버의 값 읽음 (probe_success)
  • probe_success가 blackbox-exporter가 지정한 프로토콜 방식으로 IP:PORT와 연결이 성공했음을 알리는 지표

blackbox 서버 모니터링을 위한 Grafana 대시보드 구축

  • Grafana로 대시보드를 구축할 때 정말 좋은 점은 black-exporter같이 많이 사용하는 Exporter에 대한 대시보드가 이미 공유됨
    손쉽게 사용 가능

1. blackb-exporter 그라파다 대시보드 복사 가능한 대시보드 ID 획득

  • node-exporter 그라파나 대시보드 복사 가능하게 하는 URL : https://grafana.com/grafana/dashboards/13659
  • 위 경로에 접속하면 아래 화면이 보이는데 "Copy ID to Clipboard"를 클릭하여 복사함

2. 그라파나 대시보드로 이동한 후, 왼쪽 탭의 두 번째 "+"의 "Import" 메뉴를 클릭



3. 위에서 복사한 대시보드 ID를 입력하고 "Load" 버튼을 클릭



4. "Datasource"에서 "Prometheus"를 선택한 뒤 "Import"를 클릭


5. 생성한 대시보드 화면 확인

  • 해당 포트에 매핑된 프로세스가 살아나면 다시 "UP"으로 표시
  • 프로세스 포트 모니터링에서 중요한 것은 "UP & DOWN" 표시
  • "probe duration"이나 "dns lookup" 정보들은 프로세스보다는 프로세스가 동작하는 인스턴스가 살아있음을 알려줌

참고 URL : https://lapee79.github.io/article/monitoring-http-using-blackbox-exporter/
참고 URL : https://gurumee92.tistory.com/235?category=933410
참고 URL : https://github.com/prometheus/blackbox_exporter

  • Grafana, Prometheus, node-exporter를 이용해서 시스템 메트릭을 모니터링할 수 있는 대시보드를 구축

Grafana, Prometheus, node-exporter 구성 인프라스트럭처


node-exporter란

  • UNIX 계열 커널을 가진 하드웨어와 OS 등 "시스템 메트릭"을 수집하는 Exporter
  • Prometheus 재단이 공식적으로 지원하고 있는 Exporter 중 하나
  • Prometheus로 모니터링 시스템을 구축 시 시스템 메트릭 수집을 위해 가장 우선적으로 고려되는 Exporter
  • node-exporter의 exporter의 의미
    1. 특정 메트릭을 수집해서 엔드포인트에 노출시키는 소프트웨어(software) 혹은 에이전트(agent)
    2. node-exporter가 UNIX 계열 서버의 cpu, memory 등의 메트릭을 수집할 수 있는 것처럼, DB, 하드웨어, 메세지 시스템, 저장소 등 여러 시스템에 대한 익스포터가 존재
    3. CollectD 등 기존의 서버 모니터링에 사용되는 에이전트들과 통합할 수 있는 익스포터도 존재

node-exporter 설치 (서버)

1. node-exporter 스크립트 명령어로 실행

# 현재 위치 확인
$ pwd
/root

# 설치하는 컴포넌트들의 관리를 더 쉽게 하기 위해서 디렉토리 생성
$ mkdir node

# 디렉토리 이동
$ cd /root/node

# 압축 파일 다운로드
$ wget https://github.com/prometheus/node_exporter/releases/download/v1.2.0/node_exporter-1.2.0.linux-amd64.tar.gz

# 설치한 node-exporter 바이너리 파일 확인
$ ls
node_exporter-1.2.0.linux-amd64.tar.gz

# 압축 파일 해제
$ tar zxvf node_exporter-1.2.0.linux-amd64.tar.gz
node_exporter-1.2.0.linux-amd64/
node_exporter-1.2.0.linux-amd64/LICENSE
node_exporter-1.2.0.linux-amd64/NOTICE
node_exporter-1.2.0.linux-amd64/node_exporter

# node_exporter 설치된 디렉토리로 이동
$ cd /root/node/node_exporter-1.2.0.linux-amd64

# node_exporter 실행 → 포그라운드로 실행하면 다른 작업이 불가능함으로 백그라운드로 실행(& 붙임)
$ ./node_exporter

2. node-exporter 서비스로 실행 → node-exporter 명령어를 systemd로 관리

# 현재 디렉토리 위치 확인
$ pwd
/root/node/node_exporter-1.2.0.linux-amd64

# user 추가
$ useradd --no-create-home --shell /bin/false node_exporter

# 생성한 prometheus 계정 확인
$ cat /etc/passwd | grep node_exporter
node_exporter:x:1001:1001::/home/node_exporter:/bin/false

# 실행 파일 /usr/local/bin/으로 경로 이동
$ cp ./node_exporter /usr/local/bin

# /usr/local/bin/node_exporter node_exporter 유저, 그룹 권한 주기
$ chown node_exporter:node_exporter /usr/local/bin/node_exporter

# 명령어 복사 및 사용 권환 변경 확인
$ ls -al /usr/local/bin/node_exporter
-rwxr-xr-x 1 node_exporter node_exporter 18494531 Nov 20 14:37 /usr/local/bin/node_exporter

# 서비스 파일 등록
$ cat << EOF | tee /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOF

# 데몬 리로드
$ systemctl daemon-reload

# 서비스 가동
$ systemctl restart node_exporter

# 서비스 상태 확인
$ systemctl status node_exporter
● node_exporter.service - Node Exporter
   Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2021-11-20 14:39:30 KST; 11s ago
 Main PID: 19812 (node_exporter)
    Tasks: 5
   Memory: 8.4M
   CGroup: /system.slice/node_exporter.service
           └─19812 /usr/local/bin/node_exporter
[..생략..]

3. curl 명령어를 입력하여 node-exporter를 통해 수집되는 데이터가 있는지 확인

$ curl localhost:9100/metrics
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 8



Prometheus 설정 변경 → node-exporter 정보 수집

  • Prometheus에서 node-exporter가 수집하고 있는 메트릭을 스크래이핑

  • Prometheus 설정 파일을 보면 scrape_config 밑에 아래와 같이 node-exporter 관련 job이 등록 된 것을 확인 가능

    1. static_configs 밑에 targets에서 node-exporter가 구동된 인스턴스들의 "[Node-Exporter IP]:9100"을 기록

    2. Prometheus가 scrape_interval에 설정된 주기마다 각 인스턴스들에서 수집되는 메트릭을 스크래이핑하여 저장

      $ vi /etc/prometheus/prometheus.yml
      # my global config
      global:
        scrape_interval:     15s # By default, scrape targets every 15 seconds.
        evaluation_interval: 15s # By default, scrape targets every 15 seconds.
      
      external_labels:
        monitor: 'kubernetes-monitoring'
      
      rule_files:
      # - 'alert.rules'
      # - "first.rules"
      # - "second.rules"
      
      # alert
      # alerting:
      #   alertmanagers:
      #   - scheme: http
      #     static_configs:
      #     - targets:
      #       - "alertmanager:9093"
      
      # A scrape configuration containing exactly one endpoint to scrape:
      # Here it's Prometheus itself.
      scrape_configs:
        - job_name: 'prometheus'
          scrape_interval: 5s
      
          static_configs:
            - targets: ['localhost:9090']
      
        - job_name: 'node-exporter'
          scrape_interval: 5s
      
          static_configs:
            - targets: ['[Node-Exporter IP]:9100']
  • Prometheus 구동
    $ systemctl daemon-reload
    $ systemctl restart prometheus
    $ systemctl status prometheus
    ● prometheus.service - Prometheus Server
    Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: disabled)
    Active: active (running) since Sat 2021-11-20 15:10:51 KST; 23s ago
    Main PID: 4020 (prometheus)
    Tasks: 14
    Memory: 39.5M
    CGroup: /system.slice/prometheus.service
           └─4020 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/pro...
    [...생략...]


Prometheus UI에서 다음 쿼리를 입력 → node-exporter 설치한 서버의 값 읽음

  • 설정한 node-exporter란 job_name으로 수집되고 있는 인스턴스들의 개수를 확인 가능



node-exporter를 모니터링하는 Grafana 대시보드 구축

  • 기본 Grafana 에서 대시보드를 설치하는 방법은 해당 URL을 통해 학습 필요
  • Grafana로 대시보드를 구축할 때 좋은 점은 node-exporter같이 많이 사용하는 Exporter에 대한 대시보드가 이미 공유
  • 손쉽게 사용 가능

1. node-exporter 그라파다 대시보드 복사 가능한 대시보드 ID 획득

  • node-exporter 그라파나 대시보드 복사 가능하게 하는 URL : https://grafana.com/grafana/dashboards/1860
  • 위 경로에 접속하면 아래 화면이 보이는데 "Copy ID to Clipboard"를 클릭하여 복사함

2. 그라파나 대시보드로 이동한 후, 왼쪽 탭의 두 번째 "+"의 "Import" 메뉴를 클릭



3. 위에서 복사한 대시보드 ID를 입력하고 "Load" 버튼을 클릭



4. "Datasource"에서 "Prometheus"를 선택한 뒤 "Import"를 클릭



5. 생성한 대시보드 화면 확인

  • 기본 설정된 값으로는 잘 안보일 수 있으니 우측 상단 메뉴에서 "Last 5 Minutes"를 설정하고, 리프레시 간격을 5s로 바꾸는 것이 좋음
  • 실 서버에서는 서버 부하가 걸릴 수 있으니 15분에 10초가 적당
  • 생성한 node-exporter 대시보드를 통해 확인할 수 있는 지표들
    1. CPU
    2. Memory
    3. Disk
    4. Network
    5. File System
    6. System Daemon
    7. Node Exporter
  • 각 패널마다 edit을 누르면, Grafana에서 Prometheus를 어떻게 쿼리하는지 확인 가능

참고 URL : https://gurumee92.tistory.com/225?category=933410

  • docker가 기본적으로 설치되어있어야함
  • docker 설치는 다른 페이지에서 참고

1. 프로메테우스 적용 yaml 파일 → 모니터링할 목록 정의

# 프로메테우스 yaml파일을 관리한 디렉토리 생성
$ mkdir /etc/prometheus

# prometheus.yml 파일 내용 정의
$ vi /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s
  external_labels:
    monitor: legacy

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        - [서버 IP]:9090

2. 프로메테우스 인스턴스 시작

# 영구 볼륨(Persistent volumes)을 준비
$ mkdir -p /data/prometheus_data/

# 프로메테우스 인스턴스 배포
$ docker run -d --net=host --rm \
    -v /etc/prometheus:/etc/prometheus \
    -v /data/prometheus_data:/prometheus \
    -u root \
    --name prometheus\
    quay.io/prometheus/prometheus:v2.33.0 \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path=/prometheus \
    --storage.tsdb.retention=365d \
    --storage.tsdb.max-block-duration=1d \
    --storage.tsdb.min-block-duration=1d \
    --web.listen-address=:9090 \
    --web.enable-lifecycle \
    --web.enable-admin-api

3. 프로메테우스 배포 확인

  • docker 배포 확인
      $ docker ps
      CONTAINER ID                                 IMAGE                                   COMMAND                  CREATED             STATUS              PORTS               NAMES
      86205a98ec4d        quay.io/prometheus/prometheus:v2.33.0   "/bin/prometheus --c…"   14 seconds ago      Up 12 seconds                           prometheus

4. docker로 설치한 Prometheus의 관리 스크립트 내용

4.1. Prometheus.yml 파일 수정 후 Prometheus의 yaml 파일 내용 적용

```
$ source /etc/prometheus/cmd/Restart_Prometheus.sh

# 코드 내용
#! /bin/bash

container_id=`docker ps -a | grep -i prometheus | awk -F ' ' '{print $1}'`
docker restart $container_id
```

4.2. prometheus의 로그 삭제

```
$ source /etc/prometheus/cmd/Log_Clear.sh

# 코드 내용
#! /bin/bash

container_id=`docker ps -a | grep -i prometheus | awk -F ' ' '{print $1}'`
Log_file=$(docker inspect --format='{{.LogPath}}' "$container_id")

log_file_volume=`ls -al $Log_file | awk -F ' ' '{print $5}'`
if [[ $log_file_volume == 0 ]]; then
  echo "Log File is alrealy zero"
else
  truncate -s 0 $Log_file
  echo "Prometheus Log Clear"
fi
```

4.3. prometheus의 로그 보기

```
$ source /etc/prometheus/cmd/View_Log.sh

# 코드 내용
#! /bin/bash

container_id=`docker ps -a | grep -i prometheus | awk -F ' ' '{print $1}'`
docker logs -f $container_id
```

  • RedHat 계열의 CentOS 서버에서 Prometheus를 설치하고 systemd로 관리
  • Security Group, Firewall 등으로 9090번 포트에 대한 방화벽 해제가 필요

1. Prometheus 설치

  • 설치하고 싶은 Prometheus 버전의 경로를 잘 확인하여 다운받으면 됨

  • systemd를 사용하지 않고 /root/apps/prometheus-2.22.0.linux-amd64/pometheus를 실행해도 Prometheus 사용 가능

    $ pwd
    /root
    
    # 설치하는 컴포넌트들의 관리를 더 쉽게 하기 위해서 디렉토리 생성
    $ mkdir apps
    
    # 디렉토리 이동
    $ cd /root/apps
    
    # Prometheus 바이너리 파일이 들어 있는 압축 파일 설치
    $ wget https://github.com/prometheus/prometheus/releases/download/v2.22.0/prometheus-2.22.0.linux-amd64.tar.gz
    
    # 설치한 Prometheus 바이너리 파일 확인
    $ ls
    prometheus-2.22.0.linux-amd64.tar.gz
    
    # 압축 파일 해제
    $ tar zxvf prometheus-2.22.0.linux-amd64.tar.gz
    prometheus-2.22.0.linux-amd64/
    prometheus-2.22.0.linux-amd64/NOTICE
    prometheus-2.22.0.linux-amd64/prometheus
    prometheus-2.22.0.linux-amd64/consoles/
    prometheus-2.22.0.linux-amd64/consoles/node-cpu.html
    prometheus-2.22.0.linux-amd64/consoles/prometheus-overview.html
    prometheus-2.22.0.linux-amd64/consoles/node.html
    prometheus-2.22.0.linux-amd64/consoles/node-overview.html
    prometheus-2.22.0.linux-amd64/consoles/index.html.example
    prometheus-2.22.0.linux-amd64/consoles/prometheus.html
    prometheus-2.22.0.linux-amd64/consoles/node-disk.html
    prometheus-2.22.0.linux-amd64/console_libraries/
    prometheus-2.22.0.linux-amd64/console_libraries/prom.lib
    prometheus-2.22.0.linux-amd64/console_libraries/menu.lib
    prometheus-2.22.0.linux-amd64/promtool
    prometheus-2.22.0.linux-amd64/LICENSE
    prometheus-2.22.0.linux-amd64/prometheus.yml



2. Prometheus를 서비스로 생성하여 관리 → prometheus 실행을 systemd로 관리

  • Prometheus를 리눅스 systemd를 통해 서비스로 등록

    $ pwd
    /root/apps/prometheus-2.22.0.linux-amd64
    
    # 디렉토리 프로비저닝
    $ useradd --no-create-home --shell /bin/false prometheus
    
    # 생성한 prometheus 계쩡 확인
    $ cat /etc/passwd | grep prometheus
    prometheus:x:1001:1001::/home/prometheus:/bin/false
    
    # prometheus를 관리할 디렉토리 생성 및 명령어 복사
    $ mkdir /etc/prometheus
    $ mkdir /var/lib/prometheus
    $ cp ./prometheus /usr/local/bin/
    $ cp ./promtool /usr/local/bin/
    $ cp ./prometheus.yml /etc/prometheus/
    $ cp -r ./consoles /etc/prometheus
    $ cp -r ./console_libraries /etc/prometheus
    
    # 명령어 복사 확인
    $ ls /usr/local/bin/
    prometheus  promtool
    
    # prometheus 관련 내용 복사
    $ ls /etc/prometheus
    console_libraries  consoles
    
    # 유저:그룹 설정 -> prometheus 사용자 계정이 관리할 수 있도록 권한 변경
    $ chown prometheus:prometheus /etc/prometheus
    $ chown prometheus:prometheus /var/lib/prometheus
    $ chown prometheus:prometheus /usr/local/bin/prometheus
    $ chown prometheus:prometheus /usr/local/bin/promtool
    $ chown -R prometheus:prometheus /etc/prometheus/consoles
    $ chown -R prometheus:prometheus /etc/prometheus/console_libraries
    
    # 서비스 파일 등록
    $ cat << EOF | tee /etc/systemd/system/prometheus.service
    [Unit]
    Description=Prometheus Server
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    User=prometheus
    Group=prometheus
    Type=simple
    ExecStart=/usr/local/bin/prometheus \
      --config.file /etc/prometheus/prometheus.yml \
      --storage.tsdb.path /var/lib/prometheus/ \
      --web.console.templates=/etc/prometheus/consoles \
      --web.console.libraries=/etc/prometheus/console_libraries
    
    [Install]
    WantedBy=multi-user.target
    EOF
  • 서비스 데몬 리로딩
    $ systemctl daemon-reload
  • prometheus 서비스 시작
    $ systemctl start prometheus
  • prometheus 서비스 상태 확인

    $ systemctl status prometheus
    ● prometheus.service - Prometheus Server
     Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: disabled)
     Active: active (running) since Sat 2021-11-20 02:55:12 KST; 11h ago
    Main PID: 11780 (prometheus)
      Tasks: 14
     Memory: 48.4M
     CGroup: /system.slice/prometheus.service
             └─11780 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_...
    
    Nov 20 12:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T03:00:03.377Z caller=head.go:889 component=tsdb msg="WAL checkpoint complete" first=2 last=3 duration=29.052021ms
    Nov 20 12:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T03:00:03.425Z caller=compact.go:440 component=tsdb msg="compact blocks" count=3 mint=1637344800000 maxt=1637366400000 ulid=01FMXMJQ5RJ914...ration=41.7039ms
    Nov 20 12:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T03:00:03.431Z caller=db.go:1152 component=tsdb msg="Deleting obsolete block" block=01FMX6V8HX8WMN15F7H841AKH0
    Nov 20 12:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T03:00:03.432Z caller=db.go:1152 component=tsdb msg="Deleting obsolete block" block=01FMXDPZSXA1G1VCYYE6JTVAQN
    Nov 20 12:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T03:00:03.433Z caller=db.go:1152 component=tsdb msg="Deleting obsolete block" block=01FMWZZH9W1MH7PN1NZBT06CG9
    Nov 20 14:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T05:00:03.321Z caller=compact.go:494 component=tsdb msg="write block" mint=1637373600000 maxt=1637380800000 ulid=01FMXVEE9X21CFW66VFRRZNAK...tion=59.826896ms
    Nov 20 14:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T05:00:03.329Z caller=head.go:809 component=tsdb msg="Head GC completed" duration=2.347334ms
    Nov 20 14:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T05:00:03.386Z caller=compact.go:440 component=tsdb msg="compact blocks" count=2 mint=1637344458250 maxt=1637366400000 ulid=01FMXVEEC8WEK8...tion=50.157896ms
    Nov 20 14:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T05:00:03.393Z caller=db.go:1152 component=tsdb msg="Deleting obsolete block" block=01FMXMJQ5RJ914MKYP3J4QZ7WT
    Nov 20 14:00:03 [서버 IP] prometheus[11780]: level=info ts=2021-11-20T05:00:03.394Z caller=db.go:1152 component=tsdb msg="Deleting obsolete block" block=01FMWZNF1BR2H33QNDPE91K04T
    Hint: Some lines were ellipsized, use -l to show in full.



3. [서버 IP]:9090에 접속하여 prometheus의 UI 확인 가능

  • public IP:9090"에 접속하면 아래 UI를 확인 가능

  • Prometheus는 메트릭 수집, 시각화, 알림, 서비스 디스커버리 기능을 모두 제공하는 오픈 소스 모니터링 시스템
  • SoundCloud에서 Go언어로 개발하였으며, Apache 2.0 License를 따르고 있음
  • 2016년에 쿠버네티스에 이어 두 번째로 CNCF(Cloud Native Computing Foundation) 산하 프로젝트 멤버로 들어감
  • Grafana Labs에서 유지 보수를 메인으로 전담
  • Prometheus는 독립형 오픈소스 프로젝트이며 많은 회사들이 사용함
  • kubernetes에서 Prometheus를 사용하여 매트릭 수집 및 대시보드 구축하는 방식을 장려
  • Prometheus는 애초에 "스케일 아웃"을 고려하지 않고 설계
  • 데이터가 많으면 많을수록 Prometheus 클러스터링을 위한 Thanos, Cortex등 여러 오픈 소스가 개발되면서 클러스터링 구성 가능

Prometheus의 대표적인 기능

  1. 풀 방식의 메트릭 수집, 시계열 데이터 저장
  2. PromQL을 활용하여 저장된 시계열을 쿼리 및 집계
  3. 서비스 디스커버리
  4. 데이터 시각화

Prometheus 아키텍처

  • Prometheus의 아키텍쳐는 아래와 같이 구성

1. Prometheus

  • Prometheus는 시계열 데이터를 저장
  • Prometheus는 Exporter를 통해 다양한 서비스/시스템의 메트릭을 수집 → Node Exporter는 설치된 머신의 CPU, Memory 등의 메트릭 정보를 수집
  • Client Library는 애플리케이션 코드를 계측하기 위해 쓰인다.
  • Prometheus는 설정 파일(prometheus.yml)에 작성된 "Job"을 통해서 이들이 수집하는 메트릭을 가져와서 저장

2. Pushgateway

  • Pushgateway는 Polling방식이 아닌 프로메테우스에 메트릭을 매트릭을 푸시할 수 있도록 지원
  • Prometheus에서 제공하는 Pushgateway는 푸시된 매트릭을 프로메테우스에서 가져갈 수 있도록 중개자 역할을 수행
  • 즉, Pushgateway에 푸시된 매트릭을 Prometheus에서 가져갈 수 있음

3. Client Library

  • Client Library는 애플리케이션 코드를 계측하기 위해 사용됨
  • 서비스를 개발할 때 가장 좋은 방법은 프로메테우스 클라이언트 라이브러리를 사용해 메트릭을 코드 인라인 기반으로 직접 작성하고 계측함
  • 기본적으로 Go, Java(Scala), Python, Ruby 는 공식 라이브러리를 제공
  • 클라이언트 라이브러리 : https://prometheus.io/docs/instrumenting/clientlibs/

4. Exporter

  • Exporters는 실제로 매트릭을 수집하는 프로세스
  • Exporter가 매트릭을 수집하고 HTTP 통신을 통해 매트릭 데이터를 가져갈 수 있게 /metrics 라는 HTTP 엔드포인트를 제공
  • Prometheus가 Exporter의 엔드포인트로 HTTP GET 요청을 날려 매트릭 정보를 수집(Pull)함

5. Alertmanager

  • Alertmanager를 통해서 특정 메트릭이 임계치가 넘어가거나 경계에 잡혔을 때 이메일, 슬랙 등을 통해서 알림을 보내줄 수 가 있음
  • UI 기능이 있어 데이터를 시각화 가능 → 프로메테우스의 시각화 기능은 약한 편임
  • Prometheus의 Alertmanager 기능의 부족한 부분을 채우기 위해 Grafana 대시보드 툴로 Prometheus UI를 대체

6. Service Discovery

  • Service Discovery 기능을 제공
  • Service Discovery를 활용하면, 인스턴스는 다이나믹하게 스케일 인/아웃이 됨
  • Prometheus는 여러 Service Discovery와 통합 가능
  • 쿠버네티스 Service Discovery와 통합하여, 쿠버네티스 클러스터에 존재하는 모든 노드와 팟들의 메트릭을 수집 가능


Prometheus를 사용하기에 적합한 일, 적합하지 않은 일

  • Prometheus는 "메트릭"을 저장하기 위한 모니터링 시스템
  • 커널 스케줄링이나 데이터 수집 실패 같은 요소로 인해 약간의 부정확성과 레이스 컨디션을 피할 수 없는 운영 모니터링 환경을 위해 설계되었다.

1. Prometheus에 적합한 일

  1. 순수한 숫자 시계열을 기록하는 데 적합
  2. 메트릭 기반의 시계열 데이터 저장
  3. 동적인 혹은 마이크로 서비스의 인스턴스에 대한 메트릭을 수집

2. Prometheus에 적합하지 않은 일 → 다른 도구를 사용하여 Prometheus의 부족한 부분을 해결

  1. 이벤트 로그나 개별 이벤트를 저장하는 일
  2. 이메일 주소/사용자 이름과 같이 카디널리티가 높은 데이터를 저장하는 일
  3. 100%의 정확성이 요구되는 일

참고 URL : https://gurumee92.tistory.com/220
Pushgateway 참고 URL : https://kdevkr.github.io/using-pushgateway-to-monitor-private-network-instance/
Client Library 참고 URL : https://medium.com/nexclipper-io/prometheus-exporter-exporterhub-f29d63e0ae49


+ Recent posts