본문 바로가기

개발/Node.JS

Prometheus로 Node.js 성능 모니터링

생산에 Node.js를 응용 프로그램이있는 경우 모니터링하는 것을 이해하는 데 도움이, 그리고 프로 메테우스를 사용하는 방법 - 강력한 데이터 압박 및 시계열 데이터를 쿼리 빠른 데이터를 제공하는 오픈 소스 솔루션 - Node.js를위한을 모니터링.

업데이트 : 이 기사에서는 RisingStack의 Node.js 모니터링 플랫폼 Trace에 대해 여러 번 언급합니다. 10 월에 2017 년에 Trace가 Keymetrics 의 APM 솔루션 과 통합되었습니다 시도해 보려면 여기를 클릭하십시오 !

Node.js 모니터링이란 무엇입니까?

"서비스 모니터링"이라는 용어는 시스템에 대한 실시간 정량 데이터를 수집, 처리, 수집 및 표시하는 작업을 의미합니다.

모니터링은 우리 시스템의 상태 와 주소 문제가 비즈니스에 영향을 미치기 전에이를 관찰 할 수있는 능력을 제공합니다 또한 모니터링은 사용자의 경험을 최적화하는 데 도움이됩니다.

데이터를 분석하려면 먼저 특정 응용 프로그램 인스턴스의 메모리 사용량과 같이 시스템에서 메트릭을 추출해야합니다. 우리는 이것을 추출 도구라고 부릅니다.

운영 시스템 자체에서 메트릭을 제공 할 때 화이트 박스 모니터링 이라는 용어를 사용합니다 이것이 우리가 잠수 할 Node.js 모니터링의 일종입니다.

알아야 할 4 가지 신호

모든 서비스가 다르기 때문에 다양한 서비스를 모니터링 할 수 있습니다. 메트릭은 메모리 사용 과 같은 하위 수준의 리소스에서부터 가입 수 와 같은 상위 수준의 비즈니스 메트릭에 이르기까지 다양 합니다.

모든 서비스에 대해 다음 신호를 보는 것이 좋습니다.

  • 오류율 : 오류는 사용자가 직면하고 고객에게 즉시 영향을주기 때문에 발생합니다.
  • 응답 시간 : 대기 시간은 고객 및 비즈니스에 직접적인 영향을주기 때문에
  • 처리량 : 트래픽은 증가 된 
    오류율 및 대기 시간 의 상황을 이해하는 데 도움이됩니다 .
  • 채도 : 서비스가 " 얼마나 충만한 지 " 알려줍니다 CPU 사용량이 90 % 인 경우 시스템에서 더 많은 트래픽을 처리 할 수 ​​있습니까?

수단

수동으로 시스템을 계측 할 수 있지만 대부분의 유료 모니터링 솔루션은 기본적으로 장비를 제공합니다.

대부분의 경우 계측은 성능 오버 헤드 가있는 추가 논리 및 코드 조각을 추가 하는 것을 의미 합니다.

Node.js 모니터링 및 계측을 사용하면 낮은 오버 헤드를 달성하는 것이 목표이지만 반드시 더 나은 성능 영향이 더 나은 시스템 가시성을 위해 정당화 될 수 없다는 것을 의미하지는 않습니다 .

코드를 계측 할 위험

계측기 는 매우 특수하며 일반적으로 전문성과 개발 시간이 필요할 수 있습니다 또한 잘못된 계측은 시스템에 버그를 유발하거나 불합리한 성능 오버 헤드를 유발할 수 있습니다.

코드를 계측하면 추가 행이 많이 생기고 애플리케이션 코드베이스가 커집니다.


Node.js 모니터링 도구 선택

