오늘 New Relic One에서 디멘셔널 메트릭(dimensional metric)을 관리하는데 도움을 주는 새로운 툴 ‘메트릭 애그리게이트 프루닝(metric aggregate pruning)’이 출시되었습니다.

새로운 메트릭 애그리게이트 프루닝 기능을 사용하면, 메트릭 데이터의 어떤 속성이 장기적인 추세와 분석에 중요하고, 어떤 속성이 단기적인 문제 해결에만 관련되는지 알려주는 규칙을 생성할 수 있습니다. 긴 시간 범위를 쿼리할 때, 필요하지 않은 속성은 ‘프루닝(가지치기)’되도록 New Relic One을 설정하면, 카디널리티 한도에 도달해 데이터의 유용성이 감소되는 것을 방지할 수 있습니다.

메트릭 애그리게이트 프루닝은 NerdGraph의 데이터 드로핑 규칙 데이터 관리 API에 새로 추가된 기능입니다. 뉴렐릭의 카디널리티 한도와 데이터 드로핑 규칙 API에 대해 잘 알고 있고 메트릭 애그리게이트 프루닝을 바로 사용하길 원하시면, ‘메트릭 애그리게이트 프루닝 사용 방법’으로 이동하시면 됩니다.

메트릭 카디널리티에 대해 잘 모르시는 분들을 위해 카디널리티란 무엇이며 어떻게 카디널리티 한도에 도달했는지 확인할 수 있는지를 설명드리고, 이 문제에 대한 세 가지 솔루션을 간략하게 살펴보도록 하겠습니다.

메트릭 카디널리티(metric cardinality)란?

메트릭은 모든 옵저버빌리티 플랫폼의 핵심 구성 요소입니다. ‘시스템에서 사용 중인 CPU 비율’ 처럼 단일 데이터 포인트를 나타내는 특정 시점의 측정치일 수도 있고, ‘지난 1분 동안 네트워크를 통해 전송된 바이트 수’ 같은 누적 측정치일 수도 있습니다. 메트릭은 시간 경과에 따른 추세를 식별하거나 변화율을 관찰하는 데 유용합니다.

모니터링에서, 카디널리티는 메트릭에 포함되는 속성에 존재하는 키-값 쌍의 고유한 조합 수를 지칭합니다. 예를 들어, 각 시스템에서 '사용 중인 CPU의 백분율'을 보고하는 메트릭인 ‘cpuPercent’가 있다고 하겠습니다. 이 메트릭에 보고하는 시스템을 식별할 수 있도록 hostname 속성이 있고, ‘host1’ 및 ‘host2’라는 두 개의 호스트가 보고를 하면 카디널리티가 낮다고 표현합니다. hostname 속성 하나에 메트릭을 위한 두 개의 고유 값:host1host2가 있기 때문입니다. 이 경우, 카디널리티가 2입니다. hostname 속성과 시스템의 각 프로세스에 대해 보고되는 process ID 속성을 가진 ‘cpuPercent’라는 메트릭이 있고 수천 개의 시스템이 있는 경우, 카디널리티가 높다고 표현합니다. 고유한 프로세스 ID와 시스템 조합이 수백만 개가 있을 수 있기 때문입니다.

"오늘 오전 9시 30분에서 10시 30분 사이에 504 오류를 경험한 모든 사용자를 보여줘" 같은 질문에 답할 때, 낮은 카디널리티와 (특히) 높은 카디널리티 값이 모두 중요합니다. 옵저버빌리티에서 왜 높은 카디널리티 데이터가 중요한지는 이 글에 설명되어 있습니다.이러한 문제를 해결하려면, 상당히 많은 데이터를 상호 연관시켜야 합니다. 그러나 엄청난 양의 데이터로 인해 검색 역량이 저해되면 안됩니다.

New Relic One으로 메트릭 데이터를 보내면, 보내진 모든 원시 데이터 포인트가 저장될 뿐만 아니라, 이러한 메트릭은 다양한 시간 간격에서 새로운 데이터 포인트로 집계됩니다. 이를 롤 업(rollup)이라고 합니다. 이를 통해, 긴 시간 범위를 더 효율적으로 저장하고 쿼리를 더 빠르게 수행할 수 있습니다. 쿼리가 빠르게 반환되도록 하기 위해, New Relic One은 쿼리에 따라 원시 데이터 포인트를 사용할지 롤업을 사용할지를 결정합니다.

메트릭 애그리게이트 프루닝을 사용해야 하는 경우

기저 데이터 플랫폼의 성능과 규모 덕분에, 뉴렐릭은 특정 일에 수백만 개의 고유한 메트릭 시계열이 존재하는 계정의 데이터를 쉽게 처리할 수 있습니다. 그러나 모든 시스템과 마찬가지로, 시스템을 보호하고 모든 사람이 성능을 유지할 수 있도록 만들려면 몇 가지 제한을 가해야 합니다.

카디널리티 한도에 도달하면, 뉴렐릭은 계정에 NrIntegrationError를 표시합니다. 이는 NRQL을 사용해 쿼리할 수 있는 이벤트입니다. New Relic One에 있는 Data Management Hub의 limits 섹션에서도 한도를 확인할 수 있습니다. 한도에 도달해도 계속 모든 데이터가 처리되고 저장되지만, 롤업 생성은 중단됩니다. 이러한 일이 발생했을 때 한 시간 범위를 초과하는 쿼리를 보면, 데이터가 보고가 중단되었다고 생각할 수 있습니다. 긴 시간 범위의 쿼리에 사용되는 롤업을 사용할 수 없기 때문입니다.

그러나 걱정할 필요는 없습니다. 말씀드린 것처럼 전송된 원시 데이터는 계속 사용할 수 있습니다. 원시 데이터에 액세스하려면, 더 짧은 시간 범위(1시간 이하)로 쿼리를 하거나, 쿼리에 RAW keyword를 추가하면 문제 해결에 필요한 데이터를 가져올 수 있습니다. 한도에 도달하지 않도록 하기 위해, 새로운 기능인 메트릭 애그리게이트 프루닝을 사용할 수 있습니다.

메트릭 애그리게이트 프루닝을 사용하는 방법

메트릭 애그리게이트 프루닝(DROP_ATTRIBUTES_FROM_METRIC_AGGREGATES)은 메트릭 롤업에서 제외할 하나 이상의 속성을 지정할 수 있도록 해줍니다.

메트릭 애그리게이트 프루닝은 컨테이너 ID 또는 기타 고유 식별자처럼 메트릭에 이따금씩 포함되는 높은 카디널리티 속성에 적합합니다. 이러한 높은 카디널리티 속성에는 인시던트 발생 시 문제 해결을 위한 중요한 세부 정보가 포함되어 있지만(좁은 시간 범위), 시간이 지나면서 가치가 떨어지며 장기적인 추세와 관련성이 줄어듭니다.

다음 스크린샷은 가상 메트릭 some.metric을 위한containerId 속성을 프루닝하기 위한 설정 예시입니다.

메트릭 애그리게이트 프루닝 사용 방법 샘플

추가적인 솔루션

카디널리티 한도에 도달하지 않도록 도움이 되는 두 가지 다른 방법이 있습니다.

  • 데이터를 분할하여 여러 뉴렐릭 하위 계정으로 보내는 것입니다.
  • 클라이언트 측에서 또는 NerdGraph의 데이터 드로핑 기능을 사용해 가치가 낮은 메트릭이나 속성을 영구적으로 드롭(삭제)할 수 있습니다. 이렇게 드롭된 메트릭과 속성은 저장이 되지 않습니다.