Alert Manager

모니터링 시스템이니, 문제가 발생하면 이를 알람으로 보내주는 역할도 있어야한다. Alertmanager는 Prometheus에서 문제가 발생했다고 생각되는 시점에 slack, hipchat 등을 통해 알람을 보내준다.

알람을 거는 기준은 Rule을 작성해서 load시키는 방식으로 동작하는데

expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5

와 같이 expression을 작성하는 것으로 알람을 전송할 수 있다. 특정 메트릭의 값이 어느정도 선(threshold)을 넘는다거나, 낮아진다거나 하는 메트릭을 보고 판단을 할 수 있다.

다만, 이 또한 Grafana를 사용하게 된다면 Grafana에서도 동일하게 알람매니저를 제공을 하고 있는데, 아무래도 Grafana쪽이 사용하기 더 쉽고 직관적이기 때문에 이걸 직접 사용할까는 싶지만, 그래도 expression을 이용해서 더 복잡한 조건을 걸어서 알람을 노티해주는 방식이 있다는건 좋다.

 

대시보드에서 무언가를 보기 위해서는 일단 prometheus.yml 의 내용을 보도록 하자

prometheus.yml

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

설정이 다른 모니터링 서비스들에 비해서는 매우 간단한 편이다. (모든 설정이 간편한건 아니다. default로 설정 되어있는 config가 간단해서 그렇지, 실제로 모든 config의 field를 보면 상당히 양이 많다. 자세한건 https://prometheus.io/docs/prometheus/latest/configuration/configuration/)

config 설명

  • global.scrape_interval : 몇 초 단위로 메트릭을 수집할 지를 결정(15초로 기본으로 되어 있는데, 이를 수정하여 1초단위로 수집을 할 지.. 10초 단위로 수집할지.. 1분 단위로 수집할지를 결정할 수 있다)
  • global.evaluation_interval : 이건 alerting rule을 어느 주기로 evaluate를 할 것인지에 대한 설정이다. evaluate를 하게되면 그 결과를 바탕으로 (inactive, pending, firing) 의 세 state로 구분이 되고 그 상태를 기반으로 alertmanager에서 알람을 발송할 지 안할지를 결정할 수 있다
    • alertmanager의 rule은 위에서 언급한대로 expression을 사용해서 설정을 할 수 있다
  • alerting : alertmanager의 target port를 지정할 수 있다. prometheus를 실행하면 alertmanager가 자동으로 같이 뜨는게 아니라, alertmanager를 download해서 같이 구동을 시켜줘야 한다
  • rule_files : expression으로 구성된 rule file의 path를 지정해준다. 복수개의 파일을 지정할 수 있다
  • scrape_config : 이부분이 중요하다.
    • job_name : 메트릭을 수집해서 구분을 할 네이밍을 지정
    • static_configs.targets : 실제 메트릭을 수집할 서버의 주소를 지정한다. 리스트로 구성이 되어 있으며 여러개의 호스트를 지정할 수 있다

 

alter manager 실행

> setproxy wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz

> tar -xzf alertmanager-0.21.0.linux-amd64.tar.gz

> cd alertmanager-0.21.0.linux-amd64

> ./alertmanager

웹 브라우저에서 http://prometheus-main.ay1.krane.9rum.cc:9093 로 접속하면 다음과 같은 화면을 볼 수 있다.

 

프로메테우스가 alter manager를 모니터링 하려면 prometheus.yml 파일에 Alertmanager configuration 항목을 추가 해야 한다.

> cd prometheus-2.2.1.linux-amd64/

> vi prometheus.yml

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093

'ETC DB' 카테고리의 다른 글

prometheus 실행  (0) 2021.07.22
prometheus TSDB format  (0) 2021.07.21
prometheus TSDB 관리 API  (0) 2021.07.21
prometheus disk storage  (0) 2021.07.21
prometheus 데이터 구조  (2) 2021.07.21

1. 프로메테우스 실행

> setproxy wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-amd64.tar.gz

> tar -xzf prometheus-2.2.1.linux-amd64.tar.gz

> cd prometheus-2.2.1.linux-amd64/

> vi prometheus.yml

prometheus.yml 파일에 scrape_configs 항목 추가

global:
scrape_interval: 10s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

> ./ prometheus

웹 브라우저에서 http://prometheus-main.ay1.krane.9rum.cc:9090 로 접속하면 다음과 같은 화면을 볼 수 있다.

 

2. 노드 익스포터 실행

> setproxy wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz

> tar -xzf node_exporter-1.0.1.linux-amd64.tar.gz

> cd node_exporter-1.0.1.linux-amd64/

> ./node_exporter

웹 브라우저에서 http://prometheus-main.ay1.krane.9rum.cc:9100 로 접속하면 다음과 같은 화면을 볼 수 있다.

 

프로메테우스가 노드 익스포터를 모니터링 하려면 prometheus.yml 파일에 scrape_configs 항목을 추가 해야 한다.

> cd prometheus-2.2.1.linux-amd64/

> vi prometheus.yml

- job_name: 'node'
static_configs:
- targets: ['localhost:9100']

 프로메테우스를 재시작 하고 target 페이지를 보면 다음과 같이 up 상태인 대상 2개를 확인 할 수 있다.

'ETC DB' 카테고리의 다른 글

prometheus Alert Manager  (0) 2021.07.22
prometheus TSDB format  (0) 2021.07.21
prometheus TSDB 관리 API  (0) 2021.07.21
prometheus disk storage  (0) 2021.07.21
prometheus 데이터 구조  (2) 2021.07.21

용어사전 :

chunk : 데이터가 저장되는 단위

tombstone : chunk 파일에서 데이터를 즉시 삭제하는 대신 삭제를 기록

WAL : 서버 재 시작이나 crash로 부터 보호를 위한 log

symbol : 시리즈의 레이블 쌍에서 발생한 중복 제거 된 문자열

1. Index Disk Format

다음 각 블록 디렉토리에 있는 index 파일의 형식을 설명합니다

인덱스가 작성 될 때, 위의 줄이 그어진 메인 섹션 사이에 임의의 수의 패딩 바이트가 추가 될 수 있습니다. 파일을 순차적으로 스캔 할 때 섹션의 지정된 길이 뒤에 오는 0 바이트는 건너 뛰어야합니다.

아래에 설명 된 대부분의 섹션은 len필드로 시작 합니다. 항상 후행 CRC32 체크섬 바로 앞의 바이트 수를 지정합니다. 체크섬은 항상 해당 len바이트에 대해 계산 됩니다.

 

1.1. Symbol Table

Symbol 테이블은 저장된 시리즈의 레이블 쌍에서 발생한 중복 제거 된 문자열의 정렬 된 목록을 보유합니다. 후속 섹션에서 참조 할 수 있으며 총 인덱스 크기를 크게 줄일 수 있습니다.

이 섹션에는 문자열 항목의 시퀀스가 포함되며 각 항목에는 원시 바이트의 문자열 길이가 접두사로 붙습니다. 모든 문자열은 utf-8로 인코딩됩니다. 문자열은 순차 인덱싱으로 참조됩니다. 문자열은 사전 순으로 오름차순으로 정렬됩니다.

1.2. Series

이 섹션에는 시리즈의 레이블 세트와 블록 내의 청크가 포함 된 시리즈의 시퀀스가 포함됩니다. 시리즈는 레이블 세트를 기준으로 사전 순으로 정렬됩니다.
각 시리즈 섹션은 16 바이트로 정렬됩니다. 시리즈의 ID는 offset/16 정의됩니다. 시리즈의 ID는 다른 곳에 참조되어 사용됩니다. 따라서 정렬 된 시리즈 ID 목록은 사전 순으로 정렬 된 시리즈 레이블 세트 목록을 의미합니다.

모든 시리즈 항목은 먼저 레이블 수를 보유하고 레이블 이름과 값을 포함하는 기호 테이블 참조의 튜플이 뒤 따릅니다. 레이블 쌍은 사전 순으로 정렬됩니다.
레이블 뒤에는 인덱싱 된 청크 수가 인코딩되고 그 뒤에 청크 최소 ( mint) 및 최대 ( maxt) 타임 스탬프와 chunk 파일에서의 해당 위치에 대한 참조가 포함 된 메타 데이터 항목 시퀀스가 이어집니다. mint는 첫 번째 샘플의 시간과 maxt는 chunk의 마지막 샘플의 시간입니다. 인덱스에 시간 범위 데이터를 보유하면 쿼리 된 시간 범위와 관련이 없는 chunk를 직접 액세스하지 않고도 삭제할 수 있습니다.

첫 chunk의 mint 저장되고, 델타로 maxt 저장되고, 후속 chunk 대해 이전 시간에 대한 델타로 mint와 maxt는 인코딩된다. 유사하게, 첫 번째 청크의 참조가 저장되고 다음 참조는 이전 참조에 대한 델타로 저장됩니다.

 

1.3. Label Index

레이블 인덱스 섹션은 하나 이상의 레이블 이름에 대한 기존 (결합 된) 값을 인덱싱합니다. #names 필드는 색인화 된 라벨 이름의 수를 결정하고,그 뒤에 #entries 필드의 총 항목 수가 표시됩니다. 본문은 기호 테이블 참조의 #entries / #names 튜플을 보유하며, 각 튜플은 #names 길이입니다. value 튜플은 사전 순으로 오름차순으로 정렬됩니다. 이는 더 이상 사용되지 않습니다.


예를 들어, 4 개의 다른 값을 가진 단일 라벨 이름은 다음과 같이 인코딩됩니다.

레이블 인덱스 섹션의 순서는 주어진 레이블 이름에 대한 각 레이블 인덱스 섹션의 시작을 가리키는 레이블 오프셋 항목을 포함 하는 레이블 오프셋 테이블에 의해 마무리됩니다 .

 

1.4. Postings

게시 섹션은 목록과 연관된 지정된 레이블 쌍을 포함하는 시리즈 참조의 단조 증가 목록을 저장합니다.

게시 섹션의 순서 는 지정된 레이블 쌍에 대한 각 게시 섹션의 시작을 가리키는 게시 오프셋 항목을 포함 하는 게시 오프셋 테이블에 의해 마무리됩니다 .

 

1.5. Label Offset Table

레이블 오프셋 테이블은 일련의 레이블 오프셋 항목을 저장합니다. 모든 레이블 오프셋 항목에는 레이블 색인 섹션의 값에 대한 레이블 이름과 오프셋이 있습니다. 레이블 인덱스 섹션을 추적하는 데 사용됩니다. 이것은 더 이상 사용되지 않습니다.

 

1.6. Postings Offset Table

posting 오프셋 테이블은 라벨 이름과 값별로 정렬 된 일련의 posting 오프셋 항목을 저장합니다. 모든 posting 오프셋 항목에는 레이블 이름 / 값 쌍과 posting 섹션의 시리즈 목록에 대한 오프셋이 있습니다. posting 섹션을 추적하는 데 사용됩니다. 인덱스 파일이 로드 될 때 부분적으로 메모리로 읽혀집니다.

 

1.7. TOC

전체 색인에 대한 진입 점 역할을하며 파일의 다양한 섹션을 가리 킵니다. 참조가 0이면 해당 섹션이 존재하지 않으며 조회시 빈 결과가 반환되어야 함을 나타냅니다.

 

2. Chunks Disk Format

chunks/ 디렉토리에 생성되는 chunk 파일의 형식을 설명합니다. 세그먼트 파일 당 최대 크기는 512MiB입니다.

파일의 chunk는 in-file offset(lower 4 bytes) 및 세그먼트 시퀀스 번호 (upper 4 bytes)로 구성된 uint64에 의해 인덱스에서 참조됩니다.

Chunk

 

3. Head Chunks on Disk Format

chunks_head/ 데이터 디렉터리 내의 디렉터리에 생성되는 chunk 파일의 형식을 설명합니다 .

파일의 chunk는 in-file offset(lower 4 bytes) 및 세그먼트 시퀀스 번호 (upper 4 bytes)로 구성된 uint64에 의해 인덱스에서 참조됩니다.

Chunk

온 디스크 블록의 chunk와 달리 여기에 chunk가 속한 시리즈 참조와 chunk의 최소/최대 값을 추가로 저장합니다. 이는 chunk와 관련된 인덱스가 없기 때문에 chunk를 재생하는 동안 이러한 메타 정보가 사용됩니다.

 

4. Tombstones Disk Format

다음은 블록의 최상위 디렉토리에있는 tombstones 파일의 형식을 설명합니다.

마지막 8 바이트는 Stones 섹션의 시작 오프셋을 지정합니다. 스톤 섹션은 빠른 스캔을 위해 4의 배수로 0을 붙입게 됩니다.

Tombstone

 

5. WAL Disk Format

미리 쓰기 로그는 번호가 매겨지고 순차적 인 세그먼트에서 작동합니다. 예를 들면 000000, 000001, 000002등, 그리고 기본적으로 128MB 제한된다. 세그먼트는 32KB 페이지에 기록됩니다. 가장 최근 세그먼트의 마지막 페이지만 부분적 일 수 있습니다. WAL 레코드는 현재 페이지의 나머지 공간을 초과 할 경우 하위 레코드로 분할되는 불투명 한 바이트 조각입니다. 레코드는 세그먼트 경계로 분할되지 않습니다. 단일 레코드가 기본 세그먼트 크기를 초과하면 더 큰 크기의 세그먼트가 생성됩니다. 페이지 인코딩은 LevelDB's/RocksDB's write ahead log에서 차용됩니다 .

레코드 조각이 다음과 같이 인코딩됩니다.

플래그의 상태는 다음과 같습니다.

0: 페이지는 비어 있습니다.
1: 단일 조각으로 인코딩 된 전체 레코드
2: 레코드의 첫 번째 조각
3: 레코드의 중간 부분
4: 레코드의 마지막 조각

5.1. Series records

시리즈 레코드는 시리즈와 고유 ID를 식별하는 레이블을 인코딩합니다.

5.2. Sample records

샘플 레코드는 샘플을 트리플 목록으로 인코딩합니다 (series_id, timestamp, value). 시리즈 참조 및 타임 스탬프는 첫 번째 샘플의 델타로 인코딩됩니다. 첫 번째 행에는 시작 ID와 시작 타임 스탬프가 저장됩니다. 첫 번째 샘플 레코드는 두 번째 행에서 시작됩니다.

5.3. Tombstone records

tombstone 레코드는 삭제 표시를 트리플 목록으로 인코딩 (series_id, min_time, max_time) 하고 시리즈 샘플이 삭제되는 간격을 지정합니다.

'ETC DB' 카테고리의 다른 글

prometheus Alert Manager  (0) 2021.07.22
prometheus 실행  (0) 2021.07.22
prometheus TSDB 관리 API  (0) 2021.07.21
prometheus disk storage  (0) 2021.07.21
prometheus 데이터 구조  (2) 2021.07.21

고급 사용자를 위해 데이터베이스 관리 기능을 하는 API입니다.
이 API는이 --web.enable-admin-api 설정되어 있지 않으면 사용할 수 없습니다.

 

1. snapshot

snapshot은 현재 모든 데이터의 snapshot을 TSDB의 데이터 디렉터리 아래 snapshots/<datetime>-<rand> 에 만들고 응답으로 디렉터리를 반환합니다.
헤드 블록에만 있고 아직 디스크에 압축되지 않은 스냅 샷 데이터를 선택적으로 건너 뜁니다.

POST /api/v1/admin/tsdb/snapshot
PUT /api/v1/admin/tsdb/snapshot

 

URL 쿼리 매개 변수 :

skip_head=<bool> : 헤드 블록에 있는 데이터를 건너 뜁니다. (옵션)

$ curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot
{
  "status": "success",
  "data": {
    "name": "20201014T211224Z-2be650b6d019eb54"
  }
}

이제 스냅 샷이 <data-dir>/snapshots/20201014T211224Z-2be650b6d019eb54 생성 되었습니다.

 

 

2. series 삭제

delete_series는 시간 범위에서 선택한 series에 대한 데이터를 삭제합니다.
실제 데이터는 여전히 디스크에 존재하며 향후 압축시 정리되거나 tombstones endpoint를 명시적으로 정리할 수 있습니다.

성공하면 204가 반환된다.

POST /api/v1/admin/tsdb/delete_series
PUT /api/v1/admin/tsdb/delete_series

 

URL 쿼리 매개 변수 :
match[]=<series_selector> : 삭제할 series를 선택하는 반복 라벨 매치 인수다. 하나 이상의 match[] 인수를 제공해야 합니다.
start=<rfc3339 | unix_timestamp> : 시작 타임 스탬프를. 선택 사항이며 가능한 최소 시간이 기본값 입니다.
end=<rfc3339 | unix_timestamp> : 종료 타임 스탬프. 선택 사항이며 기본값은 가능한 최대 시간 입니다.
시작 및 종료 시간을 모두 언급하지 않으면 데이터베이스에서 일치하는 시리즈의 모든 데이터가 지워 집니다.

$ curl -X POST -g 'http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]=up&match[]=process_start_time_seconds{job="prometheus"}'


$ curl -X POST -g 'http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]={__name__="up"}&start="2020-10-14T11:00:00Z"&end="2020-10-14T11:02:00Z"'
RFC 3339 Date Formats :
ISO8601을 인터넷 프로토콜로 어떻게 다룰 것인지를 규정한 RFC 입니다.
ISO8601과 거의 비슷하며, 약간의 차이만 있을 뿐입니다.
예를 들면, RFC 3339에서는 'T'의 생략을 허용하지 않고, 날짜와 시간 사이의 공백을 허용합니다.
대부분의 경우, 이 둘을 상세하게 분리해서 생각하지 않아도 됩니다.

 

 

3. clean tombstones

clean_tombstones는 디스크에서 삭제 된 데이터를 제거하고 기존 삭제 표시를 정리합니다.
시리즈를 삭제 한 후 공간을 확보하기 위해 사용할 수 있습니다.

성공하면 204가 반환 됩니다.

POST /api/v1/admin/tsdb/clean_tombstones
PUT /api/v1/admin/tsdb/clean_tombstones

 

매개 변수 나 본문이 필요하지 않습니다.

$ curl -XPOST http://localhost:9090/api/v1/admin/tsdb/clean_tombstones

 

4. TSDB 통계

Prometheus TSDB에 대한 다양한 카디널리티 통계를 반환 합니다.

GET /api/v1/status/tsdb


 - headStats : TSDB의 헤드 블록에 대한 데이터.
 - numSeries : 시리즈 수.
 - chunkCount : 청크 수.
 - minTime : 현재 최소 타임 스탬프 (밀리 초).
 - maxTime : 현재 최대 타임 스탬프 (밀리 초).
 - seriesCountByMetricName : 메트릭 이름 및 시리즈 수 목록.
 - labelValueCountByLabelName : 레이블 이름 및 값 개수 목록.
 - memoryInBytesByLabelName : 레이블 이름과 사용 된 메모리의 목록 (바이트 단위). 메모리 사용량은 지정된 레이블 이름에 대한 모든 값의 길이를 더하여 계산 됩니다.
 - seriesCountByLabelValuePair : 레이블 값 쌍 목록과 해당 시리즈 수를 제공.

$ curl http://localhost:9090/api/v1/status/tsdb
{
  "status": "success",
  "data": {
    "headStats": {
      "numSeries": 508,
      "chunkCount": 937,
      "minTime": 1591516800000,
      "maxTime": 1598896800143,
    },
    "seriesCountByMetricName": [
      {
        "name": "net_conntrack_dialer_conn_failed_total",
        "value": 20
      },
      {
        "name": "prometheus_http_request_duration_seconds_bucket",
        "value": 20
      }
    ],
    "labelValueCountByLabelName": [
      {
        "name": "__name__",
        "value": 211
      },
      {
        "name": "event",
        "value": 3
      }
    ],
    "memoryInBytesByLabelName": [
      {
        "name": "__name__",
        "value": 8266
      },
      {
        "name": "instance",
        "value": 28
      }
    ],
    "seriesCountByLabelValuePair": [
      {
        "name": "job=prometheus",
        "value": 425
      },
      {
        "name": "instance=localhost:9090",
        "value": 425
      }
    ]
  }
}

'ETC DB' 카테고리의 다른 글

prometheus 실행  (0) 2021.07.22
prometheus TSDB format  (0) 2021.07.21
prometheus disk storage  (0) 2021.07.21
prometheus 데이터 구조  (2) 2021.07.21
prometheus 개요  (0) 2021.07.21

+ Recent posts