팀에서 모니터링 도구를 선택하면 다음 측면을 고려해야합니다.

  • 전문 지식 : 당신은 전문 기술이 있습니까? 모니터링 툴을 구축하고 고품질 계측을 작성하고 올바른 메트릭을 추출하는 것은 쉽지 않습니다. 당신은 당신이하고있는 것을 알아야합니다.

  • 구축 또는 구매 : 적절한 모니터링 솔루션을 구축하려면 전문 지식, 시간 및 비용이 많이 필요하지만 기존 솔루션을 얻는 것이 더 쉽고 저렴 할 수 있습니다.

  • SaaS 또는 온 프레미스 : 모니터링 솔루션을 호스팅 하시겠습니까? SaaS 솔루션을 사용할 수 있습니까? 데이터 준수 및 보호 정책은 무엇입니까? SaaS 솔루션을 사용하면 툴링 대신 제품에 집중할 때 유용합니다. 오픈 소스 솔루션과 상용 솔루션은 일반적으로 호스팅 또는 사내 구축 형으로 사용할 수 있습니다.

  • 라이센스 : 모니터링 툴 세트를 제품과 함께 배송 하시겠습니까? 상용 솔루션을 사용할 수 있습니까? 항상 라이센스를 확인해야합니다.

  • 통합 : 데이터베이스, 오케스트레이션 시스템 및 npm 라이브러리와 같은 외부 종속성을 지원합니까?

  • 계측 : 자동 계측을 제공합니까? 내 코드를 수동으로 계측해야합니까? 혼자서 할 시간이 얼마나 걸릴까요?

  • 마이크로 서비스 : 단일체 또는 분산 시스템을 구축합니까? 마이크로 서비스는이를 효과적으로 디버깅하고 모니터링하기위한 특정 도구와 철학이 필요합니다. 추적 또는 보안 검사를 배포해야합니까?

우리의 경험에 비추어 볼 때, 대부분의 경우 SaaS 또는 Trace 와 같은 온 - 프레미스 모니터링 솔루션은 Node.js 애플리케이션을 모니터링하고 디버깅 할 수있는 적절한 가시성과 툴 세트를 제공합니다.

그러나 어떤 이유로 상용 솔루션을 선택할 수 없을 때 무엇을 할 수 있으며 자신의 모니터링 제품군을 만들고 싶습니까?

이것은 프로 메테우스가 그림에 올 때의 경우입니다!

프로 메테우스로 노드 모니터링

Prometheus 는 Node.js 모니터링 및 경고를 위한 오픈 소스 솔루션입니다 강력한 데이터 압축 기능과 시계열 데이터에 대한 빠른 데이터 쿼리 기능을 제공합니다.

시계열은 동일한 메트릭 및 동일한 레이블에 속하는 불변의 타임 스탬프 값의 스트림입니다. 레이블을 통해 메트릭이 다차원이됩니다.

Prometheus 가 스크래치로부터 시계열 데이터베이스 작성하기 기사 에서 스토리지 엔진을 최적화하는 방법에 대해 자세히 알아볼 수 있습니다 .

FunFact : Prometheus는 SoundCloud에서 처음 제작되었으며, 2016 년 Kubernetes 이후 두 번째 호스팅 프로젝트로 Cloud Native Computing Foundation에 가입했습니다 .

데이터 수집 및 측정 항목 유형

Prometheus는 HTTP 끌어 오기 모델을 사용합니다. 즉, 모든 응용 프로그램 GET /metrics이 Prometheus 인스턴스에서 주기적으로 가져올 수 있는 끝점 을 노출해야 합니다.

프로 메테우스에는 네 가지 메트릭 유형이 있습니다.

  • 카운터 : 한 번만 올라간 단일 숫자 값을 나타내는 누적 측정 항목
  • 게이지 : 임의로 위아래로 이동할 수있는 단일 숫자 값을 나타냅니다.
  • 히스토그램 : 관측치를 샘플링하고 구성 가능한 버킷에서 카운트합니다.
  • 요약 : 히스토그램과 유사하게, 샘플 관측치, 슬라이딩 시간 창에 걸쳐 구성 가능한 분 수를 계산합니다

다음 스니 j에서는 /metrics엔드 포인트에 대한 예제 응답을 볼 수 있습니다 여기에는 카운터 (nodejs_heap_space_size_total_bytes) 및 막대 그래프 (http_request_duration_ms_bucket) 유형의 측정 항목이 포함됩니다.

# HELP nodejs_heap_space_size_total_bytes Process heap space size total from node.js in bytes.
# TYPE nodejs_heap_space_size_total_bytes gauge
nodejs_heap_space_size_total_bytes{space="new"} 1048576 1497945862862
nodejs_heap_space_size_total_bytes{space="old"} 9818112 1497945862862
nodejs_heap_space_size_total_bytes{space="code"} 3784704 1497945862862
nodejs_heap_space_size_total_bytes{space="map"} 1069056 1497945862862
nodejs_heap_space_size_total_bytes{space="large_object"} 0 1497945862862

