DQL 함수 참조¶
DQL은 데이터 집계, 변환 및 매칭을 위한 다양한 함수를 제공합니다. 이 문서에서는 각 함수의 의미, 매개변수 및 사용 방법을 자세히 설명합니다.
집계 함수¶
집계 함수는 여러 행의 데이터를 단일 값으로 집계하며, 일반적으로 시간 창(time-expr) 및 그룹화(BY 절)와 함께 사용됩니다.
기본 집계¶
sum¶
필드 값의 합계를 계산합니다.
구문:
매개변수:
field: 숫자 필드
예제:
// 총 요청 수 계산
M::http_requests:(sum(request_count)) [1h]
// 서비스별로 그룹화하여 총 요청 수 계산
M::http_requests:(sum(request_count)) [1h] BY service
avg¶
필드 값의 평균을 계산합니다.
구문:
매개변수:
field: 숫자 필드
예제:
// 평균 응답 시간 계산
M::response_time:(avg(duration)) [1h] BY endpoint
// 평균 CPU 사용률 계산
M::cpu:(avg(usage)) [1h] BY host
count¶
데이터 행 수를 계산합니다.
구문:
매개변수:
field: 임의의 필드, null이 아닌 값의 수를 계산합니다.*: 모든 행 수를 계산합니다.
예제:
// 로그 수 계산
L::nginx:(count(*)) [1h]
// 응답 시간이 있는 요청 수 계산
M::response_time:(count(duration)) [1h] BY service
min / max¶
필드의 최소값 또는 최대값을 계산합니다.
구문:
매개변수:
field: 숫자 필드
예제:
// 최대 응답 시간 찾기
M::response_time:(max(duration)) [1h] BY endpoint
// CPU 사용률 범위 찾기
M::cpu:(min(usage), max(usage)) [1h] BY host
first / last¶
첫 번째 또는 마지막 값(시간 순서 기준)을 가져옵니다.
구문:
매개변수:
field: 임의의 필드
설명:
first: 시간상 가장 빠른 값을 반환합니다.last: 시간상 가장 늦은 값을 반환하며, 필드가 배열 유형인 경우 펼쳐집니다.last_row: 시간상 가장 늦은 값을 반환하며, 배열 유형은 펼쳐지지 않습니다.
예제:
// 최신 상태 값 가져오기
M::system:(last(status)) [1h] BY host
// 초기값 및 최종값 가져오기
M::counter:(first(value), last(value)) [1h] BY metric
any¶
null이 아닌 임의의 값을 반환합니다. 샘플 데이터를 가져오거나 특정 집계 순서가 필요하지 않은 시나리오에 적합합니다.
구문:
매개변수:
field: 임의의 필드
예제:
// 임의의 메시지 샘플 가져오기
L::logs:(any(message)) [1h] BY service
// 임의의 오류 스택 트레이스 가져오기
L::error_logs:(any(stack_trace)) [1h] BY error_type
SHIFT¶
표현식 수준 SHIFT는 프로젝션에서 이전 시간 창의 집계 값을 참조하여 현재 집계 결과와 함께 표시합니다.
구문:
현재 값, 이전 값 및 파생 계산은 모두 프로젝션 표현식에 의해 명시적으로 제공됩니다. 동일한 이전 값을 여러 번 참조하는 경우 동일한 SHIFT 표현식을 반복해서 작성하면 됩니다.
예제:
L::logs:(
service,
count(*) AS requests,
count(*) SHIFT 7d AS requests_last_week,
CASE
WHEN (count(*) SHIFT 7d) = nil OR (count(*) SHIFT 7d) = 0 THEN nil
ELSE count(*) / (count(*) SHIFT 7d)
END AS requests_ratio
)[1d:1h] BY service
duration은 1h, 7d와 같은 양의 고정 기간이어야 합니다.
사용 제한:
- 프로젝션 내에서만 사용할 수 있으며, 현재 프로젝션에서 창 간에 행 ID가 안정적인 집계 표현식 또는 이러한 집계를 소스로 하는 하위 쿼리 measure에만 적용됩니다.
- 동일한
SELECT에서 방금 선언된 프로젝션 별칭, 차원 열,WHERE,BY,HAVING,ORDER BY,SORDER BY에는 적용할 수 없으며,SHIFT를 중첩할 수도 없습니다. distinct,distinct_by_collapse,field_values,histogram등 각 창의 데이터에 의해 출력 행이 결정되는 집계는 operand로 사용할 수 없습니다.uint(field)등 원본 필드만 변환하는 표현식은 집계 measure가 아니며,abs(sum(field))등 안정적인 집계를 감싸는 스칼라 변환은 사용할 수 있습니다.- 이전 값을 기반으로 필터링하거나 정렬해야 하는 경우 외부
SELECT에서 수행합니다. - 동일한
SELECT내의 모든 표현식 수준SHIFT는 합계로 최대 16개의 서로 다른 offset을 포함할 수 있습니다.
쿼리 수준 SHIFT(DQL 기본 문서의 시간 이동 참조)와 표현식 수준 SHIFT는 조합할 수 있습니다. 쿼리 수준 오프셋이 먼저 전체 쿼리의 기준 창을 결정하고, 표현식 수준 오프셋은 해당 기준 창을 기준으로 더 이전의 집계 값을 읽습니다.
spread¶
범위(최대값과 최소값의 차이)를 계산합니다.
구문:
매개변수:
field: 숫자 필드
예제:
stddev¶
표준 편차를 계산합니다.
구문:
매개변수:
field: 숫자 필드
예제:
mode¶
최빈값(가장 자주 나타나는 값)을 계산합니다.
구문:
매개변수:
field: 임의의 필드
예제:
count_series¶
시계열(그룹) 수를 계산합니다. 현재 쿼리 범위 내에 몇 개의 독립적인 시계열이 있는지 반환합니다.
구문:
매개변수:
field: 임의의 필드(일반적으로*또는 존재하는 임의의 필드 사용)
예제:
// CPU 메트릭을 보고하는 호스트 수 계산
M::cpu:(count_series(*)) [1h]
// 각 서비스의 인스턴스 수 계산
M::http_requests:(count_series(*)) [1h] BY service
통계 집계(추정 함수)¶
다음 함수는 확률적 데이터 구조를 사용하여 추정하므로 대용량 데이터 시나리오에 적합하며 정확성과 성능 간의 균형을 유지할 수 있습니다.
count_distinct¶
필드의 고유 값 수(추정값)를 계산합니다.
구문:
매개변수:
field: 임의의 필드
알고리즘 설명:
HyperLogLog 알고리즘을 사용하여 카디널리티를 추정합니다. - 레지스터 수: 2¹⁶ = 65536 - LogLog-Beta 추정 방법 사용 - 표준 오차: 약 0.4%
사용 사례:
- 고유 사용자 수(UV) 통계
- 다른 IP 주소 수 계산
- 고유 요청 ID 수 분석
예제:
// 고유 사용자 수 통계
L::access_logs:(count_distinct(user_id)) [1d] BY service
// 액세스한 다른 IP 수 계산
L::nginx:(count_distinct(client_ip)) [1h] BY endpoint
percentile¶
필드의 백분위수(추정값)를 계산합니다.
구문:
매개변수:
field: 숫자 필드n: 백분위수, 범위 0-100
약식 형식:
p50(field)는percentile(field, 50)과 동일p95(field)는percentile(field, 95)과 동일p99(field)는percentile(field, 99)과 동일
알고리즘 설명:
로그 선형 보간 히스토그램을 사용하여 추정합니다. - 버킷 범위: 10⁻⁹ ~ 10¹⁸, 대부분의 숫자 시나리오를 포괄합니다. - 각 자릿수는 128개의 버킷으로 나뉩니다. - 로그 공간의 선형 보간을 사용하여 정확도를 높입니다.
사용 사례:
- 응답 시간의 P99, P95 계산
- 성능 지표의 꼬리 지연 시간 분석
- SLA(서비스 수준 계약) 달성 평가
예제:
// 응답 시간의 P99 계산
M::response_time:(percentile(duration, 99)) [1h] BY service
// 약식 형식 사용
M::response_time:(p99(duration)) [1h] BY service
// Rollup 함수 호출: 각 시계열에서 P95를 계산한 다음 service별로 집계
M::response_time:(avg(duration)) [1h::5m:percentile(95)] BY service
// 여러 백분위수 동시 계산
M::response_time:(p50(duration), p95(duration), p99(duration)) [1h] BY service
median¶
중앙값을 계산하며, percentile(field, 50)과 동일합니다.
구문:
예제:
히스토그램 함수¶
DQL은 다양한 데이터 소스 및 시나리오에 적합한 세 가지 히스토그램 관련 함수를 제공합니다.
| 함수 | 사용 사례 | 데이터 소스 유형 | 권장도 |
|---|---|---|---|
histogram_auto |
로그, Trace 등 상세 데이터의 숫자 분포 통계 | 상세 모델(로그/Trace) | ⭐⭐⭐ 권장 |
histogram |
고정 버킷 경계가 필요한 히스토그램 | 상세 모델(로그/Trace) | ⭐⭐ Deprecated |
histogram_quantile |
Prometheus 히스토그램 메트릭에서 분위수 계산 | Prometheus 메트릭 | ⭐⭐⭐ 권장 |
histogram_auto(권장)¶
분포 히스토그램을 자동으로 생성하며, 로그, Trace 등 상세 데이터의 숫자 분포 통계를 위해 설계되었습니다.
특징:
- 버킷 경계를 지정할 필요 없이 데이터 분포에 자동으로 적응합니다.
- 로그 선형 보간 히스토그램 알고리즘을 사용하여 10⁻⁹ ~ 10¹⁸의 숫자 범위를 포괄합니다.
- 분위수 통계 및 버킷 분포 정보를 동시에 반환합니다.
구문:
매개변수:
field: 숫자 필드
반환값:
| 열 이름 | 설명 |
| -------------- | ------------------ |
| lower_bounds | 각 버킷의 하한 배열 |
| upper_bounds | 각 버킷의 상한 배열 |
| counts | 각 버킷의 카운트 배열 |
| min | 최소값 |
| p50 | 중앙값 |
| p75 | 75분위수 |
| p90 | 90분위수 |
| p95 | 95분위수 |
| p99 | 99분위수 |
| max | 최대값 |
알고리즘 설명: 추정 히스토그램(로그 선형 보간)을 사용하며, 각 자릿수는 128개의 버킷으로 나뉩니다. 대용량 데이터의 분포 통계에 적합합니다.
사용 사례:
- 로그의 응답 시간 분포 분석
- Trace의 지연 시간 분포 통계
- 탐색적 데이터 분석, 버킷 경계 사전 설정 불필요
예제:
// Nginx 액세스 로그의 응답 시간 분포 분석
L::nginx:(histogram_auto(response_time)) [1h]
// 서비스별 요청 지연 시간 분포 통계
L::app_logs:(histogram_auto(duration)) [1h] BY service
// Trace 호출의 지연 시간 분포 통계
T::http_client:(histogram_auto(elapsed)) [1h] BY operation
결과 예시:
| lower_bounds | upper_bounds | counts | min | p50 | p75 | p90 | p95 | p99 | max |
|---|---|---|---|---|---|---|---|---|---|
| [0, 10, 100] | [10, 100, 1000] | [1000, 500, 100] | 0.5 | 45 | 120 | 280 | 450 | 850 | 1200 |
참고:
lower_bounds,upper_bounds,counts는 배열 유형이며 각 버킷의 경계와 카운트를 나타냅니다.
histogram(Deprecated)¶
지정된 버킷 경계의 히스토그램을 생성합니다. 이 함수는 Deprecated이며, histogram_auto로 대체하는 것이 좋습니다.
설명:
histogram은 버킷의 경계 매개변수를 수동으로 지정해야 하므로 사용이 유연하지 않습니다. histogram_auto는 데이터 분포에 자동으로 적응하고 더 넓은 숫자 범위를 포괄하며 더 풍부한 통계 정보를 반환합니다.
구문:
매개변수:
field: 숫자 필드left_bound: 왼쪽 경계right_bound: 오른쪽 경계bucket_size: 버킷 크기threshold(선택 사항): 단일 버킷 최소 카운트, 이 값보다 낮은 버킷은 반환되지 않습니다.
반환값:
두 개의 열을 반환합니다: bucket_le(버킷의 오른쪽 경계) 및 count(카운트)
예제:
// 0-1000ms 범위에서 100ms 간격의 히스토그램 생성
M::response_time:(histogram(duration, 0, 1000, 100)) [1h]
// histogram_auto로 대체 권장
M::response_time:(histogram_auto(duration)) [1h]
결과 예시:
| bucket_le | count |
|---|---|
| 100 | 1500 |
| 200 | 2800 |
| 300 | 3500 |
| ... | ... |
| 1000 | 5000 |
histogram_quantile¶
Prometheus 히스토그램 메트릭에서 분위수를 계산합니다.
특징:
- Prometheus에서 보고하는 히스토그램 유형 메트릭을 처리하는 데 특화되어 있습니다.
le레이블(또는 VictoriaMetrics의vmrange레이블)을 사용하여 버킷 경계를 식별합니다.- 입력 데이터는 누적 카운트(cumulative)여야 합니다.
구문:
매개변수:
field: 히스토그램 카운트 필드(예:http_request_duration_bucket)q: 분위수, 범위 0-1(예: 0.99는 P99를 의미)
사용 사례 비교:
| 사례 | 권장 함수 | 설명 |
|---|---|---|
| 로그의 응답 시간 분포 분석 | histogram_auto |
로그는 상세 데이터, 사전 집계 히스토그램 없음 |
| Prometheus 히스토그램 메트릭의 P99 분석 | histogram_quantile |
메트릭이 le 레이블로 사전 집계됨 |
| Trace 호출의 지연 시간 분포 통계 | histogram_auto |
Trace는 상세 데이터 |
le 레이블 처리 메커니즘:
histogram_quantile은 le 레이블(less than or equal)을 사용하여 히스토그램 버킷의 경계를 식별합니다.
- Prometheus 형식(기본값):
le레이블을 사용하여 버킷 상한을 직접 나타냅니다. le값은 숫자(예: "0.1", "1", "10") 또는 "+Inf"(무한대)입니다.-
데이터는 누적 카운트(cumulative)여야 합니다.
-
VictoriaMetrics 형식:
vmrange레이블을 사용하여 범위를 나타냅니다. - 형식:
"하한...상한"(예:"0.1...0.2") - 데이터는 범위 카운트(비누적)입니다.
- 함수는 자동으로 범위 카운트를 누적 카운트로 변환합니다.
계산 과정:
1. le 값으로 모든 버킷을 정렬합니다.
2. vmrange 형식인 경우 카운트를 누적하여 누적 분포로 변환합니다.
3. 버킷 카운트가 단조 증가하는지 확인합니다(이상 데이터 수정).
4. 선형 보간을 사용하여 목표 분위수를 계산합니다.
PromQL과의 차이점:
| 특성 | DQL | PromQL |
|---|---|---|
| 함수 유형 | 집계 함수 | 변환 함수 |
| 입력 데이터 | le 레이블이 있는 메트릭을 직접 읽음 |
sum(rate(...)) by (le)와 함께 사용해야 함 |
| 사용 방식 | histogram_quantile(field, 0.99) |
histogram_quantile(0.99, sum(rate(...)) by (le)) |
| 데이터 형식 | le 및 vmrange 두 가지 레이블 지원 |
le 레이블만 지원 |
| 그룹화 방식 | DQL의 BY 절을 통해 | by (le)를 통해 명시적으로 그룹화 |
동등 예제:
히스토그램 메트릭 http_request_duration_bucket이 있고 le 레이블(예: 0.1, 0.5, 1, 5, +Inf) 및 service 레이블이 있다고 가정합니다.
시나리오 1: P99 지연 시간 계산
DQL:
PromQL 동등:
시나리오 2: 각 서비스의 P95 지연 시간 계산(다중 그룹화)
DQL:
PromQL 동등:
시나리오 3: P50(중앙값) 및 P99 계산
DQL:
M::http_request_duration:(
histogram_quantile(duration_bucket, 0.50) as p50,
histogram_quantile(duration_bucket, 0.99) as p99
) [1h] BY service
PromQL 동등:
label_join(
histogram_quantile(0.50, sum(rate(http_request_duration_bucket[1h])) by (le, service)), "quantile", "", "0.50"
)
or
label_join(
histogram_quantile(0.99, sum(rate(http_request_duration_bucket[1h])) by (le, service)), "quantile", "", "0.99"
)
참고: PromQL은
label_join또는label_replace를 사용하여 다른 분위수의 결과를 구분해야 합니다.
주의사항:
- 입력 데이터에는
le또는vmrange레이블이 포함되어야 합니다. 그렇지 않으면 계산할 수 없습니다. +Inf버킷이 없으면 마지막 버킷의 상한이 최대값으로 사용됩니다.- 카운트가 0이거나 NaN인 버킷은 건너뜁니다.
- 분위수가 < 0이면 -Inf를 반환하고, > 1이면 +Inf를 반환합니다.
TopN 함수¶
top¶
가장 큰 값 중 상위 N개를 가져옵니다.
구문:
매개변수:
field: 숫자 필드n: 반환할 값의 수
예제:
// 응답 시간이 가장 긴 5개의 요청 가져오기
M::response_time:(top(duration, 5)) [1h] BY service
// 트래픽이 가장 많은 10개의 호스트 가져오기
M::network:(top(bytes, 10)) [1h]
결과 예시:
| service | top(duration, 5) |
|---|---|
| api | 1250 |
| api | 1180 |
| api | 1050 |
| api | 980 |
| api | 920 |
참고: 여러 행을 반환하며 각 행에는 하나의 TopN 값이 포함됩니다.
bottom¶
가장 작은 값 중 하위 N개를 가져옵니다.
구문:
매개변수:
field: 숫자 필드n: 반환할 값의 수
예제:
결과 예시:
| service | bottom(duration, 5) |
|---|---|
| api | 12 |
| api | 18 |
| api | 25 |
| api | 32 |
| api | 45 |
참고: 여러 행을 반환하며 각 행에는 하나의 BottomN 값이 포함됩니다.
값 수집 함수¶
distinct¶
필드의 모든 고유 값을 반환합니다.
구문:
예제:
결과 예시:
| endpoint | distinct(status) |
|---|---|
| /api/v1 | 200 |
| /api/v1 | 404 |
| /api/v1 | 500 |
| /health | 200 |
참고: 여러 행을 반환하며 각 행에는 하나의 고유 값이 포함됩니다.
distinct_by_collapse¶
폴딩 전략에 따라 필드의 고유 값을 가져오고 중복 제거 시 다른 필드의 마지막 값을 유지합니다.
구문:
매개변수:
field: 중복 제거 기준 필드last_fields(선택 사항): 마지막 값을 유지해야 하는 필드 목록
설명:
distinct와 달리 distinct_by_collapse는 중복 제거 시 다른 관련 필드의 정보(마지막 값)를 유지하므로 컨텍스트 정보를 유지해야 하는 시나리오에 적합합니다.
예제:
// 다른 사용자 ID 가져오기 및 각 사용자의 마지막 액세스 시간 유지
L::access_logs:(distinct_by_collapse(user_id, [timestamp])) [1h]
// 다른 호스트 가져오기 및 마지막 상태 및 메시지 유지
O::HOST:(distinct_by_collapse(host, [status, message])) [1h]
결과 예시:
| user_id | last(timestamp) | last(path) |
|---|---|---|
| user001 | 1704067200000 | /checkout |
| user002 | 1704067100000 | /product |
| user003 | 1704067000000 | /home |
참고: 중복 제거된 기본 필드 값과
last_fields에 지정된 다른 필드의 마지막 값을 반환합니다.
collect¶
모든 값(중복 포함)을 수집합니다.
구문:
매개변수:
field: 임의의 필드limit(선택 사항): 최대 수집 수
예제:
// 모든 응답 시간 수집
M::response_time:(collect(duration)) [1h] BY service
// 최대 100개의 값 수집
M::response_time:(collect(duration, 100)) [1h] BY service
결과 예시:
| service | collect(duration) |
|---|---|
| api | [120, 135, 98, 142, ...] |
| web | [45, 52, 48, 61, ...] |
참고: 배열 유형을 반환하며 수집된 모든 값(중복 값 포함 가능)을 포함합니다.
collect_distinct¶
모든 고유 값을 수집합니다.
구문:
매개변수:
field: 임의의 필드limit(선택 사항): 최대 수집 수
예제:
결과 예시:
| service | collect_distinct(error_type) |
|---|---|
| api | ["timeout", "connection refused", "404"] |
| web | ["200", "301", "404"] |
참고: 배열 유형을 반환하며 중복 제거된 모든 값을 포함합니다.
field_values¶
필드의 모든 값을 가져오고 배열 유형을 반환합니다.
구문:
예제:
결과 예시:
| metric_name | field_values(tags) |
|---|---|
| cpu_usage | ["host:A", "env:prod", "team:backend"] |
| memory_used | ["host:B", "env:staging", "team:frontend"] |
참고: 배열 유형을 반환하며 필드의 모든 값을 포함합니다.
필터 집계¶
count_filter¶
필드 값이 지정된 목록에 있는 개수를 계산합니다.
구문:
매개변수:
field: 임의의 필드values: 값 목록
예제:
// 특정 상태 코드의 요청 수 계산
M::http:(count_filter(status, [200, 201, 204])) [1h] BY endpoint
// 오류 수준 로그 계산
L::logs:(count_filter(level, ["error", "critical"])) [1h] BY service
보조 함수¶
default¶
필드가 비어 있을 때 기본값을 반환합니다.
구문:
매개변수:
field: 임의의 필드default_value: 기본값(숫자, 문자열, 불리언 또는 null일 수 있음)
예제:
시계열 함수¶
시계열 함수는 시간에 따라 변하는 데이터, 특히 Counter 유형의 메트릭을 처리하는 데 사용됩니다.
Rollup 함수¶
Rollup 함수는 시간 창에서 원시 시계열 데이터를 전처리하는 데 사용됩니다. 자세한 내용은 이 문서의 Rollup 함수를 참조하세요.
작성 방법 설명:
- Rollup은 시간 절(예:
[rate],[1h::5m:rate])에 작성됩니다. - 쿼리 외부에 작성된 경우(예:
rate(DQL))는 외부 함수이며 Rollup이 아닙니다. - Rollup 약식, Rollup 함수 호출 및 명시적 집계 호출의 실행 단계 및 매개변수 차이점은 DQL 기본 문서의 Rollup 함수를 참조하세요.
시간 절은 Rollup 약식을 지원하며 Rollup 함수에 추가 알고리즘 매개변수를 전달하는 것도 지원합니다(예:
[1h::1m:ewma(0.3)]). 시간 절의 매개변수는 알고리즘 매개변수만 나타내며 입력 필드는 여전히 Select 필드에 의해 결정됩니다. 여러 입력 필드가 필요한 함수는 Select 절에서 명시적 집계 호출을 사용해야 합니다.
Rollup 약식을 지원하는 함수:
| 함수 | 설명 |
|---|---|
rate |
증가율 계산(초당) |
irate |
순간 증가율 계산 |
increase |
증가량 계산 |
deriv |
미분 계산(변화율) |
difference |
차이 계산 |
non_negative_derivative |
음이 아닌 미분 계산 |
non_negative_difference |
음이 아닌 차이 계산 |
rate_over_sum |
초당 평균 계산 |
rate_over_count |
초당 카운트 계산 |
sum |
합계 |
avg |
평균값 |
min |
최소값 |
max |
최대값 |
count |
카운트 |
first |
첫 번째 값 |
last |
마지막 값 |
stddev |
표준 편차 |
mode |
최빈값 |
spread |
범위 |
any |
임의의 값 |
slope |
선형 추세 기울기 |
zscore |
최신 지점 Z-Score |
mad_score |
최신 지점 MAD 이상 점수 |
change_score |
시퀀스 변이 점수 |
Rollup 함수 호출을 지원하는 함수:
| 함수 | 설명 |
|---|---|
ewma(alpha) |
지수 가중 이동 평균 |
moving_average(n) |
이동 평균 |
percentile(p) |
백분위수 |
예제:
// 요청 QPS 계산
M::http_requests:(sum(request_count)) [1h::5m:rate] BY service
// 약식 형식
M::cpu:(max(usage)) [rate]
// 알고리즘 매개변수가 있는 Rollup 함수 호출
M::cpu:(avg(usage)) [1h::1m:ewma(0.3)] BY host
증가율 계산¶
rate¶
메트릭의 증가율(초당)을 계산합니다.
구문:
설명:
rate는 시간 창 내에서 Counter 메트릭의 평균 증가율을 계산합니다. 단조 증가하는 Counter 유형 메트릭의 경우 원시 값을 직접 사용하여 집계하는 것은 의미가 없으므로 먼저 증가율을 계산해야 합니다.
사용 사례:
- 요청 QPS 계산
- 데이터 쓰기 속도 계산
- 트래픽 증가 추세 분석
예제:
// 요청 QPS 계산
M::http_requests:(sum(request_count)) [rate] BY service
// 데이터 쓰기 속도 계산
M::data_ingestion:(sum(bytes)) [rate] BY source
irate¶
메트릭의 순간 증가율을 계산합니다.
구문:
설명:
rate와 달리 irate는 마지막 두 데이터 포인트만 사용하여 증가율을 계산하므로 순간 변화율을 반영하며 알림 시나리오에 더 적합합니다.
예제:
increase¶
메트릭의 증가량을 계산합니다.
구문:
설명:
increase는 증가율이 아닌 시간 창 내의 총 증가량을 반환합니다.
예제:
rate_over_sum¶
초당 평균값(sum / 시간 창(초))을 계산합니다.
구문:
설명:
sum(field) / 시간 창(초)와 동일하며 초당 평균값을 계산하는 데 사용됩니다. Rollup 단계에서 누적 값을 초당 속도로 변환하는 데 자주 사용됩니다.
rate와의 차이점:
rate: Counter의 증가율 계산(리셋 처리)rate_over_sum: sum을 시간 창(초)으로 나누는 간단한 계산
예제:
rate_over_count¶
초당 카운트(count / 시간 창(초))를 계산합니다.
구문:
설명:
count(field) / 시간 창(초)와 동일하며 초당 발생 횟수를 계산하는 데 사용됩니다.
예제:
차이 계산¶
이 섹션에서는 함수의 의미를 설명합니다. 동일한 함수는 Rollup으로 사용되거나(예: [rate], [increase]) 쿼리 내 표현식으로 사용될 수 있습니다(예: rate(field), increase(field)). 두 경우의 실행 단계가 다르므로 비즈니스 요구 사항에 따라 위치를 우선 선택합니다.
rate / deriv¶
변화율(미분)을 계산합니다. rate는 Counter 유형 메트릭(음수 값 무시)에 사용되고 deriv는 Gauge 유형 메트릭(음수 값 유지)에 사용됩니다.
별칭:
rate의 별칭은non_negative_derivative입니다.deriv의 별칭은derivative(PromQL 스타일)입니다.
구문:
// Counter 메트릭: 음이 아닌 변화율 계산(리셋으로 인한 음수 값 무시)
rate(field)
// Gauge 메트릭: 전체 변화율 계산(음수 값 포함)
deriv(field)
함수 선택:
| 함수 | 설명 | 사용 사례 |
|---|---|---|
rate |
음이 아닌 변화율만 계산 | Counter 유형 메트릭(단조 증가) |
deriv |
전체 변화율 계산(음수 값 포함) | Gauge 유형 메트릭(증감 가능) |
예제:
// Counter 메트릭: 요청 QPS 계산
M::requests:(rate(count)) [1h::5m] BY service
// Gauge 메트릭: 메모리 사용 변화율 계산
M::memory:(deriv(used)) [1h::5m] BY host
increase / difference¶
인접 값의 차이를 계산합니다. increase는 Counter 유형 메트릭(음수 값 무시)에 사용되고 difference는 Gauge 유형 메트릭(음수 값 유지)에 사용됩니다.
설명:
increase와difference는 두 개의 독립적인 함수이며 동작이 다르고 별칭 관계가 아닙니다.
구문:
// Counter 메트릭: 음이 아닌 차이 계산(리셋으로 인한 음수 값 무시)
increase(field)
// Gauge 메트릭: 전체 차이 계산(음수 값 포함)
difference(field)
함수 선택:
| 함수 | 설명 | 사용 사례 |
|---|---|---|
increase |
음이 아닌 차이만 계산 | Counter 유형 메트릭(단조 증가) |
difference |
전체 차이 계산(음수 값 포함) | Gauge 유형 메트릭(증감 가능) |
예제:
// Counter 메트릭: 요청 증가량 계산
M::requests:(increase(count)) [1h::5m] BY service
// Gauge 메트릭: 요청 수 변화(증가 또는 감소 가능)
M::requests:(difference(count)) [1h::5m] BY service
이동 계산¶
moving_average¶
이동 평균값을 계산합니다.
구문:
매개변수:
field: 숫자 필드n: 창 크기(데이터 포인트 수)
예제:
// 5점 이동 평균 계산
M::cpu:(moving_average(usage, 5)) [1h::1m] BY host
// Rollup 함수 호출: 먼저 각 시계열에 대해 5점 이동 평균을 계산한 다음 host별로 집계
M::cpu:(avg(usage)) [1h::1m:moving_average(5)] BY host
시계열 분석 집계¶
다음 함수는 쿼리 내에서 집계 함수로 사용되며 각 시간 창 및 그룹 내의 숫자 시퀀스에 대해 하나의 숫자 결과를 계산합니다.
ewma¶
지수 가중 이동 평균(EWMA)을 계산합니다. alpha는 평활 계수이며 명시적으로 전달해야 합니다.
구문:
매개변수:
field: 숫자 필드alpha: 평활 계수, 값 범위(0, 1]; 값이 클수록 최신 데이터 포인트의 가중치가 높아집니다.
설명:
ewma에는 암시적 기본alpha가 없으며ewma(field)는 오류를 반환합니다.- 시간 절에서 Rollup으로 사용될 때는
[...:ewma(alpha)]로 작성합니다. 시간 절의 매개변수는alpha만 전달하고 필드 이름은 전달하지 않습니다. ewma에는alpha가 필요하므로[...:ewma]와 같은 매개변수 없는 Rollup 약식을 지원하지 않습니다.
예제:
// 명시적 집계 호출: Select 집계 단계에서 EWMA 계산
M::cpu:(ewma(usage, 0.3)) [1h::1m] BY host
// Rollup 함수 호출: 먼저 각 시계열에 대해 EWMA를 계산한 다음 host별로 집계
M::cpu:(avg(usage)) [1h::1m:ewma(0.3)] BY host
slope¶
시간에 따른 시퀀스의 선형 추세 기울기를 계산합니다. 시간 단위는 초입니다.
구문:
설명:
- 최소 2개의 유효한 포인트가 필요합니다.
- 시간이 변경되지 않거나 유효한 포인트가 부족하면 null 값을 반환합니다.
예제:
zscore¶
창 내의 평균 및 표준 편차에 대한 최신 지점의 Z-Score를 계산합니다.
구문:
설명:
- 결과는
(latest - mean) / stddev입니다. - 최소 2개의 유효한 포인트가 필요합니다. 표준 편차가 0이면 null 값을 반환합니다.
예제:
// 이전 기록 창에 대한 최신 응답 시간의 편차 정도 평가 M::response_time:(zscore(duration)) [1h::5m] BY service
mad_score(field)**설명:**
- 중앙값과 MAD를 사용하여 최신 지점의 편차 정도를 측정하며 평균/표준 편차보다 극단값에 더 강건합니다.
- 최소 2개의 유효한 포인트가 필요합니다. MAD가 0이면 null 값을 반환합니다.
**예제:**
**설명:**
- 가능한 분할 지점을 열거하고 분할 지점 앞뒤 두 부분의 평균 차이를 비교한 후 합동 표준 편차로 정규화합니다.
- 최소 4개의 유효한 포인트가 필요합니다. 유효한 포인트가 부족하면 null 값을 반환합니다.
**예제:**
**설명:**
- 반환 값 범위는 일반적으로 `[-1, 1]`입니다.
- 최소 2개의 유효한 포인트 쌍이 필요합니다. 필드 중 하나에 변화가 없으면 null 값을 반환합니다.
- `corr`는 두 개의 입력 필드가 필요하므로 시간 절 Rollup 작성을 지원하지 않습니다.
**예제:**
---
## 변환 함수
변환 함수는 필드 값에 대한 수학 연산, 유형 변환 또는 문자열 처리를 수행하는 데 사용됩니다.
### 수학 함수
#### abs
절대값을 계산합니다.
**구문:**
// 백분율 반올림 M::cpu:(round(usage)) [1h] BY host
// 평균 응답 시간을 소수점 2자리로 반올림 L::log:(round(avg(duration), 2)) BY api
log(field) // 자연 로그 log2(field) // 밑이 2인 로그 log10(field) // 밑이 10인 로그 // 로그 변환된 값 계산 M::metrics:(log(value)) [1h] BY metric_name int(field) // 부호 있는 정수로 변환 uint(field) // 부호 없는 정수로 변환 float(field) // 부동 소수점으로 변환 string(field) // 문자열로 변환 bool(field) // 불리언으로 변환 // 문자열을 숫자로 변환 L::logs:(int(response_time)) [1h] BY service// 숫자를 문자열로 변환하여 연결 M::metrics:(string(value)) [1h] BY metric_name
lower(field) upper(field)**매개변수:**
- `field`: 문자열 필드
**반환값:**
변환된 대문자 문자열을 반환합니다.
---
#### trim
문자열 양쪽 끝의 공백 문자를 제거합니다.
**구문:**
**매개변수:**
- `field`: 문자열 필드
**반환값:**
양쪽 끝 공백이 제거된 문자열을 반환합니다.
---
#### ltrim
문자열 왼쪽의 공백 문자를 제거합니다.
**구문:**
**매개변수:**
- `field`: 문자열 필드
**반환값:**
왼쪽 공백이 제거된 문자열을 반환합니다.
---
#### rtrim
문자열 오른쪽의 공백 문자를 제거합니다.
**구문:**
**매개변수:**
- `field`: 문자열 필드
**반환값:**
오른쪽 공백이 제거된 문자열을 반환합니다.
---
#### length
문자열 길이(문자 수 기준)를 반환합니다.
**구문:**
**매개변수:**
- `field`: 문자열 필드
- `start`: 시작 위치(0부터 시작, 음수는 끝에서부터 시작을 의미)
- `length`(선택 사항): 부분 문자열 길이
**반환값:**
추출된 부분 문자열을 반환합니다.
**예제:**
// 마지막 10자 추출 L::logs:(substr(message, -10)) [1h]
**결과 예시:**
| message | substr(message, 0, 10) | substr(message, -5) |
| --------------------------- | ---------------------- | ------------------- |
| "Error: connection timeout" | "Error: con" | "eout" |
---
#### regexp_extract
정규 표현식 추출.
**구문:**
**매개변수:**
- `field`: 문자열 필드
- `pattern`: 정규 표현식
- `n`(선택 사항): n번째 캡처 그룹 추출, 기본값은 0(전체 일치)
**반환값:**
n번째 캡처 그룹의 내용을 포함하는 단일 문자열을 반환합니다. 일치하는 항목이 없으면 null을 반환합니다.
**예제:**
// IP 주소 추출 L::nginx:(regexp_extract(message, '(\d+.\d+.\d+.\d+)', 1)) [1h]
**결과 예시:**
| service | regexp_extract(message, 'error_code: (\\d+)', 1) |
| ------- | ------------------------------------------------ |
| api | "404" |
| api | "500" |
| web | null |
---
#### regexp_extract_all
모든 일치 결과를 추출합니다.
**구문:**
// 모든 IP 주소 추출 L::logs:(regexp_extract_all(message, '\d+.\d+.\d+.\d+', 0)) [1h]
**결과 예시:**
| message | regexp_extract_all(message, '\d+\.\d+\.\d+\.\d+', 0) |
| ------------------------------------ | ---------------------------------------------------- |
| Request from 192.168.1.1 to 10.0.0.1 | ["192.168.1.1", "10.0.0.1"] |
---
#### regexp_replace
정규 표현식을 사용하여 일치하는 텍스트를 바꿉니다.
**구문:**
**매개변수:**
- `field`: 문자열 필드
- `pattern`: 정규 표현식
- `replacement`: 바꿀 문자열; 캡처 그룹을 참조해야 하는 경우 `$1`, `${1}`, `$2` 등을 사용합니다. 캡처 그룹 뒤에 문자, 숫자 또는 밑줄이 오는 경우 `${1}`을 사용하여 모호성을 제거합니다(예: `${1}_suffix`). 리터럴 `$`를 출력해야 하는 경우 `$$`를 사용합니다.
**반환값:**
바꾼 후의 문자열을 반환합니다. 일치하는 항목이 없으면 원래 문자열을 반환합니다.
**예제:**
// 캡처 그룹을 사용하여 사용자 ID 정규화 L::logs:(regexp_replace(message, 'user=([0-9]+)', 'uid=$1') AS normalized) [1h]
md5(field) // 메시지의 MD5 계산 L::logs:(md5(message)) [1h]**결과 예시:**
| service | md5(message) |
| ------- | -------------------------------- |
| api | 5d41402abc4b2a76b9719d911017c592 |
| web | 098f6bcd4621d373cade4e832627b4f6 |
---
#### concat
문자열 연결.
**구문:**
// 결과: "api:error", "web:info" 등
**결과 예시:**
| service | level | concat(service, ":", level) |
| ------- | ----- | --------------------------- |
| api | error | "api:error" |
| web | info | "web:info" |
---
#### set
배열 필드를 중복 제거하고 정렬합니다.
**구문:**
// collect 결과 중복 제거 set(M::http:(collect(status)) [1h] BY endpoint)
**결과 예시:**
| metric_name | set(tags) |
| ----------- | ------------------------------------------ |
| cpu_usage | ["env:prod", "host:A", "team:backend"] |
| memory_used | ["env:staging", "host:B", "team:frontend"] |
---
### 로그 클러스터링
#### drain
Drain 알고리즘을 사용하여 유사한 로그를 동일한 클래스로 그룹화하고 해당 클래스의 대표 로그 샘플을 반환합니다.
**구문:**
**매개변수:**
- `field`: 문자열 필드 또는 문자열 표현식, 일반적으로 `message`
- `similarity_threshold`: 유사도 임계값, 범위 `(0, 1]`; 값이 클수록 더 유사한 로그만 동일한 클래스로 그룹화됩니다.
- `max_clusters`: 선택 사항, 최대 클러스터 수, 범위 `[1, 10000]`; 생략 시 기본값은 `1000`입니다.
**반환값:**
문자열 유형의 대표 로그 샘플을 반환합니다. 샘플은 클러스터가 생성될 때의 원래 로그이며 Drain이 내부적으로 유지 관리하는 일반화된 템플릿이 아닙니다.
**알고리즘 설명:**
Drain은 구문 분석 트리 기반의 로그 클러스터링 알고리즘입니다. 함수는 실행 과정에서 지속적으로 클러스터러를 훈련합니다. 새 로그가 기존 클러스터와 일치하면 해당 클러스터의 대표 샘플을 반환하고, 일치하지 않으면 새 클러스터를 생성하고 현재 로그를 해당 클러스터의 대표 샘플로 설정합니다.
**사용 사례:**
- 유사한 로그 그룹별 통계
- 비정상 로그 클러스터 분석
- 로그 노이즈 감소
**예제:**
// max_clusters 생략 시 기본 최대 1000개 클러스터 L::logs:(count(*)) [1h] BY drain(message, 0.9) AS sample
// 먼저 여러 필드를 연결한 후 클러스터링할 수도 있음 L::logs:(count(*)) [1h] BY drain(concat(service, " ", message), 0.7) AS sample
**결과 예시:**
| sample | count(*) |
| --------------------------------------------------- | -------- |
| "Request from 192.168.1.1 to /api/users took 35 ms" | 128 |
| "Query SELECT * FROM orders executed in 18 ms" | 42 |
---
## 매칭 함수
매칭 함수는 WHERE 절에서 텍스트 매칭에 사용되며 불리언 값을 반환하는 표현식으로도 사용할 수 있습니다.
### 부분 문자열 매칭
#### match
필드에 지정된 부분 문자열이 포함되어 있는지 확인합니다.
**구문:**
// 약식 형식 L::logs:(message) {match("error")} [1h]
// 표현식으로 사용 L::logs:(match(message, "timeout")) [1h] BY match_result
search(query) search(field, query)**매개변수:**
- `query`: 검색 구문
- `field`: 필드 이름(선택 사항)
**매칭 규칙:**
- 중국어: 문자 단위로 분석하여 매칭
- 영어: 단어 경계별 매칭(공백, 구두점으로 구분)
- 대소문자 구분하지 않음
- 비어 있지 않은 `query`가 정확히 한 쌍의 큰따옴표만 포함하고 큰따옴표가 전체 값을 감싸는 경우 구문 매칭으로 처리: 각 분석 단어가 인접하고 순서가 일치해야 함; 큰따옴표는 매칭 내용에 포함되지 않음
- 위 큰따옴표 특수 형식에서 공백 또는 구두점만 포함된 내용은 여전히 연속 리터럴 값으로 매칭
- 빈 쿼리 `""`는 위 특수 형식에 해당하지 않으며 일반 분석 검색 매개변수로 처리
- 큰따옴표가 포함된 다른 형식은 모두 합법적인 일반 분석 검색 매개변수로 처리되며 특별히 해석되지 않음. 예를 들어 한쪽 큰따옴표만 있는 경우, 값에 추가 큰따옴표가 포함된 경우 또는 큰따옴표가 양쪽 끝에 없는 경우
**예제:**
// 중국어 매칭 L::logs:(message) {search("연결 시간 초과")} [1h]
// 중/영문 혼합 L::logs:(message) {search("error 오류")} [1h]
// 인접하고 순서가 일치하는 구문 매칭; "build succeeded, parse error"는 매칭되지 않음 L::logs:(message) {search("\"build error\"")} [1h]
// 구두점만 포함된 경우 직접 연속 리터럴 부분 문자열로 매칭 L::logs:(message) {search("\"---\"")} [1h]
re(pattern) re(field, pattern) regex(pattern) regex(field, pattern) regexp(pattern) regexp(field, pattern) // error로 시작하는 로그 매칭, ERROR로 시작하는 로그는 매칭되지 않음 L::logs:(message) {re("error.*")} [1h]// 특정 형식의 오류 코드 매칭 L::logs:(message) {regexp(message, "ERR-\d{4}")} [1h]
// 데이터 소스에서 정규 표현식 사용 M::re('cpu.'):(usage) [1h] wildcard(pattern) wildcard(field, pattern) // error로 시작하는 메시지 매칭, ERROR로 시작하는 메시지는 매칭되지 않음 L::logs:(message) {wildcard("error")} [1h]
// 특정 형식 매칭 L::logs:(message) {wildcard(message, "ERR-????")} [1h]
cidr(cidr) cidr(field, cidr) // 내부 네트워크 IP 매칭 L::nginx:(*) {cidr(client_ip, "10.0.0.0/8")} [1h]// 특정 네트워크 세그먼트 매칭 L::nginx:(*) {cidr(client_ip, "192.168.1.0/24")} [1h]
---
### 필드 존재 확인
#### exists
필드가 존재하는지 확인합니다. `exists()`는 특수 자리 표시자이며 일반적으로 비교 표현식의 오른쪽에 사용됩니다.
**구문:**
// error_type 필드가 없는 로그 찾기 L::logs:(message) {error_type != exists()} [1h]
query_string(query) query_string(field, query) foo # foo를 포함하는 내용 매칭 "foo bar" # 정확한 구문 매칭, 연속으로 나타나야 함 foo bar # 공백 이스케이프, "foo bar" 전체를 매칭 foo* # foo로 시작하는 내용 매칭 foo?bar # ?는 단일 문자 매칭 "foobar" # 따옴표 안의 와일드카드는 해석되지 않고 리터럴로 매칭 /foo.bar/ # 슬래시로 감싼 정규 표현식 /joh?n(ath[oa]n)/ # 복잡한 정규 표현식 foo AND bar # 논리 AND, 둘 다 포함해야 함 foo OR bar # 논리 OR, 하나 이상 포함 NOT foo # 논리 NOT, foo를 포함하지 않음약식 형식¶
foo && bar # foo AND bar와 동일 foo || bar # foo OR bar와 동일 !foo # NOT foo와 동일
(foo OR bar) AND baz # 괄호를 사용하여 우선 순위 변경 !(status 429 reading) # 전체 표현식 부정 foo bar # foo OR bar와 동일##### 7. 분석 규칙
queryString 함수의 구체적인 동작은 현재 워크스페이스에서 사용 중인 기본 저장소 엔진에 따라 다릅니다.
- ScopeDB 환경: queryString은 대소문자를 구분하지 않는 포함 검색을 수행합니다. 즉, 필드 값에 쿼리 문자열의 임의 하위 문자열이 포함되어 있는지 매칭하며 분석을 포함하지 않습니다.
- Doris 환경: queryString은 전체 텍스트 인덱스 분석을 기반으로 매칭하며 그 의미는 분석 결과와 직접적으로 관련됩니다. Doris에서 사용하는 분석기는 [Unicode Standard Annex #29의 기본 단어 경계 사양](./funcs-unicode.md)을 따릅니다.
##### 예제
// 불리언 조합 L::logs:(message) {query_string("error AND NOT timeout")} [1h]
// 정규 표현식 L::logs:(message) {query_string("/ERR-\d{4}/")} [1h]
// 복잡한 쿼리 L::logs:(message) {query_string("(error OR warn) AND service")} [1h]
// 특정 필드 지정 L::logs:(*) {query_string(message, "error AND timeout")} [1h]
// 중국어 쿼리 L::logs:(message) {query_string("오류 AND 시간 초과")} [1h]
---
## 외부 함수
> **사용 권장 사항:** 외부 함수는 레거시 설계입니다. Rollup + 집계 함수(예: `[rate]`, `[last]`, `[increase]` 등)로 해결할 수 있는 시나리오는 **Rollup 방식을 우선 사용**합니다. 외부 함수는 Rollup이 적용되지 않는 시나리오(예: 집계 결과에 대한 2차 계산이 필요한 경우)에서만 사용합니다. `dbscan`, `forecast`와 같이 전체 쿼리 결과가 필요한 중심 감지/예측 함수는 동등한 Rollup 작성 방법이 없으므로 외부 함수로 사용합니다.
외부 함수는 전체 DQL 쿼리 결과에 대해 작동하며 쿼리 출력의 시계열 데이터에 대한 2차 계산을 수행하는 데 사용됩니다. 외부 함수는 전체 DQL 표현식을 감싸며 Select 절 내부에 작성되지 않습니다.
### 쿼리 내 함수와 외부 함수
- **쿼리 내 함수**: DQL 표현식 내부에서 사용되는 함수(예: `sum`, `avg`, `max` 등)
- **외부 함수**: 전체 DQL 쿼리 결과를 감싸서 출력 시계열을 후처리하는 함수
**작성 방법 비교:**
```dql
// Rollup(시간 절): 먼저 각 시계열에 대해 증가율을 계산한 다음 집계
M::http_requests:(sum(request_count)) [rate] BY service
// 외부 함수: 먼저 쿼리 결과를 얻은 다음 2차 계산 수행
rate(M::http_requests:(sum(request_count)) [1h::1m] BY service)
구문:
예제:
// 쿼리 내 함수: 원시 데이터의 평균 계산
M::cpu:(avg(usage)) [1h::5m] BY host
// 외부 함수: 쿼리 결과에 대한 이동 평균 계산
moving_average(M::cpu:(avg(usage)) [1h::5m] BY host, 5)
누적 계산¶
cumsum¶
누적 합계를 계산하며 시계열의 각 포인트에 대해 앞의 모든 포인트의 누적 값을 계산합니다.
구문:
예제:
차이와 미분¶
권장 사용: 이러한 함수는 Rollup 함수(예:
[rate],[deriv])로 우선 사용하는 것이 좋으며, 외부 함수 형식은 집계 결과에 대한 2차 계산에만 사용합니다.
다음 함수는 외부 함수로 사용할 수 있습니다.
| 함수 | 설명 |
|---|---|
derivative(DQL) |
미분 계산(변화율) |
difference(DQL) |
이전 값과의 차이 계산 |
non_negative_derivative(DQL) |
음이 아닌 미분 계산 |
non_negative_difference(DQL) |
음이 아닌 차이 계산 |
rate(DQL) |
증가율 계산(초당) |
irate(DQL) |
순간 증가율 계산 |
예제:
// 외부 함수: 쿼리 결과에 대한 미분 계산
derivative(M::cpu:(avg(usage)) [1h::5m] BY host)
// 권장: Rollup 방식 사용
M::cpu:(deriv(usage)) [1h::5m:last] BY host
이동 계산¶
moving_average¶
쿼리 결과에 대한 이동 평균 계산.
권장 사용: Rollup 방식
moving_average(field, n)을 우선 사용하며, 외부 함수 형식은 집계 결과에 대한 2차 평활화에만 사용합니다.
구문:
매개변수:
DQL_expression: DQL 쿼리 표현식n: 창 크기(데이터 포인트 수)
예제:
// 외부 함수: 쿼리 결과에 대한 이동 평균 계산
moving_average(M::cpu:(avg(usage)) [1h::1m] BY host, 5)
// 권장: Rollup 방식 사용
M::cpu:(moving_average(usage, 5)) [1h::1m] BY host
시계열 분석 및 이상 감지¶
dbscan¶
쿼리 결과의 숫자 시계열에 대해 DBSCAN 이상값 감지를 수행하고 숫자형 이상 마커를 출력합니다.
구문:
매개변수:
DQL_expression: DQL 쿼리 표현식. 일반적으로 시간 창 및BY그룹화가 있는 다중 시계열 쿼리 결과에 사용됩니다.eps: 이웃 거리 임계값, 선택 사항, 기본값0.5, 값 범위(0, 3.0].
반환값:
- 각 숫자 열에 대해 해당
dbscan(column)숫자 열을 출력합니다. 1은 이상값,0은 정상값을 나타냅니다.- 유효한 숫자 포인트가 5개 미만이면 null 값을 반환하여 샘플이 부족하여 감지가 수행되지 않았음을 나타냅니다.
설명:
- 최소 5개의 유효한 숫자 포인트가 필요합니다. 유효한 포인트가 부족하면 null 값을 반환합니다.
- 현재 구현은 입력 테이블의 각 숫자 열에 대해 1차원 DBSCAN을 각각 수행하고 시간 열을 유지합니다.
예제:
// 기본 eps=0.5를 사용하여 CPU 사용률 이상값 감지
dbscan(M::cpu:(avg(usage)) [1h::5m] BY host)
// eps 명시적 지정
dbscan(M::cpu:(avg(usage)) [1h::5m] BY host, 0.8)
forecast¶
쿼리 결과의 숫자 시계열에 대한 선형 추세 예측을 수행하고 미래 시점의 예측 값을 출력합니다.
구문:
매개변수:
DQL_expression: DQL 쿼리 표현식steps: 예측 단계 수, 선택 사항, 기본값5, 양의 정수여야 함
반환값:
- 미래
steps시간 포인트를 출력합니다. - 각 숫자 열은 해당
forecast(column)숫자 열을 출력합니다. - 숫자가 아닌 열은 예측에 참여하지 않습니다.
설명:
- 현재 구현은 선형 추세 예측을 사용합니다.
- 유효한 숫자 포인트가 2개 미만이면 null 값을 반환합니다.
예제:
// 미래 5개 시간 포인트 예측
forecast(M::cpu:(avg(usage)) [1h::5m] BY host)
// 미래 3개 시간 포인트 예측
forecast(M::cpu:(avg(usage)) [1h::5m] BY host, 3)
TopN¶
top / bottom¶
권장 사용: Rollup 방식
top(field, n)또는bottom(field, n)을 우선 사용하며, 외부 함수 형식은 집계 결과에 대한 2차 필터링에만 사용합니다.
쿼리 결과에 대한 TopN 또는 BottomN을 가져옵니다.
구문:
예제:
// 외부 함수: 쿼리 결과에 대한 TopN 가져오기
top(M::response_time:(max(duration)) [1h::5m] BY service, 5)
// 권장: Rollup 방식 사용
M::response_time:(top(duration, 5)) [1h::5m] BY service
null 값 채우기¶
fill¶
쿼리 결과의 null 값을 채웁니다.
자세한 내용은 fill 함수를 참조하세요.
예제:
// 0으로 null 값 채우기
fill(M::cpu:(avg(usage)) [1h::5m] BY host, 0)
// 선형 보간 채우기
fill(M::cpu:(avg(usage)) [1h::5m] BY host, LINEAR)
기타 외부 함수¶
다음 함수도 외부 함수로 사용할 수 있습니다.
| 함수 | 설명 |
|---|---|
abs(DQL) |
절대값 |
round(DQL[, digits]) |
반올림 |
ceil(DQL) |
올림 |
floor(DQL) |
내림 |
log(DQL) / log2(DQL) / log10(DQL) |
로그 변환 |
set(DQL) |
중복 제거 및 정렬 |
concat(DQL, ...) |
문자열 연결 |
조합 사용¶
외부 함수는 조합하여 사용할 수 있습니다.
// 이동 평균 계산 후 반올림
round(moving_average(M::cpu:(avg(usage)) [1h::1m] BY host, 5))
// 증가율의 이동 평균 계산
moving_average(rate(M::requests:(sum(count)) [1h::5m] BY service), 3)
eval 표현식 계산¶
eval은 쿼리 외부에서 표현식 계산을 허용하는 특수 함수이며 여러 하위 쿼리의 결과를 참조하여 조합 연산을 수행할 수 있습니다.
구문¶
매개변수:
expression: 수학 표현식,name.field를 사용하여 하위 쿼리 결과 참조name=(query): 명명된 하위 쿼리alias: 결과 별칭(선택 사항)
설명:
eval은name="query"와 같은 레거시 작성 방법도 호환되지만 유형 표현 및 가독성 측면에서name=(query)를 사용하는 것이 좋습니다.
작동 원리¶
- 명명된 모든 하위 쿼리 실행
- 각 하위 쿼리 결과를 시간별로 정렬
- 각 시간 포인트에 대해 표현식 계산
- 계산 결과 반환
사용 사례¶
- 여러 메트릭의 비율 계산(예: 오류율, 사용률)
- 다른 시간대의 메트릭 비교
- 여러 데이터 소스의 계산 결과 조합
예제¶
오류율 계산¶
// 오류율 = 오류 수 / 총 요청 수 * 100 계산
eval(a / b * 100,
a=(M::http:(sum(error_count)) [1h] BY service),
b=(M::http:(sum(request_count)) [1h] BY service),
alias="error_rate")
CPU 사용률 계산¶
// 사용률 = used / total * 100
eval(used / total * 100,
used=(M::memory:(sum(used_bytes)) [1h] BY host),
total=(M::memory:(sum(total_bytes)) [1h] BY host),
alias="memory_usage_percent")
기준선 비교 증가율 계산¶
// 현재 값의 기준선 값에 대한 증가율 계산
eval(current / baseline - 1,
current=(M::sales_current:(sum(amount)) [7d]),
baseline=(M::sales_baseline:(sum(amount)) [7d]),
alias="growth_rate")
하위 쿼리 필드 참조¶
// 하위 쿼리의 특정 필드 참조
eval(a.usage / b.total * 100,
a=(M::cpu:(avg(usage) as usage) [1h] BY host),
b=(M::cpu:(avg(total) as total) [1h] BY host),
alias="cpu_percent")
주의사항¶
- 모든 하위 쿼리의 시간 창은 호환 가능해야 합니다.
- 하위 쿼리의 그룹화 차원은 일관되어야 합니다.
- 표현식에서 참조하는 필드 이름은
name.field형식을 사용합니다. - 하위 쿼리가 하나만 있는 경우 필드 이름을 직접 사용할 수 있습니다.
기타 함수¶
fill¶
쿼리 결과의 null 값을 지정된 값으로 채웁니다.
권장 사용 방식:
fill은 외부 함수로 사용하여 전체 쿼리 결과에 대해 작동하는 것이 좋습니다.Select 절에서
fill(avg(usage), 0)작성 방법도 지원되지만fill은 실제로 집계가 완료된 후 결과를 채우므로 외부 함수 형식이 작동 메커니즘에 더 부합합니다.
구문(외부 함수):
매개변수:
DQL_expression: DQL 쿼리 표현식value: 채우기 값, 여러 모드 지원:- 특정 값: 숫자, 문자열, null
LINEAR: 선형 보간PREVIOUS: 이전 null이 아닌 값으로 채우기
예제:
// 권장: 외부 함수로 사용
fill(M::cpu:(avg(usage)) [1h::5m] BY host, 0)
// 선형 보간 채우기
fill(M::cpu:(avg(usage)) [1h::5m] BY host, LINEAR)
// 이전 값으로 채우기
fill(M::cpu:(avg(usage)) [1h::5m] BY host, PREVIOUS)
now¶
현재 시간 스탬프(밀리초)를 반환합니다.
구문:
예제:
unwrap¶
집계 결과의 래핑을 해제합니다.
구문:
예제:
Show 함수¶
Show 함수는 메타데이터(예: measurement, tag, field, 카디널리티 및 시리즈 수)를 보는 데 사용되며 모델링 문제 해결 및 쿼리 전 탐색에 자주 사용됩니다.
일반 구문¶
where,time_window,LIMIT,OFFSET은 모두 선택 사항입니다.LIMIT/OFFSET은 음수일 수 없습니다.
M 네임스페이스 내장 Show 함수¶
| 함수 | 매개변수 | 반환 열 | 설명 |
|---|---|---|---|
show_measurement |
선택 사항 re('pattern') |
name |
measurement 나열 |
show_tag_key |
선택 사항 from=['measurement'] |
tagKey |
tag key 나열 |
show_field_key |
선택 사항 from=['measurement'] |
fieldKey, fieldType |
field key 나열(현재 fieldType은 float) |
show_tag_value |
keyin=['tagKey'](필수), 선택 사항 from |
key, value |
tag value 나열 |
show_measurement_cardinality |
필수 매개변수 없음 | count |
measurement 수 |
show_series_cardinality |
필수 매개변수 없음 | count |
series 카디널리티(추정) |
show_tag_key_cardinality |
필수 매개변수 없음 | count |
tag key 카디널리티(추정) |
show_tag_value_cardinality |
keyin=['tagKey'](필수) |
count |
지정된 tag key의 value 카디널리티(추정) |
show_field_key_cardinality |
필수 매개변수 없음 | count |
field key 카디널리티(추정) |
show_series_count_by_field_key |
from=['measurement'](권장) |
name, count |
field key별 series 수 통계 |
show_series_count_by_tag_key |
from=['measurement'](권장) |
name, count, value_count |
tag key별 series 수 및 value 수 통계 |
show_series_count_by_tag_value |
keyin=['tagKey'](필수), from=['measurement'](권장) |
name, count |
지정된 tag key의 value별 series 수 통계 |
카디널리티 관련 함수는 내부적으로 HyperLogLog 병합을 사용하며 반환 값은 추정값입니다.
M이 아닌 네임스페이스 Show 함수(접미사 모드)¶
M이 아닌 네임스페이스의 경우 다음 접미사 모드를 지원합니다.
show_<namespace>_sourceshow_<namespace>_classshow_<namespace>_typeshow_<namespace>_fieldshow_<namespace>_label
여기서 <namespace>는 함수 이름의 중간 부분에서 자동으로 매핑됩니다. 예:
show_logging_source->Lshow_tracing_field->Tshow_object_source->O
일반적인 예:
show_logging_source()
show_tracing_field('mysql')
show_logging_field('*')
show_logging_label(name='env')
show_logging_label(names=['env', 'team'])
매개변수 및 동작 설명¶
from: measurement 목록, 문자열 또는 문자열 배열 지원.keyin: tag key 목록, 문자열 또는 문자열 배열 지원.field: field 목록, 문자열 또는 문자열 배열 지원(metric show의 field 필터링에 사용).show_*_field의 경우:- 명명되지 않은 매개변수(예:
'mysql')는 일반적으로 source 필터로 사용됩니다. '*'는 source를 지정하지 않는 것과 동일합니다.- 명명된 매개변수는 where 필터 조건으로 변환됩니다.
show_*_label의 경우:- 명명된 매개변수가 필요합니다.
names는name의 별칭으로 처리됩니다.
제약 조건 및 주의사항¶
show_tag_value와show_tag_value_cardinality는keyin을 제공해야 합니다.show_series_count_by_tag_value는keyin을 제공해야 합니다.show_series_count_by_*는from을 제공하거나 where에서 동등한 source 제약 조건(예:@__source__조건)을 제공해야 합니다.show_<namespace>_source,show_<namespace>_class,show_<namespace>_type은 현재 동일한 실행 경로를 공유하며 source 중복 제거 목록을 반환합니다.- 현재 parser는
show_<namespace>_index구문을 지원하지 않습니다(실행 계층에 해당 분기가 있어도). - Query API가 show 시간 범위를 제공하지 않으면 일부 로그 show 쿼리는 최근 30분 창으로 대체되어 실행됩니다.
반환 예시¶
다음 예시는 일반적인 열 구조와 예시 행만 보여줍니다. 실제 결과는 테넌트 데이터, 필터 조건, 시간 범위 및 LIMIT/OFFSET의 영향을 받습니다.
| 쿼리 | 일반적인 열 | 예시 행(의미) |
|---|---|---|
show_measurement() |
name |
cpu, disk, memory |
show_tag_value(from=['cpu'], keyin=['host']) |
key, value |
host, web-01; host, web-02 |
show_series_count_by_tag_key(from=['cpu']) |
name, count, value_count |
host, 3200, 120; service, 2800, 35 |
show_tag_value_cardinality(keyin=['host']) |
count |
120 |
show_logging_field('*') |
fieldKey, fieldType, fieldIndices |
service, keyword, ["idx_service"] |
show_logging_source() |
source |
nginx, mysql, redis |
함수 분류 빠른 참조표¶
기본 집계¶
| 함수 | 설명 | 정확/추정 |
|---|---|---|
| sum | 합계 | 정확 |
| avg | 평균값 | 정확 |
| count | 카운트 | 정확 |
| count_distinct | 중복 제거 카운트 | 추정 (HyperLogLog, 오차≈0.4%) |
| min / max | 최소/최대값 | 정확 |
| first / last | 첫 번째/마지막 값 | 정확 |
| any | 임의의 값 | 정확 |
통계 집계¶
| 함수 | 설명 | 정확/추정 |
|---|---|---|
| percentile / pXX | 백분위수 | 추정 (로그 히스토그램) |
| median | 중앙값 | 추정 |
| stddev | 표준 편차 | 정확 |
| mode | 최빈값 | 정확 |
| spread | 범위 | 정확 |
| count_series | 시계열 수 | 정확 |
시계열 분석 집계¶
| 함수 | 설명 | 비고 |
|---|---|---|
| ewma | 지수 가중 이동 평균 | [...:ewma(alpha)] 지원 |
| slope | 선형 추세 기울기 | Rollup 약식으로 사용 가능 |
| zscore | 최신 지점 Z-Score | Rollup 약식으로 사용 가능 |
| mad_score | 최신 지점 MAD 이상 점수 | Rollup 약식으로 사용 가능 |
| change_score | 시퀀스 변이 점수 | Rollup 약식으로 사용 가능 |
| corr | 두 필드 Pearson 상관 계수 | 두 개의 입력 필드 필요 |
필터 집계¶
| 함수 | 설명 | 정확/추정 |
|---|---|---|
| top / bottom | TopN / BottomN | 정확 |
| count_filter | 조건 카운트 | 정확 |
히스토그램 함수¶
| 함수 | 설명 | 적용 데이터 소스 | 정확/추정 |
|---|---|---|---|
| histogram_auto | 자동 히스토그램(권장) | 로그, Trace 상세 데이터 | 추정 |
| histogram | 고정 버킷 경계 히스토그램(Deprecated) | 로그, Trace 상세 데이터 | 정확 |
| histogram_quantile | Prometheus 히스토그램에서 분위수 계산 | Prometheus 메트릭 | 추정 |
집합 함수¶
| 함수 | 설명 | 정확/추정 |
|---|---|---|
| distinct | 중복 제거 값 목록 | 정확 |
| distinct_by_collapse | 폴딩 중복 제거(다른 필드 유지) | 정확 |
| collect | 모든 값 수집 | 정확 |
| collect_distinct | 중복 제거된 값 수집 | 정확 |
보조 함수¶
| 함수 | 설명 | 정확/추정 |
|---|---|---|
| default | 기본값 설정 | 정확 |
시계열 함수¶
| 함수 | 설명 |
|---|---|
| rate | 증가율(초당) |
| irate | 순간 증가율 |
| increase | 증가량 |
| derivative | 미분 |
| difference | 차이 |
| non_negative_derivative | 음이 아닌 미분 |
| non_negative_difference | 음이 아닌 차이 |
| moving_average | 이동 평균 |
| cumsum | 누적 합계 |
| ewma | 지수 가중 이동 평균 |
| slope | 추세 기울기 |
| zscore | 최신 지점 Z-Score |
| mad_score | MAD 이상 점수 |
| change_score | 변이 점수 |
| corr | 상관 계수 |
Rollup 함수¶
| 함수 | 설명 |
|---|---|
rate |
증가율 계산(초당) |
irate |
순간 증가율 계산 |
increase |
증가량 계산 |
rate_over_sum |
초당 평균 계산 |
rate_over_count |
초당 카운트 계산 |
deriv |
미분 계산(derivative) |
difference |
차이 계산(difference) |
sum |
합계 |
avg |
평균값 |
min |
최소값 |
max |
최대값 |
count |
카운트 |
first |
첫 번째 값 |
last |
마지막 값 |
stddev |
표준 편차 |
mode |
최빈값 |
spread |
범위 |
any |
임의의 값 |
ewma(alpha) |
지수 가중 이동 평균 |
moving_average(n) |
이동 평균 |
percentile(p) |
백분위수 |
slope |
선형 추세 기울기 |
zscore |
최신 지점 Z-Score |
mad_score |
최신 지점 MAD 이상 점수 |
change_score |
시퀀스 변이 점수 |
변환 함수¶
| 함수 | 설명 |
|---|---|
| abs | 절대값 |
| round / ceil / floor | 반올림 |
| log / log2 / log10 | 로그 |
| int / uint / float / string / bool | 유형 변환 |
| substr | 부분 문자열 |
| regexp_extract | 정규 표현식 추출 |
| regexp_extract_all | 정규 표현식 전체 추출 |
| regexp_replace | 정규 표현식 바꾸기 |
| md5 | MD5 해시 |
| concat | 문자열 연결 |
| set | 배열 중복 제거 정렬 |
| drain | 로그 클러스터링 |
매칭 함수¶
| 함수 | 설명 |
|---|---|
| match | 부분 문자열 매칭 |
| phrase / search | 분석 구문 매칭 |
| re / regex / regexp | 정규 표현식 매칭 |
| wildcard | 와일드카드 매칭 |
| cidr | CIDR 네트워크 세그먼트 매칭 |
| query_string | 쿼리 문자열 구문 |
| exists | 필드 존재 확인 |
외부 함수¶
| 함수 | 설명 |
|---|---|
| cumsum | 누적 합계 |
| rate / irate | 증가율(음이 아닌) |
| deriv | 미분(음수 허용) |
| increase | 증가량(음이 아닌) |
| difference | 차이(음수 허용) |
| moving_average | 이동 평균 |
| top / bottom | TopN |
| dbscan | DBSCAN 이상값 감지 |
| forecast | 선형 추세 예측 |
| fill | null 값 채우기(외부 사용 권장) |
| abs / round / ceil / floor | 수학 연산 |
| set | 중복 제거 정렬 |
| concat | 문자열 연결 |
표현식 계산¶
| 함수 | 설명 |
|---|---|
| eval | 다중 쿼리 표현식 계산 |