🌥️Cloud Study🌥️/Etc

[ 모니터링 ] Prometheus Federation 설정 -2

L_Chae 2024. 8. 19. 09:25

인스턴스 별 라벨처리

Instance Label : Prometheus의 기본적인 라벨로, 보통 모니터링 하려는 주소가 들어간다(예시: `localhost:8080`)
= 특정 인스턴스를 구분하는 데 사용된다.

 

Federation에서 상위 Prometheus가 하위 Prometheus로부터 데이터를 가져올 때,
하위 Prometheus가 자신의 대상 인스턴스를 `localhost`로 수집한 경우, 이 `instance` 라벨 값이 상위로 그대로 전달되어 데이터가 `localhost`로 통일될 수 있다.


이는 하위 Prometheus가 실제 대상 서버가 아닌, 자신을 기준으로 데이터를 수집한 결과이기 때문에 발생하는 것으로,

문제 해결을 위해 `external_labels` 또는 `relabel_configs`를 사용한다.

 

위 이미지를 예시로, Federation에 따라 `instance`Label의 값이 `localhost:8080`으로 통일된 경우, 추가 Label(`app_name`, `instance_id`)을 사용해야 각 인스턴스 별 Metric 쿼리가 가능하다.


External Labels

Federation과 같은 대규모 모니터링 쿼리 플랜에서 데이터 소스를 구분하기 위해
하위 Prometheus에서 상위 Prometheus로 데이터를 보낼 때 설정하는 추가 라벨로, 주로 데이터의 출처(ex: 데이터센터, 클러스터, 지역)를 구분하기 위해 사용된다. 

 

+ 상위 Prometheus는 데이터를 구분할 때 `instance`라벨보다는 `external_labels`에 설정된 값에 더 의존하는 경향이 있다

`/etc/prometheus/prometheus.yml`파일을 수정해주자.

# /etc/prometheus/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

  external_labels:
    monitor: 'application01'

설정 파일을 수정한 다음에는 `sudo systemctl restart prometheus`로 Prometheus 서버를 재시작해주자.

이렇게 external_labels를 추가해주면, 같은 instance 라벨로 잡힌 인스턴스 지표도 구분되어 표현할 수 있게 된다.


Relabel Configs

Relabeling은 Prometheus에서 매트릭을 수집할 때, 매트릭의 라벨을 동적으로 수정하거나 추가하는 방법이다.

이를 통해 특정 라벨의 값을 변경하거나 새로운 라벨을 추가함으로써, 상위 Prometheus로 전송될 때 매트릭의 구성을 조정할 수 있다.

 

`relabel_configs`를 사용하여 `instance`라벨을 수정할 수 있고, 
하위 Prometheus에서 수집한 매트릭의 `instance`라벨이 `localhost:8080`으로 설정되어 있을 경우,
상위 Prometheus로 전송되기 전에 이를 특정한 값으로 변경할 수 있다.

# /etc/prometheus/prometheus.yml

scrape_configs:
  - job_name: 'spring_app'
    static_configs:
      - targets: ['localhost:8080']

    relabel_configs:
      - source_labels: [__your_specific_source_address__]
        target_label: instance
        replacement: 'spring_app_instance'

위 코드에서는 `localhost:8080`으로 설정된 `instance`라벨이 `spring_app_instance`로 변경된다. 


`honor_labels`와 `relabel_configs` 설정의 상호작용

honor_labels

`honor_labels: true` : Prometheus가 타겟에서 수집한 매트릭의 기본 라벨을 "우선"하게 한다.
타겟에서 이미 설정된 라벨 값이 있을 경우, 상위 Prometheus에서 이 값을 덮어쓰지 않고 그대로 유지한다.

ex) 하위 Prometheus에서 `instance`라벨이 `localhost:8080`으로 설정되어 있다면 상위 Prometheus는 이를 그대로 유지한다.

 

relabel_configs

`relabel_configs` : 수집한 매트릭의 라벨을 변경하거나 추가, 삭제할 수 있는 규칙을 정의한다.
새로운 라벨을 추가하거나 기존 라벨을 덮어쓸 수 있다.

 

 

두 설정의 상호작용

`honor_labels`가 true로 설정되어 있는 경우, 원칙적으로는 하위 Prometheus에서 이미 설정된 라벨(ex: instance)을 상위 Prometheus가 변경하지 않도록 해야 한다.

 

하지만 `relabel_configs`는 이 라벨을 덮어쓰는 기능을 가지고 있어서 `relabel_configs`가 특정 라벨을 덮어쓰도록 설정되어 있다면,
그 라벨에 대해서는 `honor_labels`설정이 무시될 수 있다.
= `relabel_configs` 라벨이 명시적으로 정의된 경우 `honor_labes`보다 우선된다.

 

예시

honor_labels: true

relabel_configs:
  - source_labels: [__address__]
    target_label: instance
    replacement: 'new-instance-name'

 

`honor_labels: true`로 인해 원래라면 하위 Prometheus에서 설정된 `instance` 라벨이 존중되어야 한다.

그러나 `relabel_configs`에서 `instance` 라벨을 `new-instance-name`으로 덮어쓰도록 설정되어 있으므로,
이 규칙이 우선되어 `instance` 라벨이 `new-instance-name`으로 변경된다.

 

결론

  • `external_labels` 는 계층화된 모니터링 구조에서 상위 구조에 보여줄 식별자가 된다.
  • `honor_labels`는 기본적으로 타겟에서 수집된 라벨을 유지하려고 한다.
  • `relabel_configs`는 명시적으로 정의된 경우, 이 라벨을 수정하거나 덮어쓸 수 있다.