[ Datadog ] Time Range 선택에 따라 그래프의 값이 다르게 표시됩니다.

Print

Dashboard 혹은 Monitor 구성시 선택한 Time Range 에 따라 그래프에 표시되는 값들이 차이가 나는 현상을 확인하고 문의 주시는 경우가 많아 이 부분에 대한 상세한 설명을 드리고자 합니다. 


Dashboard 및 Monitor 구성시 보통 아래와 같이 Query를 이용해 Metric값을 그래프화 합니다. 


위의 쿼리로Time Range를 다르게 잡아 확인 해보면 동시간대의 그래프내 가장 높은 값이 차이가 납니다. 


2 min


1 hour


4 hour

 


이 현상은 Metric을 그래프화 할 때 그래프내에 표시되는 Point에 대한 제한(최대 1500개)이 있기 때문에 발생하는 현상입니다. 

예를 들면 만약 실제 데이터가 1초간격으로 수집되는 데이터가 있다고 한다면

1시간의 데이터를 그래프로 표현하려면 60(s)* 60(min) = 3,600 개의 point를 표시해야합니다. 

4시간의 데이터는 60*60*4 = 14,400 개의 point를 표시해야합니다. 


하지만 모든 point를 표시하기에는 과부화로 인해 정상적인 표시가 어려울수 있어 

표시되는 point 수에 제한을 두고 값을 집계하여 그래프에 최적화된 그래프를 보여주기 위해 자동적으로 Rollup이 됩니다.


아래 표는 선택한 Time Range에 따라, 데이터 표시 종류에 따라 표시되는 

최소의 Rollup간격(point 간격)을 보여주고 있습니다. 


예를 들었던 실제 데이터가 1초간격으로 수집되는 데이터를 기준으로 적용해보자면, 

1시간의 데이터를 line graph로 표현시 원래는 3,600개의 point로 표현해야하지만 20초당 1개의 point 간격이 최소 단위 임으로 각 20초에 해당 하는 구간마다 집계하여 1개의 point로 만들어 약 180개의 point로 표현하게 됩니다. 

4시간이라면 약 240개의 point 로 표현하게 됩니다. 


이때 각 구간을 집계하는 집계함수는 기본적으로 Average 입니다. 

1시간의 데이터를 표현할 때는 20초마다 평균값을 1개의 포인트로 표시하고 

4시간의 데이터를 표현할 때는 1분마다 평균값을 1개의 포인트로 표시하게 되는겁니다. 

그렇기 때문에 원래 1초단위의 데이터였다면 각각 20개의 데이터, 60개의 데이터에 대한 평균값이 1포인트가 됩니다. 


각 point 마다 집계하는 대상 데이터가 많아졌기 때문에 당연히 평균값에도 차이가 발생하게 되는 것입니다. 


그렇다면, 

1달 동안 Metric 값이 peak 치는 지점 및 값을 확인하고 싶은 경우 어떻게 해야 할까?


Rollup을 수동으로 설정해 평균값이 아닌 Max 값으로 집계 하도록 설정하면 됩니다. 


Query에서 Function을 선택해 Rollup의 집계함수를 선택해 적용하고, 시간 기준으로 얼마만큼의 간격으로 집계를 할 것인지 설정 하면 됩니다. 


단, 수동으로 설정하더라도 집계되는 간격은 자동 rollup 간격 이상으로만 적용됩니다. 


예를 들어 Time range 를 1시간으로 선택한 경우, 수동 rollup function으로 10s 마다 집계하도록 설정했더라도

실제적으론 자동 rollup 간격인 20s 마다 집계됩니다. 

반대로 1분마다 집계하도록 설정했다고 하면 자동 rollup 간격보다 크므로 그대로 수동 rollup에 설정된 1분기준으로 집계됩니다. 


위 이미지처럼 function 아이콘을 선택해 설정하는것이 아닌 metric query 문장으로 설정시에는

query 마지막에 .rollup(집계함수,second 기준 집계간격) 로 설정하면 됩니다.

avg:system.cpu.user{*} by {host}.rollup(max,60)


* 참고 사항 : 헷갈리기 쉬운 Metric Query 설정 그룹 집계함수!!

아래 이미지에 표시해둔 집계함수를 Rollup 의 집계함수로 잘못 이해하고 있는 경우가 있어 Rollup 관련 내용에 포함해 안내 드립니다. 


Query 에 표시된 avg by는 Group by에 관련된 집계 함수 입니다. 


보통 query를 설정할때 group by를 tag 기준으로 설정하게 됩니다. 

이렇게 설정하면 system.cpu.user Metric을 host 별로 표시하라는 Query가 됩니다.

group by 집계함수는 tag를 기준으로 그룹화된 데이터를 표현하기 위한 집계함수입니다. 


예를 들어 보겠습니다. Metric이 아래와 같이 수집되고 있다면 (host, service, name은 tag정보입니다.)


group by를 host로 할 경우, 그래프에 표시되는 line은 총 5개이며, host는 각 데이터를 나누는 가장 작은 단위의 tag로 group by 집계함수를 avg by에서 max by/min by/sum by 등으로 변경하더라도 동일한 값이 표시가 됩니다. 


하지만 group by 를 service로 할 경우, 그래프 line은 총 3개로 표시될 것입니다. 

실제 5개의 데이터를 3개로 표시 하기 위해선 집계해 표시해야합니다. 각 집계함수 선택시 아래와 같은 결과로 표시됩니다.


만약 group by 에 tag를 따로 설정하지 않는다면, 해당 metric으로 들어오는 모든 대상에 대한 데이터를 집계하여 1개의 라인으로 표현하게 됩니다. 


결론적으로 말씀드리면, Rollup 집계함수는 시간 구간을 기준으로 point를 합치는 집계를 위해 사용하고, 

Group 집계함수는 Tag로 그룹화를 했을 때 포함되는 대상별 값을 기준으로 point를 합치는 집계를 위해 사용합니다.



참고Datadog Docs 가이드 

- Query시 Aggregate And Rollup : https://docs.datadoghq.com/dashboards/querying/#aggregate-and-rollup

- Rollup : https://docs.datadoghq.com/dashboards/functions/rollup/

 

이 답변이 유용합니까? 아니오

Send feedback
도움이 되어드리지 못해 죄송합니다. 아티클 개선을 위해 의견을 제공해 주시기 바랍니다.