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

프로메테우스(Prometheus) on() vs ignoring(): 벡터 매칭의 두 얼굴 🎭

by gasbugs 2025. 10. 12.

안녕하세요! 오늘은 프로메테우스 쿼리 언어(PromQL)에서 매우 중요하지만 헷갈리기 쉬운 두 가지 키워드, on()과 ignoring()에 대해 자세히 알아보겠습니다. 이 둘은 벡터(vector) 간의 연산을 수행할 때 어떤 레이블을 기준으로 매칭할지 결정하는 역할을 합니다. 정확한 쿼리를 작성하기 위해선 이 둘의 차이점을 명확히 이해하는 것이 필수적입니다!

 

 

🎯 on(): "이 레이블만 보고 매칭해!"

on()은 지정한 레이블 목록이 정확히 일치하는 시계열 데이터끼리 연산을 수행하라고 지시하는 키워드입니다. on()에 명시되지 않은 다른 모든 레이블은 매칭 과정에서 완전히 무시됩니다.

on()의 작동 방식

  • 명시적 지정: 매칭에 사용할 레이블을 직접, 명확하게 지정합니다.
  • 화이트리스트 방식: "이 목록에 있는 레이블만 허용하고, 나머지는 신경 쓰지 마" 와 같은 방식입니다.

예시 상황 📝

다음과 같은 두 개의 메트릭이 있다고 가정해봅시다.

  • http_requests_total{method="GET", path="/api/users", instance="app-1"}
  • http_requests_in_progress{method="GET", path="/api/users", instance="app-1"}

여기서 우리는 method와 path를 기준으로 진행 중인 요청의 비율을 계산하고 싶습니다. instance 레이블은 고려하고 싶지 않습니다. 이럴 때 on()을 사용하면 됩니다.

http_requests_in_progress
  / on(method, path)
http_requests_total

이 쿼리는 method와 path 레이블 값이 정확히 일치하는 데이터끼리 나눗셈 연산을 수행합니다. instance 레이블은 다르더라도 무시되기 때문에 우리가 원하는 결과를 얻을 수 있습니다.

🙈 ignoring(): "이 레이블만 빼고 매칭해!"

ignoring()은 on()과 정반대의 개념입니다. 지정한 레이블 목록을 제외한 나머지 모든 레이블이 일치하는 시계열 데이터끼리 연산을 수행하라고 지시합니다.

ignoring()의 작동 방식

  • 예외 지정: 매칭에서 무시할 레이블을 직접 지정합니다.
  • 블랙리스트 방식: "이 목록에 있는 레이블은 무시하고, 나머지 레이블은 모두 일치해야 해" 와 같은 방식입니다.

예시 상황 📝

위와 동일한 상황에서 ignoring()을 사용해볼까요? instance 레이블만 무시하고 나머지(method, path)는 모두 일치시켜야 합니다.

http_requests_in_progress
  / ignoring(instance)
http_requests_total

이 쿼리는 instance 레이블을 제외한 나머지 모든 레이블(method, path)이 일치하는 데이터를 찾아 연산을 수행합니다. 결과적으로 on(method, path)를 사용한 것과 동일한 결과를 얻게 됩니다.

🤔 on() vs ignoring(), 언제 무엇을 써야 할까?

 

구분 on() ignoring()
개념 명시된 레이블만 매칭 (Whitelist) 명시된 레이블만 무시하고 매칭 (Blacklist)
장점 쿼리의 의도가 명확하고 간결함 새로운 레이블이 추가되어도 쿼리 수정이 덜 필요할 수 있음
추천 상황 소수의 특정 레이블을 기준으로 그룹화하거나 연산할 때 instance, pod  환경에 따라 변하는 특정 레이블만 제외하고 싶을 때

보통 instance나 pod처럼 개별 인스턴스를 구분하는 고유 레이블을 무시하고, 서비스 로직과 관련된 레이블(method, path, status_code 등)을 기준으로 연산하는 경우가 많습니다. 이런 경우에는 ignoring(instance, pod)와 같이 사용하는 것이 더 유연하고 편리할 수 있습니다.

 

반대로, 수많은 레이블 중에서 단 두세 개의 특정 레이블(job, handler)만으로 그룹핑하고 싶다면 on(job, handler)가 훨씬 더 직관적이고 명확한 선택이 될 것입니다.

 

결론 ✨

on()과 ignoring()은 PromQL에서 벡터 매칭을 제어하는 강력한 도구입니다.

  • on()은 포함할 레이블을 명시합니다. 🎯
  • ignoring()은 제외할 레이블을 명시합니다. 🙈

두 키워드의 차이점을 정확히 이해하고 상황에 맞는 키워드를 선택하여, 더 정확하고 유연한 모니터링 쿼리를 작성해보세요!