11일차_모니터링(프로메테우스, 그라파나)

최지웅·2024년 11월 19일
0

인프라

목록 보기
14/19

9-1. 컨테이너화된 애플리케이션에서 사용되는 모니터링 기술 스택

  • 컨테이너의 투명성은 어플리케이션이 어떤 상태에 있는지, 뭘 하고 있는지, 문제가 있다면 어떤 부분이 원인인지 파악할 수 있는 특성을 의미한다.
  • 일반적인 모니터링과 달리, 컨테이너가 플랫폼에 의해 수없이 생성되고 삭제되기에 새로운 모니터링 방식이 필요하다. 대표적으로 측정값을 외부로 공개하는 API를 포함해 컨테이너를 만드는 프로메테우스가 있다.
  • 도커 엔진 설정을 담당하는 /etc/docker/daemon.json 파일에 명시적으로 프로메테우스 측정 기능을 활성화시켜야한다. 이후 http://localhost:9323/metrics에서 도커 엔진 상태를 확인할 수 있다.
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
  • 프로메테우스를 컨테이너에서 실행해 도커가 실행 중인 컴퓨터 정보를 수집하자.
hostIP=$(ip route get 1 | awk '{print $NF;exit}') # 컨테이너는 호스트 IP정보가 없기에 환경변수로 지정

docker container run -e DOCKER_HOST=$hostIP -d -p 9090:9090 diamol/prometeus:2.13.1 # -e DOCKER_HOST 옵션으로 호스트 IP직접 전달(-environment 환경변수)
  • 컨테이너마다 측정값을 수집할 엔드포인트를 만들고 프로메테우스가 이 엔드포인트에서 주기적으로 정보를 수집하게만 하면 된다.

9-2. 애플리케이션의 측정값 출력하기

  • Go언어는 promhttp모듈, JAVA는 micrometer패키지, Node.js는 prom-client패키지가 프로메테우스 지원을 제공한다. 별도의 코드 작성 없이 패키지만 추가해도 Go언어는 활성상태의 고루틴 개수, JAVA는 메모리 용량 정보 등을 자동으로 제공해준다.
  • 도커 엔진의 측정값, 언어 라이브러리에서 제공하는 측정 값 외에 별도로 지정하고 싶으면 명시적으로 지정가능하다. 프로메테우스의 측정값 유형 중 카운터는 숫자 형식으로 유지 혹은 증가, 게이지는 숫자 형식으로 증감이 가능하다.
//Node.js에서 커스텀 프로메테우스 측정값 선언 및 사용
const accessCounter=new prom.Counter({
	name: "access_log_total",
    help: "Access Log - 총 로그 수"
});

const clientIpGauge=new prom.Gauge({
	name: "access_client_ip_current",
    help: "Access Log - 현재 접속 중인 IP 주소"
});

accessCounter.inc();
clientIpGauge.set(countOfIpAddress);
  • 로그를 사용하는 것 보다 측정값을 수집하는 것이 시각화하기 좋고 저렴하다.

9-3. 측정값 수집을 맡을 프로메테우스 컨테이너 실행하기

  • 프로메테우스가 측정값을 수집하는 과정을 스크래핑이라고 하며, 아래와 같이 설정 가능하다. 아래는 컴포넌트 별 측정값을 수집할 컨테이너와 엔드포인트, 이름을 정의한다.
global:
	scrape_interval: 10s #스크래핑 간격 10초

