mingming

promehteus 메트릭 수집 본문

kubernetes

promehteus 메트릭 수집

mingming_96 2023. 9. 18. 23:07

Service Discovery

 

서비스 간 통신과 검색을 단순화하고 자동화하는 기술 또는 접근 방식을 나타냅니다. 서비스 디스커버리는 애플리케이션의 확장성, 안정성, 유지 보수성을 개선하는데 도움이 됩니다.

프로메테우스는 서비스 디스커버리 기능을 내장하고 있어 프로메테우스 서버가 동적으로 타깃 서비스를 찾고 모니터링 할수 있습니다. 

 

동작 순서 

1. 프로메테우스 서버는 컨피그맵에 기록된 내용을 바탕으로 대상을 읽어옵니다. 

2. 읽어온 대상에 대한 메트릭을 가져오기 위해 API 서버에 정보를 요청합니다.

3. 요청을 통해 알아온 경로로 메트릭 데이터를 수집합니다.  

 

cAdvisor

cAdvisor는 "Container Advisor"의 약어로, 컨테이너 환경에서 동작하는 애플리케이션을 모니터링하고 성능 통계를 수집하는 도구입니다. Google에서 개발된 오픈 소스 프로젝트로, Docker 및 Kubernetes와 같은 컨테이너 오케스트레이션 플랫폼과 통합하여 컨테이너 환경에서 애플리케이션의 리소스 사용, 성능, 상태 등을 실시간으로 관찰하고 기록합니다. 

cAdvisor는 Kublete 바이너리의 일부로 Kubelet과 긴밀히 결합되며, 다음과 같은 기능을 가집니다. 

 

1. 리소스 사용량 모니터링 

 

2. 성능 통계 수집 

 

3. RESTful API 제공 

 

4. 다양한 컨테이너 런타임 제공 

 

PromQL ( Prometheus Query Language )

메트릭 타입

 

카운터 ( Counter )

  누적된 값을 표현하는데 사용하는 메트릭 타입 , 카운터에 누적된 값으로 구간별로 변화율을 파악해 해당 값이 어떤 추세로 증가하는지 알 수 있습니다. 때문에 이벤트나 오류 등이 급증하는 구간을 파악하기 용이합니다. 그러나 누적된 값을 표현하기 때문에 특정 순간의 데이터를 표현하는데 적합하지 않습니다. 카운터 타입은 값보다는 변화율을 주로 확인하는데 사용됩니다.

 

게이지 ( Guage )

  특정 시점의 값을 표현하는데 사용하는 메트릭 타입, 카운터가 누적된 값을 표현해 증가만을 고려하는 것과 달리 게이지는 시점별로 증가나 감소를 모두 표현할 수 있습니다. 현재 서버의 메모리 사용량, CPU 사용률 , 디스크 공간 등의 정보를 게이지 타입의 메트릭으로 조회할 수 있습니다.

 

히스토그램 ( Histogram )

  사전에 미리 정한 구간 안에 있는 메트릭 값의 빈도를 측정합니다. 이때 익스포터를 구현하는 단계에서 정의한 구간을 버킷이라고 합니다. 관찰된 값들의 분포를 표현하기 위한 메트릭 유형으로, 구간으로 나누어 분포를 기록하고, 주로 대기 시간, 요청 처리 시간과 같은 지표에 사용됩니다. 

 

서머리 ( Summary )

  히스토그램과 비슷하게 구간 내에 있는 메트릭 값의 빈도를 측정합니다. 예로 들어 클라이언트 요청에 따른 응답 시간을 관측하고 저장할 때 사용할 수 있습니다. 

 

메트릭 레이블

  모든 메트릭 데이터는 하나 이상의 레이블을 가지는데, 메트릭 데이터의 다양한 내용을 표현하는 방법입니다.

key - value 형태로 사용하며, 원하는 레이블을 검색하고 선택적으로 추출할 수 있습니다. 