# HELP http_request_duration_ms Duration of HTTP requests in ms
# TYPE http_request_duration_ms histogram
http_request_duration_ms_bucket{le="10",code="200",route="/",method="GET"} 58
http_request_duration_ms_bucket{le="100",code="200",route="/",method="GET"} 1476
http_request_duration_ms_bucket{le="250",code="200",route="/",method="GET"} 3001
http_request_duration_ms_bucket{le="500",code="200",route="/",method="GET"} 3001
http_request_duration_ms_bucket{le="+Inf",code="200",route="/",method="GET"} 3001

Prometheus는 Pushgateway 라는 대안을 제공하여 방화벽 뒤에 있거나 수명이 짧은 작업으로 인해 폐기 할 수없는 구성 요소를 모니터링합니다.

작업이 종료되기 전에 메트릭을이 게이트웨이로 푸시 할 수 있으며 Prometheus는 나중에이 게이트웨이의 메트릭을 스크래핑 할 수 있습니다.

응용 프로그램에서 주기적으로 메트릭을 수집하도록 Prometheus를 설정하려면 다음 예제 구성을 확인하십시오 .

Node.js 응용 프로그램 모니터링

우리가 Node.js 애플리케이션을 Prometheus로 모니터링하고 싶다면 다음과 같은 문제를 해결해야합니다.

  • 계측 : 성능 오버 헤드를 최소화하면서 코드를 안전하게 계측
  • 메트릭 설명 : HTTP 끝점을 사용하여 Prometheus에 대한 메트릭 노출
  • Prometheus 호스팅 : 잘 구성된 Prometheus 실행
  • 추출 값 : 통계적으로 정확한 쿼리 작성
  • 시각화 : 대시 보드 작성 및 쿼리 시각화
  • 알림 : 효율적인 알림 설정
  • 페이징 : 페이징에 대한 에스컬레이션 정책 적용으로 알림 알림 받기

Node.js 측정 항목 내보내기

Node.js 애플리케이션에서 메트릭을 수집하고이를 Prometheus에 공개하려면 prom-client npm 라이브러리를 사용할 수 있습니다 .

다음 예에서는 경로 당 API의 응답 시간을 수집하기 위해 메트릭의 히스토그램 유형을 작성합니다. 사전 정의 된 버킷 크기와 경로 레이블을 살펴보십시오.

// Init
const Prometheus = require('prom-client')
const httpRequestDurationMicroseconds = new Prometheus.Histogram({
  name: 'http_request_duration_ms',
  help: 'Duration of HTTP requests in ms',
  labelNames: ['route'],
  // buckets for response time from 0.1ms to 500ms
  buckets: [0.10, 5, 15, 50, 100, 200, 300, 400, 500]
})

각 요청 후 응답 시간을 수집하여 경로 레이블과 함께보고해야합니다.

// After each response
httpRequestDurationMicroseconds
  .labels(req.route.path)
  .observe(responseTimeInMs)

GET /metricsPrometheus에 적합한 형식으로 메트릭을 표시 할 엔드 포인트 경로를 등록 할 수 있습니다 .

// Metrics endpoint
app.get('/metrics', (req, res) => {
  res.set('Content-Type', Prometheus.register.contentType)
  res.end(Prometheus.register.metrics())
})

검색어

우리가 우리의 통계를 수집 한 후에, 우리는 시각적으로 그들로부터 어떤 가치를 추출하고자합니다.

Prometheus는 사용자가 실시간으로 시계열 데이터를 선택하고 집계 할 수있는 기능적 표현 언어를 제공합니다.

Prometheus 대시 보드에는 쿼리 및 시각화 도구가 내장되어 있습니다.

프로 메테우스 시계열 데이터 그래프
프로 메테우스 대시 보드

응답 시간 및 메모리 사용에 대한 몇 가지 예제 쿼리를 살펴 보겠습니다.

쿼리 : 95 번째 응답 시간

히스토그램 메트릭에서 응답 시간의 95 백분위 수를 결정할 수 있습니다. 95 백분위 수의 응답 시간으로 피크를 필터링 할 수 있으며 일반적으로 평균 사용자 경험을 더 잘 이해할 수 있습니다.

histogram_quantile(0.95, sum(rate(http_request_duration_ms_bucket[1m])) by (le, service, route, method))

쿼리 : 평균 응답 시간

프로 메테우스의 히스토그램 유형은 관찰 된 메트릭에 대한 카운트 및 합계 값을 수집하기 때문에 우리는이를 애플리케이션으로 나누어 평균 응답 시간을 얻을 수 있습니다.

avg(rate(http_request_duration_ms_sum[1m]) / rate(http_request_duration_ms_count[1m])) by (service, route, method, code)

