반응형

1. 프로메테우스(prometheus) 란?

SoundCloud 사에서 만든 오픈 소스 기반 모니터링 솔루션

  • 많은 도큐먼트와 커뮤니티 보유

go 언어로 만들어짐

하드웨어 레벨 / 애플리케이션 모니터링이 가능

  • 마이크로 서비스
  • multiple language 지원(java, go, 등)
  • window/linux

pull 방식 아키텍쳐

  • push 방식은 패킷 손실. 수집처 서버의 CPU 사용율. 그리고 단일장애의 위험성이 있음
  • pull 방식은 tcp/udp 오버헤드가 적고, 집계가 push 보다 쉬워짐.
  • 부하가 높은 상황에서는 fail point 를 비교적 예방 할 수 있음

하지만 단점도? 

  • 수집 메트릭과 룰이 많아질수록 configuration 이 복잡해짐
  • 단일 노드 동작으로 스케일 아웃이 어려움

2. 왜 프로메테우스?

다양한 써드파티 Exporter 가 있다.

시계열 데이터 모델

PromQL 이라는 쉽고 간결한 자체 쿼리 언어 지원

단일 노드 사용하여 수집

많은 회사에서 사용하고 있고, kubernetes 에서도 prometheus 사용을 장려하고 있다.

3.프로메테우스 구조

시스템 구성도

prometheus server

  • main component
    • http 서버 : PromQL 쿼리를 받음
    • 시계열 데이터 베이스 storage : metric 저장
    • Worker : metric 반환

Exporter

  • fetch metric, convert to correct format, expose metric
  • 다양한 종류의 익스포터 지원
    • 해당 노드에서 발생하는 HW 메트릭 정보 수집

AlertManager

  • 알림이 발생하는 Rule 을 정의해서 부합하는 경우 알림 전송

Jobs

  • Single Application
  • 모니터 대상

** 역시 Pull Mechanism 이 가장 큰 특징 !!!

  • Data Retrieval Worker 가 pushgateway, prometheus targets으로 pull을 한다. 푸시가 아니라 pull 방식으로 수집한다.

동작 방식을 간단히 요약하면..

  • Jobs / Exporters 는 실제 메트릭을 수집하는 프로세스, 에이전트
  • Prometheus Server 가 Pull 방식으로 데이터를 가져갈 수 있게 HTTP 엔드포인트를 제공
  • GET 방식 요청을 날려 메트릭 정보를 수집하고, TSDB 에 저장.

4. 프로메테우스 설치 (docker-compose)

how? (구성 방법)

  • 아래 방법은 prod 수준이 아닌 빠른 구성이며, 모든 설정은 기본 값으로 되있다.
  • docker, docker-compose 가 미리 설치되어 있어야 한다.

a) 프로메테우스 구성

  • 가장 기본적인 구성은 프로메테우스 서버, 그라파나 조합이다.
  • 아래는 수집툴 node-exporter도 같이 띄워주는 설정이다
version: '3.7'

volumes:
    prometheus_data: {}
    grafana_data: {}

networks:
  front-tier:
  back-tier:
    driver: bridge

services:

  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus/:/etc/prometheus/
      - ./prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - 9090:9090
    links:
      - cadvisor:cadvisor
      - alertmanager:alertmanager
    depends_on:
      - cadvisor

    networks:
      - back-tier
      - front-tier
    restart: always

  node-exporter:
    image: prom/node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command: 
      - '--path.procfs=/host/proc' 
      - '--path.sysfs=/host/sys'
      - --collector.filesystem.ignored-mount-points
      - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
    ports:
      - 9100:9100
    networks:
      - back-tier
    restart: always
    deploy:
      mode: global

  alertmanager:
    image: prom/alertmanager
    ports:
      - 9093:9093
    volumes:
      - ./alertmanager/:/etc/alertmanager/
    networks:
      - back-tier
    restart: always
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
      
    grafana:
    image: grafana/grafana
    user: "472"
    depends_on:
      - prometheus
    ports:
      - 3000:3000
    volumes:
      - ./grafana_data:/var/lib/grafana
      - ./grafana/provisioning/:/etc/grafana/provisioning/
    env_file:
      - ./grafana/config.monitoring
    networks:
      - back-tier
      - front-tier
    restart: always

b) process-exporter

  • 일반적으로 node-exporter 로 h/w 정보를 수집하긴하지만, 프로세스 수준으로 데이터를 수집이 필요할때 사용하면 좋다.
  • https://github.com/ncabatoff/process-exporter/releases/tag/v0.7.10
  • release 버전에 맞게 받을 수 있음
  • cofnig 설정방법
    • cat /proc/[processid]/cmline 의 정규식에 걸리는 애들
    process_names:
      - name: "{{.Comm}}"
        cmdline:
        - '.+'
  • 위 process-exporter 구성은 선택사항이다. 필요에 따라 구성해도 좋다. 

c) prometheus.yml 설정

  • 수집 서버 설정과, 방식, 룰 들을 셋팅하는 설정 파일이다
# 기본적인 전역 설정 
global:
  scrape_interval:     15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  evaluation_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  # 'scrpae_timeout' 이라는 설정은 기본적으로 10초로 세팅되어 있다.
# Alertmanager 설정
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# 매트릭을 수집할 엔드포인트를 설정. 여기서는 Prometheus 서버 자신을 가리키는 설정을 했다.
scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
  - job_name: 'prometheus'
    # 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
    # 'scheme'라는 설정의 기본 값은 'http'이다.
    static_configs:
    - targets: ['localhost:9090']
    
 - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']
  - job_name: 'process_exporter'
    static_configs:
      - targets: ['localhost:9256']
  • prometheus 설정파일과 볼륨 마운팅 된 위치에 위 설정파일을 추가한다
  • 위 주석을 간단하게 달았지만, 수집 서버에 대한 정보가 scrape_configs 에 모두 기술되어야 한다
  • 모든 구성이 끝나면 docker-compsoe 명령을 이용해 컨테이너를 띄운다.

(구성된 이미지나 스크린샷들은.. 나중에 추가..)

 

 

5) 소감..?

  • 이번에 회사에서 프로메테우스 신규 구성을 맡아 진행해봤는데, 역시 공부할게 아직도 많다. 
  • 그라파나에서 완성된 대시보드를 import 하면 수집쪽 셋팅 후 정말 손쉽게 구성할 수 있다.
  • 데이터 엔지니어에게 있어 모니터링은 정말 중요한 작업이라는걸 다시 느꼈다. 

 

반응형

+ Recent posts