up{job="prometheus"} 
up{job="kubenernetes-nodes"}

 

메트릭 레이블 매처 

  메트릭 레이블에 조건을 줘서 검색하는 방법을 레이블 매처라고 합니다. 총 네가지 조건 기호를 사용합니다.

' = ' : 조건에 넣은 값과 레이블 값이 같은 메트릭을 보여줍니다.

' != ' : 조건에 넣은 값과 레이블 값이 다른 메트릭을 보여줍니다. 

' =~ ' : 조건에 넣은 정규 표현식에 해당하는 메트릭을 보여줍니다. 

' !~ ' : 조건에 넣은 정규 표현식에 해당하지 않는 메트릭을 보여줍니다.

 

연산자

 

비교 연산자 : 비교 대상이 숫자이므로 크기를 구분하는 조건들이 있습니다 ( == , != , > , < , >= , <= )

논리 연산자 : 수집된 메트릭에서 보고 싶은 범위를 지정하는 and , or , unless 연산자가 있습니다 .

산술 연산자 : 사칙연산 ( +, - , *, / ) 나머지 (%), 지수 (^) 같은 연산자가 있습니다. 

집계 연산자 : 평균(avg), 합계(sum), 계수(count) 와 같이 수집된 메트릭을 종합하고 분석하는 연산자 입니다.

 

PromQL 데이터 타입

레인지 벡터 

  특정 시간 범위 내의 메트릭 데이터를 쿼리하는데 사용됩니다. 

 

인스턴트 벡터

  특정 시간 지점에서 측정된 메트릭 데이터를 나타내는 벡터 데이터 타입입니다.

 

스칼라 타입

  숫지형 : 정수 및 부동 소수점 숫자 

  불리언(Boolean) : 참 또는 거짓 값을 가지며 주로 조건식의 결과를 나타냅니다.

 

스트링 타입 

  문자형 : 텍스트 데이터를 나타냅니다. 텍스트 데이터, 레이블 값, 서비스 이름 등의 정보를 저장합니다.

 

PromQL 함수 

종류 용도 함수
연산 함수 수학 연산에 사용 abs(절대값), ceil(올림), floor(내림)
round(반올림), predict_linear(예측값) 
변환 함수 데이터 타입 간 변환에 사용 scalar(스칼라로 변환), vector(벡터로 변환) , rate(변화율),
irate(순간 변화율)
집계 함수 수집된 레인지 벡터의 데이터 집계를 위해 사용 avg_over_time(평균), sum_over_time(합계),
count_over_time(계수) 

 

변화율을 나타내는 rate

  rate 함수는 수집한 값들의 변화율을 구할 때 사용됩니다. 주로 값이 증가하는 카운터 형식의 메트릭에 사용되며, 지정된 구간이 얼마나 빠르게 변화했는지 알기위한 지표로 사용됩니다.

rate(node_cpu_seconds_total{mode="idle",node="master"}[5m])

 

프로메테우스에서 제공하는 그래프의 단점 

  1. 변화율 값을 정확하게 표시하지 못합니다.

  2. 제한이 많은 꺾은선 그래프로 표시돼 추이 변화를 파악하기 어렵습니다.

  3. 하나의 패널로 구성돼 여러 가지의 PromQL 쿼리를 비교할 수 없습니다.  

 

순간 변화율을 나타내는 irate

  rate 함수는 구간 시작 값과 구간 종료 값의 차이에 대한 변화율을 다루고, irate는 구간 종료 바로 전 값과 구간 종료 값의 차이에 대한 변화율을 나타냅니다.  

irate(node_cpu_seconds_total{mode="idle",node="master"}[5m])

 

추세를 보여주는 predict_linear

  레인지 벡터로 수집된 과거 메트릭 데이터를 기반으로 앞으로 생성될 메트릭 값을 예측합니다. 

predict_linear(node_memory_MemAvailable_bytes{kubernetes_node="worker"}[5m],60*60*1)