# 컴포넌트 별 스크래핑 작업 설정
scrape_configs: 
	- job_name: "image-gallery" # 스크래핑 작업의 이름
      metrics_path: /metrics # 스크래핑을 진행할 엔드포인트
      static_configs: # 대상 컨테이너 지정 # 정적 설정으로 단일 컨테이너를 지정할 때 사용한다.
    	- targets: ["image-gallery"] # 컴포넌트에서 컨테이너 수 증가 시 모두 측정값 수집.(로드밸런싱 확인까지 가능. 잘 되고있다면 여러 쿼리 시 균등하게 분배될 테니)
    
    - job_name: "iotd-api"
      metrics_path: /actuator/prometheus
      static_configs:
      	- targets: ["iotd"]
    
    - job_name: "access-log"
      metrics_path: /metrics
      dns_sd_configs: # DNS서비스 디스커버리를 통해 여러 컨테이너를 지정할 수 있고, 스케일링에 따라 컨테이너가 확대할 수 있다?
        -names:
          - accesslog # 모든 컨테이너의 IP주소를 목록을 만들어 측정값 수집?
            type: A
            port: 80
  • 프로메테우스 웹 UI에서 사용가능한 쿼리는 아래와 같다. 이는 PromQL이라는 프로메테우스 쿼리 언어로, 여러 통계 함수를 갖추고 있다.
sum(access_log_total) without(hostname, instance)

sum(image_gallery_requests_total{code="200"}) without(instance)
# image_gallery_request측정값을 통합하고, 응답 코드가 200인 것만 추려 instance 레이블과 무관하게 값을 합하는 쿼리로 응답코드 200인 응답의 총 횟수를 의미한다.
  • 실제 대시보드를 만들려면 그라파나를 사용해야한다.

9-4. 측정값 시각화를 위한 그라파나 컨테이너 실행하기

  • 측정값을 열람하거나 데이터 시각화를 위한 쿼리 확인&수정은 프로메테우스 웹 UI로 충분하나, 이를 대시보드로 연결시키는 데에 그라파나를 사용한다. 시각화된 그래프 하나하나는 PromQL로 작성된 단일 쿼리로 그려진다.
  • 그라파나를 도커 컴포즈에 포함시킨 뒤 애플리케이션을 실행시키면 된다. 그라파나 웹 UI는 3000번 포트를 사용하며, 로그인 초기값은 admin admin이다.
  • 구글에서 제공하는 '사이트 신뢰성 엔지니어링'에서는 지연시간, 트래픽, 오류, 가용 시스템 자원을 주요 측정값으로서 이들을 '골든 시그널'이라고 부른다.
#1. HTTP 응답 코드 200으로 처리된 응답의 누적 개수(카운터)
sum(image_gallery_request_total{code="200"}) without(instance)

#2. 현재 처리 중인 요청 수(게이지)
sum(image_gallery_in_flight_requests) without(instance)

#3. 메모리 사용량. 컨테이너 증가 시 증가.
go_memstats_stack_inuse_bytes{job="image-gallery"}

#4. 활성 고루틴 수. 컴포넌트 부하를 대략적으로 나타내는 지표
sum(go_goroutines{job="image_gallery"}) without(instance)

#5. HTTP 응답 오류 수
sum(image_gallery_requests_total{code="500"}) without(instance)
  • 대시보드의 그래프에서 중요한 것은 평균값에서 벗어나 수치가 튀어오르는 순간을 찾아 컴포넌트의 이상 현상과의 상관관계를 알아내는 것이다.
  • 그라파나는 단순한 질의 뿐 아니라 시스템에 경고를 보내는 기능도 있지만 사용하기 쉽다.
  • 그라파나 도커 이미지를 만드는 Dockerfile 스크립트는 아래와 같다.
FROM diamol/grafana:6.4.3 # 측정 버전의 그라파나 이미지를 기반이미지로 사용, 몇가지 YAML과 JSON을 복사.

COPY datasource-prometheus.yaml ${GF_PATHS_PROVISIONING}/datasources/ # 그라파나와 프로메테우스 연결을 위한 정보
COPY dashboard-provider.yaml ${GF_PATHS_PROVISIONING}/dashboards # 대시보드 구성 읽으라는 내용
COPY dashboard.json /var/lib/grafana/dashboards/ # 대시보드 구성 파일을 디렉터리에 복사하는 내용

9-5. 투명성의 수준

  • 실제 서비스가 가능하려면 투명성을 위해 애플리케이션의 전체 상황을 조망하는 대시보드가 필요하며, 중요한 데이터를 모아 하나의 화면으로 구성할 수 있어야 한다.
profile
이제 3학년..

0개의 댓글