본문 바로가기
클라우드/prometheus

✨ 프로메테우스의 숨은 보석, honor_labels 파헤치기

by gasbugs 2025. 10. 12.

안녕하세요! 오늘은 프로메테우스(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)"는 의미로, 프로메테우스가 자동으로 붙이는 레이블이 우선순위를 가집니다.

  • 동작 방식:
    1. 프로메테우스는 자신이 설정한 job, instance 레이블을 그대로 사용합니다. 🛡️
    2. 수집 대상에 있던 기존의 충돌하는 레이블(예: job)은 이름이 변경됩니다.
    3. 이름 앞에 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)"는 의미로, 수집 대상이 제공하는 레이블을 그대로 사용합니다.

  • 동작 방식:
    1. 수집 대상의 메트릭에 있는 레이블을 최우선으로 존중합니다. 🙏
    2. 만약 프로메테우스가 추가하려는 레이블과 이름이 겹치면, 프로메테우스는 자신의 레이블 추가를 조용히 포기합니다.
    3. 수집 대상의 레이블이 아무런 변경 없이 그대로 저장됩니다.
  • 예시:
    • 수집 대상 메트릭: 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를 사용해야 할까요?

그렇다면 이 옵션은 언제 유용할까요? 주로 다음과 같은 상황에서 빛을 발합니다.

  1. Federation 구성 시: 다른 프로메테우스 서버의 /federate 엔드포인트를 수집할 때 사용합니다. 원본 프로메테우스가 이미 의미 있는 job, instance 레이블을 가지고 있으므로, 이를 그대로 가져와야 할 때 필수적입니다.
  2. Pushgateway 사용 시: Pushgateway는 자체적으로 job, instance 레이블을 관리하므로, 해당 레이블을 덮어쓰지 않고 그대로 사용하고 싶을 때 유용합니다.
  3. 서비스 디스커버리 활용 시: 쿠버네티스와 같은 환경에서 서비스 디스커버리를 통해 얻은 메타데이터 레이블이 프로메테우스의 job 이름보다 더 중요한 의미를 가질 때, 해당 레이블을 job으로 사용하고 싶을 경우 활용할 수 있습니다.

📝 한눈에 정리하기

설정 honor_labels: false (기본값) honor_labels: true
우선순위 프로메테우스의 자동 추가 레이블 👑 수집 대상(Target)의 기존 레이블 👑
충돌 시 동작 대상의 레이블 이름 앞에 exported_ 추가 프로메테우스의 레이블을 버림
결과 job 레이블 프로메테우스 설정값 (job_name) 수집 대상의 원래 job 레이블 값
주요 사용처 대부분의 일반적인 스크랩 환경 Federation, Pushgateway, 고급 서비스 디스커버리

 

honor_labels는 프로메테우스의 레이블링 전략을 섬세하게 제어할 수 있는 강력한 도구입니다. 이 옵션을 잘 이해하고 활용하여 더욱 깔끔하고 의미 있는 메트릭을 관리해 보세요!🚀