안녕하세요! 오늘은 프로메테우스(Prometheus)를 사용하면서 마주칠 수 있는 흥미로운 설정, 바로 honor_labels에 대해 깊이 있게 알아보려고 합니다.
프로메테우스로 메트릭을 수집하다 보면 "어? 내가 설정한 레이블이 왜 바뀌었지?" 혹은 "원하던 레이블이 사라졌어요!" 하는 경험을 하실 수 있는데요. 그 비밀의 열쇠가 바로 honor_labels에 있을 가능성이 높습니다! 🔑

💥 라벨 충돌, 대체 무슨 일이죠?
프로메테우스는 메트릭을 수집(scrape)할 때, 해당 메트릭에 대한 유용한 정보를 담기 위해 자동으로 몇 가지 레이블을 추가합니다. 가장 대표적인 것이 바로 job과 instance 레이블이죠.
- job: 어떤 수집 작업(job)에 속하는지를 나타냅니다.
- instance: 어떤 대상(target)에서 수집되었는지를 나타냅니다.
그런데 여기서 문제가 발생할 수 있습니다. 만약 우리가 수집하려는 대상(target)의 메트릭에 이미 job이나 instance라는 이름의 레이블이 존재한다면 어떻게 될까요? 🧐
예를 들어, 수집 대상이 my_metric{job="my-app-exporter"} 와 같은 메트릭을 노출하고 있고, 프로메테우스 설정에서는 이 대상을 job_name: 'api-server'로 수집한다면 job이라는 레이블 이름이 충돌하게 됩니다.
이때 프로메테우스가 어떤 레이블을 선택할지 결정하는 옵션이 바로 honor_labels 입니다.
🤔 honor_labels: false (기본값) - 프로메테우스의 방식
이 설정은 honor_labels의 기본값입니다. 말 그대로 수집 대상의 레이블을 "존중하지 않겠다(false)"는 의미로, 프로메테우스가 자동으로 붙이는 레이블이 우선순위를 가집니다.
- 동작 방식:
- 프로메테우스는 자신이 설정한 job, instance 레이블을 그대로 사용합니다. 🛡️
- 수집 대상에 있던 기존의 충돌하는 레이블(예: job)은 이름이 변경됩니다.
- 이름 앞에 exported_ 라는 접두사가 붙어 exported_job 과 같이 바뀝니다. 🏷️
- 예시:
- 수집 대상 메트릭: http_requests_total{job="frontend"}
- 프로메테우스 설정: job_name: 'web-crawlers'
- 최종 수집 결과: http_requests_total{job="web-crawlers", exported_job="frontend", ...}
결과적으로, 프로메테우스의 job 레이블이 우선 적용되고, 원래 대상이 가지고 있던 job 레이블은 exported_job으로 이름이 바뀌어 보존됩니다.
👑 honor_labels: true - 수집 대상의 라벨을 존중!
이 설정을 true로 바꾸면, 프로메테우스는 정반대로 동작합니다. "수집 대상의 레이블을 존중하겠다(true)"는 의미로, 수집 대상이 제공하는 레이블을 그대로 사용합니다.
- 동작 방식:
- 수집 대상의 메트릭에 있는 레이블을 최우선으로 존중합니다. 🙏
- 만약 프로메테우스가 추가하려는 레이블과 이름이 겹치면, 프로메테우스는 자신의 레이블 추가를 조용히 포기합니다.
- 수집 대상의 레이블이 아무런 변경 없이 그대로 저장됩니다.
- 예시:
- 수집 대상 메트릭: http_requests_total{job="frontend"}
- 프로메테우스 설정: job_name: 'web-crawlers' 와 honor_labels: true
- 최종 수집 결과: http_requests_total{job="frontend", ...}
보시다시피, 프로메테우스의 job_name 설정값인 web-crawlers는 무시되고, 수집 대상이 원래 가지고 있던 job="frontend"가 그대로 유지되었습니다.
💡 언제 honor_labels: true를 사용해야 할까요?
그렇다면 이 옵션은 언제 유용할까요? 주로 다음과 같은 상황에서 빛을 발합니다.
- Federation 구성 시: 다른 프로메테우스 서버의 /federate 엔드포인트를 수집할 때 사용합니다. 원본 프로메테우스가 이미 의미 있는 job, instance 레이블을 가지고 있으므로, 이를 그대로 가져와야 할 때 필수적입니다.
- Pushgateway 사용 시: Pushgateway는 자체적으로 job, instance 레이블을 관리하므로, 해당 레이블을 덮어쓰지 않고 그대로 사용하고 싶을 때 유용합니다.
- 서비스 디스커버리 활용 시: 쿠버네티스와 같은 환경에서 서비스 디스커버리를 통해 얻은 메타데이터 레이블이 프로메테우스의 job 이름보다 더 중요한 의미를 가질 때, 해당 레이블을 job으로 사용하고 싶을 경우 활용할 수 있습니다.
📝 한눈에 정리하기
| 설정 | honor_labels: false (기본값) | honor_labels: true |
| 우선순위 | 프로메테우스의 자동 추가 레이블 👑 | 수집 대상(Target)의 기존 레이블 👑 |
| 충돌 시 동작 | 대상의 레이블 이름 앞에 exported_ 추가 | 프로메테우스의 레이블을 버림 |
| 결과 job 레이블 | 프로메테우스 설정값 (job_name) | 수집 대상의 원래 job 레이블 값 |
| 주요 사용처 | 대부분의 일반적인 스크랩 환경 | Federation, Pushgateway, 고급 서비스 디스커버리 |
honor_labels는 프로메테우스의 레이블링 전략을 섬세하게 제어할 수 있는 강력한 도구입니다. 이 옵션을 잘 이해하고 활용하여 더욱 깔끔하고 의미 있는 메트릭을 관리해 보세요!🚀
'클라우드 > prometheus' 카테고리의 다른 글
| 📈 당신의 모니터링 시스템을 위협하는 보이지 않는 적, '카디널리티' (0) | 2025.10.13 |
|---|---|
| ☁️ 클라우드 네이티브의 심장, CNCF가 꿈꾸는 상생의 생태계 (0) | 2025.10.13 |
| 프로메테우스(Prometheus) on() vs ignoring(): 벡터 매칭의 두 얼굴 🎭 (0) | 2025.10.12 |
| 🚀 골든 쿠버스트로넛을 향한 여정 (6/15): PCA 합격, 모니터링의 신세계를 맛보다! (feat. PromQL과의 사투) (0) | 2025.10.12 |
| 📊 히스토그램 vs 서머리: 당신의 선택은? 서버냐 클라이언트냐, 그것이 문제로다! (0) | 2025.10.11 |