1시간 후의 메모리 사용량 예측

서머리

  앞서 이야기 한 것처럼 서머리는 구간 내에 특정 메트릭 값이 나타나는 빈도를 알려줍니다. 서머리는 익스포터에서 이미 만들어진 값을 보여줍니다. quantile(분위수)의 값에 매핑되는 메트릭값을 확인해 줍니다.

prometheus_target_interval_length_seconds

 

히스토그램

  서머리와 유사하게 메트릭 값의 빈도를 보여주지만 요청을 받으면 직접 계산해 보여줍니다.

historam_quantile(0.99,sum(rate(apiserver_request_duration_seconds_bucket[5m]))by(le))

히스토그램 타입으로 검색된 99백분위수 메트릭 값

apiserver_request_duration_seconds_bucket : API 서버의 응답시간 , metric type : counter

여기서 rate 함수를 사용한 이유는 메트릭 값을 변화율로 바꾸려는 것이 아닌 히스토그램에서 관측하는 범위를 지정하기 위해서 입니다.   NaN은 버킷으로 검출된 값이 없을 때 표시되는 값입니다.

 

히스토그램 연산자 추가하기 

sum 연산자를 추가해 API 서버로부터 가장 느리게 응답받은 시간을 출력할 수 있습니다.

여기선 le( Less Than or Equal To ) 라는 값을 사용했는데 le 레이블로 구분하지 않으면 검색되는 모든 값이 합쳐져 histogram_quantile 함수에서 백분위수로 값을 산정할 수 없습니다.

le 값은 개발자가 미리 정해 둔 버킷의 기준값 입니다.

histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket[5m])) by(le))

le 연산자

lePromQL(Prometheus Query Language)에서 사용되는 용어로, 데이터를 필터링하거나 쿼리 결과를 조작하는 데 사용되는 연산자 중 하나입니다. le는 "Less than or Equal to"약어로, 주어진 값을 기준으로 작거나 같은 값들을 선택합니다.

 

사용 사례 1: 작거나 같은 값 필터링

le 연산자를 사용하여 특정 값보다 작거나 같은 메트릭 데이터를 선택할 수 있습니다.

예를 들어, CPU 사용률이 80% 이하인 모든 서버를 선택하려면 다음과 같이 쿼리할 수 있습니다:

cpu_usage{instance=~".*"} <= 0.8

{instance=~".*"}는 모든 인스턴스를 대상으로 하며, <= 0.8은 CPU 사용률이 0.8이하인 데이터 포인트를 선택합니다.

 

사용 사례 2: 레이블 필터링

le 연산자는 레이블 필터링에도 사용될 수 있습니다. 특정 레이블 값과 비교하여 작거나 같은 항목을 선택할 수 있습니다.

예를 들어, 특정 작업의 지연 시간이 100ms 이하인 데이터를 선택하려면 다음과 같이 쿼리할 수 있습니다

http_request_duration_seconds{job="my_job", le="0.1"}

이 경우, le="0.1"은 100ms(0.1초) 이하의 데이터를 선택합니다.

 

사용 사례 3: 요약 데이터 생성

  le 연산자를 사용하여 메트릭 데이터를 요약하거나 히스토그램 데이터의 버킷을 정의하는 데에도 사용됩니다. 이것은 통계 및 분석을 위한 데이터 집계에 유용합니다.

 

사용 사례 4: 범위 지정 쿼리

  le 연산자는 범위 지정 쿼리에서도 사용됩니다. 특정 시간 범위 내에서 작거나 같은 값을 검색할 때 유용합니다.

'kubernetes' 카테고리의 다른 글

ephemeral-storage  (0) 2023.09.21
grafana on kubernetes  (1) 2023.09.20
Prometheus on kubernetes  (0) 2023.09.18
Kubernetes Monitoring 시스템 ( Prometheus & Grafana )  (0) 2023.09.17
kubernetes controller - CronJob  (0) 2023.09.05