지금까지 NRQL 사용의 기본 사항, NRQL을 사용하여 데이터를 제어하는 방법, NRQL을 사용하여 대시보드를 발전시키는 방법을 배웠습니다. 이 마지막 튜토리얼 시리즈에서는 데이터에서 필요한 모든 것을 쿼리할 수 있는 가장 진보된 NRQL 기술을 배우게 됩니다. 이 튜토리얼에서는 추가 집계 기술, 상위 수준 수학 함수, Regex 필터링 및 중첩 집계와 같은 고급 기능에 대해 설명합니다. 구체적으로 다음을 사용하는 방법을 배우게 됩니다.
stddev()
집계 함수 및buckets()
함수를 사용하여 집계된 데이터를 그룹화하는 방법- NRQL 내에서 데이터를 매끄럽게 하고 고정하고 조작할 수 있는 고급 수학 기능을 사용할 수 있습니다.
- 특정 기간 내에 데이터에서 사용할 수 있는 이벤트 유형 및 속성을 검색하는 방법입니다.
RLIKE
을 사용하여 Regex로 데이터를 필터링하는 방법.- 중첩 집계 및 하위 쿼리를 사용하는 방법
우리는 이러한 기능이 매우 중요하다는 것을 알게 될 것이라고 생각합니다. 시작하자!
집계와 함께 버킷팅 사용
표준편차는 값 집합 내의 변화나 분산의 양을 측정합니다. 낮은 값(평균에 가까운 값)에서 높은 값(평균에서 먼 값)까지의 척도를 사용합니다. stddev()
함수를 사용하면 평균선을 살펴보고 보고된 값을 더 깊이 이해할 수 있습니다. 이 예에서는 마지막 날에 대한 거부 반응 시간("기간")을 전날과 비교합니다.
SELECT stddev(duration) FROM Transaction SINCE 24 hours ago COMPARE WITH 24 hours ago TIMESERIES
stdvar()
함수는 stddev()
과 유사한 방식으로 작동하지만 숫자 속성에 대한 표준 분산을 반환합니다.
이전 강의에서는 FACET cases()
사용하여 데이터를 특정 버킷 구성으로 그룹화하는 방법을 배웠습니다. FACET buckets()
사용하여 특정 속성별로 데이터를 자동으로 버킷할 수도 있습니다. 이 함수는 집계 함수에 대한 데이터 그룹화를 단순화하고 세 가지 인수를 사용합니다.
buckets(attribute, ceiling, number-of-buckets)
.
버킷하려는 속성입니다.
샘플 범위의 최대값(모든 이상값은 최종 버킷에 나타납니다).
필요한 총 버킷 수입니다.
예제 쿼리에서는 NRQL을 사용하여 전체 트랜잭션의 평균 기간을 찾습니다. 그러나 해당 성능을 특정 볼륨의 데이터베이스 호출을 수행하는 트랜잭션으로 그룹화합니다. 따라서 버킷 속성을
databaseCallCount
으로 지정하고 한도를 400개 호출로 설정하고 이를 10개의 버킷으로 그룹화합니다. 이로 인해 0-40, 40-80, 80-120, 120-160, 160-200, 200-240, 240-280, 280-320, 320-360 및 >360 데이터베이스 호출을 수행하는 트랜잭션의 성능이 향상됩니다. 10개의 투명 버킷이 천장까지 균등하게 나누어져 있습니다.SELECT average(duration)FROM TransactionSINCE 12 hours agoFACET buckets(databaseCallCount, 400, 10)
이를 통해 현재 NRQL에 존재하는 모든 집계 함수를 배웠습니다! 전문가처럼 데이터를 분석할 수 있습니다. NRQL에 집계 기능이 없다고 생각되면 계정 팀에 알려주십시오. 우리는 항상 필요할 수 있는 다음 킬러 기능을 찾고 있습니다.
고급 수학 기능 사용
NRQL은 또한 데이터에 대해 깊이 있게 분석해야 하는 사람들을 위해 고급 수학 함수를 지원합니다. 이러한 함수는 값을 X 거듭제곱으로 추정하고, 제곱근을 찾고, 클램핑을 적용하여 상한 및 하한을 적용하거나 Y축에서 값을 양수로 유지할 수도 있습니다.
NRQL에는 어떤 방식으로든 값을 조작하는 많은 수학 함수가 있습니다. 이 예에서는 몇 가지가 동시에 시연되는 것을 볼 수 있습니다.
abs(n)
함수는 n의 절대값을 반환합니다. 음수가 아닌 n 값에 대해서는 "n"을 반환하고, 음수 n 값에 대해서는 양수 "n"을 반환합니다. 예를 들어, abs(2)
= 2, abs(-4)
= 4입니다.
floor()
, ceil()
및 round()
를 사용하여 십진수를 정수로 반올림할 수도 있습니다. floor()
은 반올림하여 가장 가까운 정수를 반환하고, ceil()
반올림하여 그 반대를 수행합니다. round()
는 양방향이며 가장 가까운 정수로 반올림하거나 내림합니다.
SELECT abs(duration), round(duration), ceil(duration), floor(duration) FROM Transaction SINCE 1 day ago
속성에 대한 클램핑을 사용하여 해당 값에 상한 또는 하한을 적용할 수 있습니다. 이는 극단적인 이상치가 시계열 그래프의 규모를 왜곡하지 않도록 하는 것과 같은 용도로 사용됩니다. clamp_max(duration, 10)
기간을 반환합니다. 단, 10을 초과하지 않는 한 10을 반환합니다. 간단히 말해서, 10보다 큰 값은 모두 10으로 반환됩니다. clamp_min(duration,1)
은 그 반대입니다. 기간이 1보다 작으면 1과 동일하게 보고됩니다.
SELECT clamp_max(average(duration), 10), clamp_min(average(duration), 1) FROM Transaction SINCE 1 day ago TIMESERIES
이제 많은 사람들이 사용하기 어렵다고 생각하는 고급 수학으로 넘어갈 수 있습니다. 이전과 마찬가지로 단일 예제 쿼리로 이러한 모든 기능을 표시할 수 있습니다.
pow()
함수는 첫 번째 인수를 두 번째 인수만큼 거듭제곱합니다. 이 예에서는 기간을 2의 거듭제곱으로 늘립니다. 값의 제곱근이 필요한 경우 sqrt()
함수를 사용하면 빠르게 이를 얻을 수 있습니다. 그리고 exp()
함수는 해당 인수의 자연 지수 함수를 계산합니다.
마지막으로 NRQL은 여러 유사한 함수에 맞는 로그도 제공합니다.
이번 강의에서는 이벤트 데이터를 평활화하는 방법을 배웠습니다. round()
/ceil()
/floor()
사용하면 원하는 방식으로 반올림할 수 있습니다. 클램핑을 사용하면 데이터에 경계를 설정할 수 있으며 로그, 제곱근, 거듭제곱 및 지수에 대한 고급 수학 도구는 모두 필요에 따라 데이터를 조작할 수 있는 추가 제어 기능을 제공합니다. 다음으로 이벤트와 속성을 검색하는 방법에 대해 알아봅니다.
이벤트 및 속성 검색
이벤트 및 속성을 검색하면 사용 가능한 데이터를 쿼리하기 전에 이에 대한 질문에 답하고 자동화하는 데 도움이 될 수 있습니다! 잠시 시간을 내어 이 강력한 유틸리티를 살펴보겠습니다.
이러한 기능은 이벤트 유형 및 속성의 변경 사항을 검색하는 데 도움이 됩니다. 더 많은 DevOps 엔지니어가 이러한 기능을 사용하여 작업을 마무리하거나 신속하게 자동화합니다. 다음으로 Regex를 사용하여 데이터를 필터링하는 방법을 알아봅니다.
정규식으로 필터링
때로는 LIKE
제공할 수 있는 것보다 더 복잡한 패턴 일치를 사용하여 데이터를 필터링하고 싶을 수도 있습니다. RLIKE
절을 사용하면 더 복잡한 일치를 위해 정규식으로 필터링할 수 있습니다.
LIKE
사용할 수 있는 모든 시나리오에서는 대신 RLIKE
사용하여 해당 정규 표현식을 따옴표로 묶어 제공할 수 있습니다. 이 예에는 짝수 또는 자음으로 끝나는 모든 호스트 이름 목록이 있습니다.
간단한 매칭도 가능합니다. 특정 문자나 단어로 시작하는 값을 일치시키려는 경우.
SELECT count(*) FROM Transaction WHERE name RLIKE 'W.*|O.*' FACET name
정규 표현식 엔진은 RE2 구문을 사용합니다. 문자를 삭제해야 하는 경우 이중 백슬래시 이스케이프 시퀀스를 사용해야 할 수도 있습니다. (예를 들어 \\
).
RLIKE
은 본질적으로 LIKE
보다 더 복잡하고 성능이 떨어집니다. LIKE
및 기타 필터링 기능이 필요에 맞지 않는 경우에만 사용하십시오.
정규식 지원을 통해 거의 무한한 패턴 일치 가능성이 가능합니다. 이미 정규식 전문가라면 이것이 NRQL에 추가되는 힘을 알고 있을 것입니다. 하지만 그렇지 않더라도 걱정하지 마세요! Regex에는 온라인에서 참조할 수 있는 많은 리소스가 있습니다. NRQL에서 정규식을 사용하는 방법을 배웠으므로 이제 목록의 다음은 중첩 집계를 사용하는 것입니다.
중첩 집계 사용
쿼리를 상위 쿼리의 FROM
로 사용하는 NRQL을 사용하여 중첩 집계 쿼리를 작성할 수 있습니다. 이를 통해 다음과 같은 질문에 답할 수 있습니다.
- 내 애플리케이션이 분당 몇 개의 트랜잭션을 처리했으며 지난 시간 동안 분당 최대 요청 속도는 얼마였습니까?
- 모든 서버의 평균 CPU 사용량은 얼마이며, 90%를 넘는 특정 서버는 무엇입니까?
- 모든 사용자 세션 중 즉시 이탈한 비율(예: 세션에 하나의 PageView만 있습니까?
각 사용 사례를 더 자세히 살펴보겠습니다.
예시 1: 지난 1시간 동안 최대 API 호출
첫째, 지난 한 시간 동안 분당 API 호출 수를 계산할 수 있습니다. 그래프에 60개의 데이터 포인트가 반환됩니다.
SELECT count(*) AS apicallsFROM Transaction TIMESERIES 1 MINUTE
이제 해당 기간 동안 보고된 최대값을 찾으려면 쿼리를 괄호로 묶고 다음과 같이 SELECT ... FROM
사용합니다. SELECT z FROM (SELECT x AS z FROM y)
SELECT max(apicalls) FROM ( SELECT count(*) AS apicalls FROM Public_APICall TIMESERIES 1 minute )
예시 2: CPU 부하가 높은 서버
이 예에서는 뉴렐릭 인프라의 데이터를 사용합니다. 때때로 CPU가 평균적으로 특정 비율을 초과한 호스트만 보고 싶을 때가 있습니다. average(cpuPercent)
에 대해 NRQL에 요청하면 평균 CPU 비율이 가장 높은 호스트 목록을 얻게 됩니다. 그러나 단순히 WHERE cpuPercent > 90
추가하여 90% 이상에서 실행되는 호스트로만 이를 제한할 수는 없습니다. 이렇게 하면 평균을 계산하기 전에 데이터가 제거되기 때문입니다.
하지만 중첩 집계를 사용하면 이 문제를 해결할 수 있습니다! 하위 쿼리에서 average(cpuPercent)
요청하면 호스트 목록과 평균 CPU를 얻을 수 있습니다. 이제 외부 쿼리에서 > x%
인 결과만 필터링할 수 있습니다! (팁: 호스트의 CPU를 사용하려면 이 쿼리의 임계값을 조정해야 할 수도 있습니다. 여기서는 20%로 설정했습니다.)
SELECT hostname, cpu FROM (SELECT average(cpuPercent) AS cpu FROM SystemSample FACET hostname) WHERE cpu > 20
예 3 - 세션 이탈
사람들은 프런트엔드 모니터링에서 이탈률을 계산하는 방법에 대해 궁금해하는 경우가 많습니다. 이는 단일 페이지를 본 후 추가 페이지를 방문하기 전에 "이탈"하는 세션을 의미합니다. 중첩된 집계를 사용하면 이를 쉽게 달성할 수 있습니다. 내부 쿼리는 세션별로 그룹화하여 PageViews
를 계산합니다. 외부 쿼리에 전달된 결과 집합에는 모든 세션과 각 세션이 본 페이지 수가 나열됩니다. 그런 다음 외부 쿼리는 개수가 1인 세션의 비율을 계산합니다(단일 페이지만 봤기 때문에 이는 '반송된 세션'을 나타냄).
SELECT percentage(count(*), WHERE sessionLength = 1) FROM (SELECT count(*) AS sessionLength FROM PageView FACET session)
이 강의에서는 쿼리를 다른 쿼리의 FROM
로 사용하여 더 복잡한 질문에 답하는 방법을 배웠습니다. 마지막으로 배워야 할 것은 하위 쿼리를 사용하는 방법입니다!
하위 쿼리 사용 방법
NRQL의 하위 쿼리는 중첩된 집계와 유사하므로 다른 쿼리 내에 중첩된 쿼리를 사용할 수 있습니다. 하위 쿼리를 사용하면 중첩 쿼리는 SELECT
문과 WHERE
절로 이동하고 중첩 집계는 FROM
절로 이동합니다.
다양한 유형의 하위 쿼리에 대한 몇 가지 예를 살펴보겠습니다.
IN 조건
하위 쿼리에서 반환되는 값이 여러 개인 경우 상위 쿼리에 대해 IN
조건을 사용하여 각 값과 비교합니다. 예시에서 entity.guid
속성은 트랜잭션 오류가 있는 각 고유 엔터티에 대한 데이터를 제공하며, 이는 오류 엔터티의 평균 기간을 결정하기 위해 트랜잭션의 entity.guid
값과 일치합니다.
SELECT average(duration) FROM Transaction WHERE entity.guid IN (SELECT uniques(entity.guid) FROM TransactionError) FACET appName TIMESERIES
SELECT 문의 하위 쿼리
SELECT
문을 사용하여 계산에 하위 쿼리 결과를 사용할 수 있으며 외부 쿼리와 다른 시간 범위를 지정할 수 있습니다. 이 예에서는 현재 평균 기간과 지난 7일 간의 델타를 계산합니다.
SELECT average(duration) - (SELECT average(duration) FROM Public_APICall SINCE 7 days ago) FROM Public_APICall TIMESERIES
하위 쿼리는 데이터 탐색을 위한 강력한 도구로, 다양한 데이터 소스와 시간 범위에 걸쳐 더욱 정교한 쿼리를 가능하게 합니다.
이 튜토리얼을 완료한 것을 축하합니다. 추가 집계 기술, 상위 수준 수학 함수, Regex 필터링, 중첩 집계 및 하위 쿼리와 같은 고급 기능에 대해 배웠습니다. 이전 세 가지 튜토리얼을 완료했다면 사용할 수 있는 NRQL의 거의 모든 측면에 대해 작업한 것입니다!
데이터를 탐색하는 데 NRQL이 유용하길 바랍니다. 추가 질문이 있거나 문제가 발생하면 언제든지 New Relic 지원팀에 문의하세요. 또는 원하는 경우 온라인 커뮤니티를 통해 경험을 공유할 수 있습니다.