서론


최근 많은 분야에서 MSA도입을 고려하고 있습니다. MSA는 많은 장점을 가지고 있지만, 서비스의 개수가 증가할수록 운영의 복잡도가 증가한다는 단점도 있습니다. 이러한 운영 복잡도 증가를 해결하기 위해 서비스들에 대한 모니터링 기능이 중요시 되고 있습니다. 이러한 모니터링 도구로 newrelic(https://newrelic.com), sysdig(https://sysdig.com) 등의 다양한 유료 툴들과 Prometheus(https://prometheus.io/), Statsd(https://github.com/statsd/statsd) 등 여러 무료 툴들이 존재하고 있습니다. 본 글에서는 이 중 오픈 소스 툴인 Prometheus를 활용한 모니터링에 대해 알아 보도록 하겠습니다.




목표


Prometheus에 사용자의 모니터링 데이터를 보내기 위한 어플리케이션을 제작하고, Prometheus Server에 적재된 모니터링 데이터를 Grafana 대시보드에서 그래프로 보여주는 것을 목표로 합니다.




구성


이번 시리즈는 2개의 부분으로 구성이 되어 있습니다. 우선 Prometheus와 Grafana에 대해 간단히 알아보고, 다음편에서는 Prometheus에 모니터링 데이터를 보내기 위한 어플리케이션 제작하고, 로컬 docker 환경에서 Prometheus와 Grafana를 실행하여 모니터링 기능에 대해 확인해 보도록 하겠습니다.





Prometheus와 Grafana

Prometheus

여기서는 Prometheus의 동작 방식을 이해하기 위해 아키텍쳐 및 구성 컴포넌트를 살펴보고, 사용 방법을 알기 위한 메트릭과 PromQL에 대해서 알아보겠습니다.

1) Prometheus 동작 및 아키텍쳐

일반적인 모니터링 툴들은 REST API등을 통해 모니터링 데이터를 어플리케이션에서 직접 보내는 방법을 많이 사용합니다. 하지만, Prometheus는 다른 모니터링 툴과는 다르게 Pull 방식을 사용하여 어플리케이션으로 부터 모니터링 데이터를 가져옵니다. 즉, Prometheus는 등록된 모니터링 대상으로 API를 호출하여 모니터링 데이터를 수집합니다. 아래의 Prometheus의 아키텍처 그림을 보시면, Prometheus Server가 각종 Exporter나 Pushgateway로 모니터링 데이터를 가져오기 위해 API를 호출하는 모습을 화살표의 방향을 통해 확인하실 수 있습니다.

아키텍처 그림에서 보여지는 Prometheus의 주요 컴포넌트는 아래와 같은 역할을 합니다.

  • Prometheus Server: 모니터링 데이터를 수집하고 저장합니다.
  • Pushgateway: 배치나 스케쥴링으로 동작하는 어플리케이션의 경우 항상 실행되는 것이 아니기 때문에 해당 어플리케이션의 API를 호출할 수 없습니다. 이런 경우 해당 어플리케이션은 어플리케이션이 동작하는 동안 모니터링 데이터를 Pushgateway로 보내고, 추후 Prometheus server가 이 Pushgateway의 데이터를 수집하는 방식을 사용할 수 있습니다.
  • Prometheus Web UI, Grafana : Prometheus에 저장된 데이터를 조회하거나 시각화하는 기능을 제공합니다.
  • Alert Manager: 특정 룰을 이용한 알람 설정을 통해 알람 발생될 조건이 되면 설정된 Email이나 PagerDuty를 통해 알람의 내용을 전달할 수 있습니다.
  • Exporter: 모니터링 데이터를 수집하고 Prometheus Server에서 수집 요청이 오면 모니터링 데이터를 넘겨줍니다. 이미 여러 제품 및 툴들을 위한 Exporter들이 만들어져 있으니 사용하시는 시스템에 따라 이미 만들어진 Exporter를 활용하실 수 있습니다.(https://prometheus.io/docs/instrumenting/exporters/)

2) Prometheus 메트릭