오류율 및 Apdex 점수와 같은 고급 쿼리의 경우 Node.js 예제 저장소가있는 Prometheus를 확인하십시오 .

경고

Prometheus에는 쿼리를 사용하여 기대치를 정의 할 수있는 내장 된 경고 기능이 함께 제공되지만 Prometheus 경고에는 알림 시스템이 제공되지 않습니다. 하나를 설정하려면 경고 관리자 또는 다른 외부 프로세스 를 사용해야합니다 .

애플리케이션의 중간 응답 시간에 대한 경고를 설정하는 방법의 예를 살펴 보겠습니다. 이 경우 중간 응답 시간이 100ms를 초과하면 경고를 발령합니다.

# APIHighMedianResponseTime
ALERT APIHighMedianResponseTime
  IF histogram_quantile(0.5, sum(rate(http_request_duration_ms_bucket[1m])) by (le, service, route, method)) > 100
  FOR 60s
  ANNOTATIONS {
    summary = "High median response time on {{ $labels.service }} and {{ $labels.method }} {{ $labels.route }}",
    description = "{{ $labels.service }}, {{ $labels.method }} {{ $labels.route }} has a median response time above 100ms (current value: {{ $value }}ms)",
  }

프로 메테우스 경고
보류 상태의 Prometheus 활성 경고

Kubernetes 통합

Prometheus는 Kubernetes 통합 기능을 내장하고 있습니다. 노드, 서비스 및 포드와 같은 Kubernetes 리소스를 검색하면서 메트릭을 긁어 낼 수 있습니다.

컨테이너 시스템에서 매우 강력한 기능입니다. 인스턴스가 태어나고 항상 사라집니다. 이와 같은 유스 케이스를 사용하면 수동 구성을 통해 HTTP 엔드 포인트 기반의 스크래핑을 달성하기가 어려울 수 있습니다.

또한 Kubernetes와 Helm 과 함께 Prometheus를 쉽게 제공 할 수 있습니다 그것은 단지 두 단계 만 필요합니다. 우선 Kuvernnetes 클러스터가 필요합니다.

으로 푸른 컨테이너 서비스는 호스트는 Kubernetes를 제공, 나는 제공을 신속하게 할 수 있습니다

# Provision a new Kubernetes cluster
az acs create -n myClusterName -d myDNSPrefix -g myResourceGroup --generate-ssh-keys --orchestrator-type kubernetes

# Configure kubectl with the new cluster
az acs kubernetes get-credentials --resource-group=myResourceGroup --name=myClusterName

몇 분 후에 Kubernetes 클러스터가 준비되면 Helm을 초기화하고 Prometheus를 설치할 수 있습니다.

helm init
helm install stable/prometheus

Kubernetes와 Prometheus 프로비저닝에 대한 자세한 내용은 Prometheus Helm 차트를 확인하십시오 .

그라 파나

보시다시피 Prometheus의 내장 시각화 방법은 쿼리 출력을 검사하는 데 적합하지만 대시 보드 용으로 사용할 수는 없습니다.

Prometheus에는 쿼리를 실행하고 데이터를 가져 오는 API가 있으므로 많은 외부 솔루션을 사용하여 대시 보드를 만들 수 있습니다. 내가 가장 좋아하는  은 그라 파나 (Grafana) 다 .

Grafana는 오픈 소스, 플러그 형 시각화 플랫폼 입니다. 다양한 유형의 시스템에서 메트릭을 처리 할 수 ​​있으며 Prometheus 데이터 소스가 내장되어 있습니다.

Grafana에서는 기존 대시 보드를 가져 오거나 자신을 만들 수 있습니다.

Node.js 모니터링을위한 Grafana가있는 대시 보드
Grafana가있는 대시 보드 - 고해상도 클릭

결론

Prometheus는 응용 프로그램을 모니터링하는 강력한 오픈 소스 도구이지만 볼 수 있듯이이 도구는 기본적으로 작동하지 않습니다.

Prometheus를 사용하면 응용 프로그램을 계측하고 데이터를 관찰 한 다음 메트릭을 쿼리하고 시각화 할 수있는 전문 지식 이 필요 합니다.

Node.js 애플리케이션을 디버깅하고 모니터링하기위한 간단하면서도 강력한 툴을 찾고있는 경우 Trace 라는 솔루션을 확인

아래의 예제 저장소를 찾을 수 있습니다.이 예제 저장소를 사용하면 Node.js 응용 프로그램을 모니터링하는 방법을 선택할 때 더 자세한 조언을 얻을 수 있습니다.