Prometheus의 메트릭은 기본적으로 메트릭 구분을 위한 name과 메트릭을 설명하기 위한 help로 구성됩니다. 메트릭 name은 아스키문자, 숫자, 언더바(_), 콜론(:)만 지원합니다. 따라서 메트릭 name은 반드시 이 정규식을 “[a-zA-Z_:][a-zA-Z0-9_:]*” 만족해야 합니다. 그리고 메트릭을 좀 더 자세하게 구분하기 위해 레이블이라는 값을 이용할 수 있습니다. 이런 레이블은 아스키 문자, 숫자, 언더바만 지원합니다.
대부분의 Prometheus 어플리케이션 라이브러리는 아래와 같은 네가지의 주요 메트릭 타입을 제공하고 있습니다. 따라서 어플리케이션을 제작하실 때 필요한 메트릭에 맞는 타입을 선택하셔서 사용하시면 됩니다.

  • Counter: 증가만 가능한 메트릭이며 프로그램 재시작시 초기화 됩니다. 예를들어, 감소하지 않고 증가만 하는 값 들인 리퀘스트 카운트, 전송량 같은 값들을 표시 하는데 사용될 수 있습니다.
  • Guage: 증가와 감소가 가능한 메트릭이며 현재값을 기준으로 증가나 감소를 시키거나 특정 값을 설정할수 있습니다. 온도, 상태, 현재 측정값 등을 표현하는데 사용될 수 있습니다.
  • Histogram: 관측값을 저장하기 위한 메트릭이며, 관측값을 저장하면 관측값의 횟수가 [metric이름]_count 에 나타나며 관측값의 합이 [metric이름]_sum에 나타나게 됩니다. 또한 특정 값의 범위를 가지는 bucket을 통해 값의 분포를 확인할수 있습니다. 전송 속도, 에러 분포 등을 표현하기 좋습니다.
  • Summary : histogram과 같이 관측값을 저장하는 메트릭이며, φ-quantile이 자동적으로 계산됩니다. φ는 0과 1 사이의 값을 가지며, φ-quantile은 전체 관측값의 수가 N 이라고 했을때 φx N 번째 값을 의미합니다. 예를 들어 전체 관측값이 100개이고, φ가 0.95이면 전체 100개의 관측값 중 95번째에 해당되는 값을 의미합니다.

3) PromQL

  • 기본적인 쿼리는 메트릭 name을 명시하여 해당 값을 쿼리 합니다.
  • 레이블에 대한 쿼리는 {}를 이용하여 레이블에 대한 조건을 명시합니다. 예를 들어 http_requests_total{label=”test”}는 http_requests_total 메트릭에서 label이 test인 것을 나타냅니다. 레이블에 대한 조건은 =(정확히 일치되는 레이블), != (일치하지 않는 레이블), =~(정규식에 맞는 레이블), !~(정규식에 맞지 않는 레이블) 의 네가지 타입을 지원합니다. 보시는 바와 같이 사용되는 조건에 따라 일반적인 스트링 및 정규식을 이용할 수 있습니다.
  • []를 사용해서 특정 기간동안의 값들을 나타낼수 있습니다. http_requests_total{label=”test”}[5m]은 test 레이블을 가진 http_requests_total 메트릭의 5분 동안의 값을 나타냅니다. s(seconds), m(minutes), h(hours), d(days), w(weeks) ,y(years) 의 문자를 지원합니다. 일반적으로 sum(), rate()등의 함수와 같이 사용됩니다.
  • 사칙연산, 나머지, 지수등의 기본 숫자 연산자를 지원합니다. 또한 등호, 부등호 등의 비교 연산자와 and, or 등의 바이너리 연산자도 지원하고 있습니다. 좀더 자세한 내용은 https://prometheus.io/docs/prometheus/latest/querying/operators/를 확인하시기 바랍니다.
  • 절대값을 위한 abs(), 선택된 값들의 합을 구하는 sum(), 특정 기간동안의 변화량을 기준으로 1초 동안의 변화량을 계산하는 rate()함수 등 다양한 종류의 함수를 지원합니다. 더 많은 함수에 대한 내용은 https://prometheus.io/docs/prometheus/latest/querying/functions/에서 보실수 있습니다.



  • Grafana

    Grafana는 수집된 모니터링 데이터를 다양한 차트와 그래프를 이용하여 시각화하여 보여주는 툴입니다. 각각의 모니터링 시스템에 맞도록 모니터링 데이터의 흐름이나 현재 상태를 보기 위한 대시보드를 생성할 수 있습니다.
    https://play.grafana.org 에서 다양한 Grafana 대시보드 샘플을 보실 수 있으며, https://grafana.com/grafana/dashboards 에서 미리 만들어진 대시보드를 다운받아 import할 수 있습니다.




    다음 편에서 custom 메트릭을 사용하여 모니터링 메트릭을 정의 하고 이를 Prometheus server에서 읽어 갈수 있도록 하는 NodeJS 어플리케이션을 작성해보고, docker를 활용하여 local에서 prometheus와 grafana를 구동하여 해당 어플리케이션의 동작을 확인하는 방법에 대해 설명하도록 하겠습니다.