콘텐츠로 이동

DQL 함수 참조


DQL은 데이터 집계, 변환 및 매칭을 위한 다양한 함수를 제공합니다. 이 문서에서는 각 함수의 의미, 매개변수 및 사용 방법을 자세히 설명합니다.

집계 함수

집계 함수는 여러 행의 데이터를 단일 값으로 집계하며, 일반적으로 시간 창(time-expr) 및 그룹화(BY 절)와 함께 사용됩니다.

기본 집계

sum

필드 값의 합계를 계산합니다.

구문:

sum(field)

매개변수:

  • field: 숫자 필드

예제:

// 총 요청 수 계산
M::http_requests:(sum(request_count)) [1h]

// 서비스별로 그룹화하여 총 요청 수 계산
M::http_requests:(sum(request_count)) [1h] BY service

avg

필드 값의 평균을 계산합니다.

구문:

avg(field)

매개변수:

  • field: 숫자 필드

예제:

// 평균 응답 시간 계산
M::response_time:(avg(duration)) [1h] BY endpoint

// 평균 CPU 사용률 계산
M::cpu:(avg(usage)) [1h] BY host

count

데이터 행 수를 계산합니다.

구문:

count(field)
count(*)

매개변수:

  • field: 임의의 필드, null이 아닌 값의 수를 계산합니다.
  • *: 모든 행 수를 계산합니다.

예제:

// 로그 수 계산
L::nginx:(count(*)) [1h]

// 응답 시간이 있는 요청 수 계산
M::response_time:(count(duration)) [1h] BY service

min / max

필드의 최소값 또는 최대값을 계산합니다.

구문:

min(field)
max(field)

매개변수:

  • field: 숫자 필드

예제:

// 최대 응답 시간 찾기
M::response_time:(max(duration)) [1h] BY endpoint

// CPU 사용률 범위 찾기
M::cpu:(min(usage), max(usage)) [1h] BY host

first / last

첫 번째 또는 마지막 값(시간 순서 기준)을 가져옵니다.

구문:

first(field)
last(field)
last_row(field)

매개변수:

  • field: 임의의 필드

설명:

  • first: 시간상 가장 빠른 값을 반환합니다.
  • last: 시간상 가장 늦은 값을 반환하며, 필드가 배열 유형인 경우 펼쳐집니다.
  • last_row: 시간상 가장 늦은 값을 반환하며, 배열 유형은 펼쳐지지 않습니다.

예제:

// 최신 상태 값 가져오기
M::system:(last(status)) [1h] BY host

// 초기값 및 최종값 가져오기
M::counter:(first(value), last(value)) [1h] BY metric

any

null이 아닌 임의의 값을 반환합니다. 샘플 데이터를 가져오거나 특정 집계 순서가 필요하지 않은 시나리오에 적합합니다.

구문:

any(field)

매개변수:

  • field: 임의의 필드

예제:

// 임의의 메시지 샘플 가져오기
L::logs:(any(message)) [1h] BY service

// 임의의 오류 스택 트레이스 가져오기
L::error_logs:(any(stack_trace)) [1h] BY error_type

SHIFT

표현식 수준 SHIFT는 프로젝션에서 이전 시간 창의 집계 값을 참조하여 현재 집계 결과와 함께 표시합니다.

구문:

<aggregate-or-subquery-measure> SHIFT <duration>

현재 값, 이전 값 및 파생 계산은 모두 프로젝션 표현식에 의해 명시적으로 제공됩니다. 동일한 이전 값을 여러 번 참조하는 경우 동일한 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

duration1h, 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

범위(최대값과 최소값의 차이)를 계산합니다.

구문:

spread(field)

매개변수:

  • field: 숫자 필드

예제:

// 응답 시간의 변동 범위 계산
M::response_time:(spread(duration)) [1h] BY endpoint

stddev

표준 편차를 계산합니다.

구문:

stddev(field)

매개변수:

  • field: 숫자 필드

예제:

// 응답 시간의 표준 편차 계산
M::response_time:(stddev(duration)) [1h] BY endpoint

mode

최빈값(가장 자주 나타나는 값)을 계산합니다.

구문:

mode(field)

매개변수:

  • field: 임의의 필드

예제:

// 가장 일반적인 응답 상태 코드 찾기
M::http:(mode(status)) [1h] BY endpoint

count_series

시계열(그룹) 수를 계산합니다. 현재 쿼리 범위 내에 몇 개의 독립적인 시계열이 있는지 반환합니다.

구문:

count_series(field)

매개변수:

  • field: 임의의 필드(일반적으로 * 또는 존재하는 임의의 필드 사용)

예제:

// CPU 메트릭을 보고하는 호스트 수 계산
M::cpu:(count_series(*)) [1h]

// 각 서비스의 인스턴스 수 계산
M::http_requests:(count_series(*)) [1h] BY service

통계 집계(추정 함수)

다음 함수는 확률적 데이터 구조를 사용하여 추정하므로 대용량 데이터 시나리오에 적합하며 정확성과 성능 간의 균형을 유지할 수 있습니다.

count_distinct

필드의 고유 값 수(추정값)를 계산합니다.

구문:

count_distinct(field)

매개변수:

  • 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

필드의 백분위수(추정값)를 계산합니다.

구문:

percentile(field, n)
pXX(field)  // 약식 형식

매개변수:

  • 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)과 동일합니다.

구문:

median(field)

예제:

// 응답 시간의 중앙값 계산
M::response_time:(median(duration)) [1h] BY service

히스토그램 함수

DQL은 다양한 데이터 소스 및 시나리오에 적합한 세 가지 히스토그램 관련 함수를 제공합니다.

함수 사용 사례 데이터 소스 유형 권장도
histogram_auto 로그, Trace 등 상세 데이터의 숫자 분포 통계 상세 모델(로그/Trace) ⭐⭐⭐ 권장
histogram 고정 버킷 경계가 필요한 히스토그램 상세 모델(로그/Trace) ⭐⭐ Deprecated
histogram_quantile Prometheus 히스토그램 메트릭에서 분위수 계산 Prometheus 메트릭 ⭐⭐⭐ 권장

histogram_auto(권장)

분포 히스토그램을 자동으로 생성하며, 로그, Trace 등 상세 데이터의 숫자 분포 통계를 위해 설계되었습니다.

특징:

  • 버킷 경계를 지정할 필요 없이 데이터 분포에 자동으로 적응합니다.
  • 로그 선형 보간 히스토그램 알고리즘을 사용하여 10⁻⁹ ~ 10¹⁸의 숫자 범위를 포괄합니다.
  • 분위수 통계 및 버킷 분포 정보를 동시에 반환합니다.

구문:

histogram_auto(field)

매개변수:

  • 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는 데이터 분포에 자동으로 적응하고 더 넓은 숫자 범위를 포괄하며 더 풍부한 통계 정보를 반환합니다.

구문:

histogram(field, left_bound, right_bound, bucket_size [, threshold])

매개변수:

  • 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)여야 합니다.

구문:

histogram_quantile(field, q)

매개변수:

  • field: 히스토그램 카운트 필드(예: http_request_duration_bucket)
  • q: 분위수, 범위 0-1(예: 0.99는 P99를 의미)

사용 사례 비교:

사례 권장 함수 설명
로그의 응답 시간 분포 분석 histogram_auto 로그는 상세 데이터, 사전 집계 히스토그램 없음
Prometheus 히스토그램 메트릭의 P99 분석 histogram_quantile 메트릭이 le 레이블로 사전 집계됨
Trace 호출의 지연 시간 분포 통계 histogram_auto Trace는 상세 데이터

le 레이블 처리 메커니즘:

histogram_quantilele 레이블(less than or equal)을 사용하여 히스토그램 버킷의 경계를 식별합니다.

  1. Prometheus 형식(기본값): le 레이블을 사용하여 버킷 상한을 직접 나타냅니다.
  2. le 값은 숫자(예: "0.1", "1", "10") 또는 "+Inf"(무한대)입니다.
  3. 데이터는 누적 카운트(cumulative)여야 합니다.

  4. VictoriaMetrics 형식: vmrange 레이블을 사용하여 범위를 나타냅니다.

  5. 형식: "하한...상한"(예: "0.1...0.2")
  6. 데이터는 범위 카운트(비누적)입니다.
  7. 함수는 자동으로 범위 카운트를 누적 카운트로 변환합니다.

계산 과정: 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))
데이터 형식 levmrange 두 가지 레이블 지원 le 레이블만 지원
그룹화 방식 DQL의 BY 절을 통해 by (le)를 통해 명시적으로 그룹화

동등 예제:

히스토그램 메트릭 http_request_duration_bucket이 있고 le 레이블(예: 0.1, 0.5, 1, 5, +Inf) 및 service 레이블이 있다고 가정합니다.

시나리오 1: P99 지연 시간 계산

DQL:

M::http_request_duration:(histogram_quantile(duration_bucket, 0.99)) [1h] BY service

PromQL 동등:

histogram_quantile(0.99, sum(rate(http_request_duration_bucket[1h])) by (le, service))

시나리오 2: 각 서비스의 P95 지연 시간 계산(다중 그룹화)

DQL:

M::http_request_duration:(
    histogram_quantile(duration_bucket, 0.95)
) [1h] BY service, endpoint

PromQL 동등:

histogram_quantile(0.95, sum(rate(http_request_duration_bucket[1h])) by (le, service, endpoint))

시나리오 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개를 가져옵니다.

구문:

top(field, 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개를 가져옵니다.

구문:

bottom(field, n)

매개변수:

  • field: 숫자 필드
  • n: 반환할 값의 수

예제:

// 응답 시간이 가장 짧은 5개의 요청 가져오기
M::response_time:(bottom(duration, 5)) [1h] BY service

결과 예시:

service bottom(duration, 5)
api 12
api 18
api 25
api 32
api 45

참고: 여러 행을 반환하며 각 행에는 하나의 BottomN 값이 포함됩니다.


값 수집 함수

distinct

필드의 모든 고유 값을 반환합니다.

구문:

distinct(field)

예제:

// 모든 다른 상태 코드 가져오기
M::http:(distinct(status)) [1h] BY endpoint

결과 예시:

endpoint distinct(status)
/api/v1 200
/api/v1 404
/api/v1 500
/health 200

참고: 여러 행을 반환하며 각 행에는 하나의 고유 값이 포함됩니다.


distinct_by_collapse

폴딩 전략에 따라 필드의 고유 값을 가져오고 중복 제거 시 다른 필드의 마지막 값을 유지합니다.

구문:

distinct_by_collapse(field, [last_field1, last_field2, ...])

매개변수:

  • 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

모든 값(중복 포함)을 수집합니다.

구문:

collect(field [, limit])

매개변수:

  • 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

모든 고유 값을 수집합니다.

구문:

collect_distinct(field [, limit])

매개변수:

  • field: 임의의 필드
  • limit(선택 사항): 최대 수집 수

예제:

// 모든 다른 오류 유형 수집
L::error_logs:(collect_distinct(error_type)) [1h] BY service

결과 예시:

service collect_distinct(error_type)
api ["timeout", "connection refused", "404"]
web ["200", "301", "404"]

참고: 배열 유형을 반환하며 중복 제거된 모든 값을 포함합니다.


field_values

필드의 모든 값을 가져오고 배열 유형을 반환합니다.

구문:

field_values(field)

예제:

// 모든 태그 값 가져오기
M::metrics:(field_values(tags)) [1h] BY metric_name

결과 예시:

metric_name field_values(tags)
cpu_usage ["host:A", "env:prod", "team:backend"]
memory_used ["host:B", "env:staging", "team:frontend"]

참고: 배열 유형을 반환하며 필드의 모든 값을 포함합니다.


필터 집계

count_filter

필드 값이 지정된 목록에 있는 개수를 계산합니다.

구문:

count_filter(field, [value1, value2, ...])

매개변수:

  • field: 임의의 필드
  • values: 값 목록

예제:

// 특정 상태 코드의 요청 수 계산
M::http:(count_filter(status, [200, 201, 204])) [1h] BY endpoint

// 오류 수준 로그 계산
L::logs:(count_filter(level, ["error", "critical"])) [1h] BY service

보조 함수

default

필드가 비어 있을 때 기본값을 반환합니다.

구문:

default(field, default_value)

매개변수:

  • field: 임의의 필드
  • default_value: 기본값(숫자, 문자열, 불리언 또는 null일 수 있음)

예제:

// 빈 값에 기본 응답 시간 설정
M::response_time:(default(duration, 0)) [1h] BY service

시계열 함수

시계열 함수는 시간에 따라 변하는 데이터, 특히 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(field)

설명: rate는 시간 창 내에서 Counter 메트릭의 평균 증가율을 계산합니다. 단조 증가하는 Counter 유형 메트릭의 경우 원시 값을 직접 사용하여 집계하는 것은 의미가 없으므로 먼저 증가율을 계산해야 합니다.

사용 사례:

  • 요청 QPS 계산
  • 데이터 쓰기 속도 계산
  • 트래픽 증가 추세 분석

예제:

// 요청 QPS 계산
M::http_requests:(sum(request_count)) [rate] BY service

// 데이터 쓰기 속도 계산
M::data_ingestion:(sum(bytes)) [rate] BY source

irate

메트릭의 순간 증가율을 계산합니다.

구문:

irate(field)

설명: rate와 달리 irate는 마지막 두 데이터 포인트만 사용하여 증가율을 계산하므로 순간 변화율을 반영하며 알림 시나리오에 더 적합합니다.

예제:

// 순간 요청 QPS 계산
M::http_requests:(sum(request_count)) [irate] BY service

increase

메트릭의 증가량을 계산합니다.

구문:

increase(field)

설명: increase는 증가율이 아닌 시간 창 내의 총 증가량을 반환합니다.

예제:

// 총 요청 수 증가량 계산
M::http_requests:(sum(request_count)) [increase] BY service

rate_over_sum

초당 평균값(sum / 시간 창(초))을 계산합니다.

구문:

rate_over_sum(field)

설명: sum(field) / 시간 창(초)와 동일하며 초당 평균값을 계산하는 데 사용됩니다. Rollup 단계에서 누적 값을 초당 속도로 변환하는 데 자주 사용됩니다.

rate와의 차이점:

  • rate: Counter의 증가율 계산(리셋 처리)
  • rate_over_sum: sum을 시간 창(초)으로 나누는 간단한 계산

예제:

// 초당 평균 요청 수 계산
M::http_requests:(rate_over_sum(request_count)) [1h] BY service

rate_over_count

초당 카운트(count / 시간 창(초))를 계산합니다.

구문:

rate_over_count(field)

설명: count(field) / 시간 창(초)와 동일하며 초당 발생 횟수를 계산하는 데 사용됩니다.

예제:

// 초당 오류 로그 수 계산
L::error_logs:(rate_over_count(*)) [1h] BY error_type

차이 계산

이 섹션에서는 함수의 의미를 설명합니다. 동일한 함수는 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 유형 메트릭(음수 값 유지)에 사용됩니다.

설명: increasedifference는 두 개의 독립적인 함수이며 동작이 다르고 별칭 관계가 아닙니다.

구문:

// 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

이동 평균값을 계산합니다.

구문:

moving_average(field, n)

매개변수:

  • 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는 평활 계수이며 명시적으로 전달해야 합니다.

구문:

ewma(field, 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

시간에 따른 시퀀스의 선형 추세 기울기를 계산합니다. 시간 단위는 초입니다.

구문:

slope(field)

설명:

  • 최소 2개의 유효한 포인트가 필요합니다.
  • 시간이 변경되지 않거나 유효한 포인트가 부족하면 null 값을 반환합니다.

예제:

// 메모리 사용량의 증가 추세 계산
M::memory:(slope(used)) [1h::5m] BY host

zscore

창 내의 평균 및 표준 편차에 대한 최신 지점의 Z-Score를 계산합니다.

구문:

zscore(field)

설명:

  • 결과는 (latest - mean) / stddev입니다.
  • 최소 2개의 유효한 포인트가 필요합니다. 표준 편차가 0이면 null 값을 반환합니다.

예제:

// 이전 기록 창에 대한 최신 응답 시간의 편차 정도 평가 M::response_time:(zscore(duration)) [1h::5m] BY service

---

#### mad_score

최신 지점의 MAD(Median Absolute Deviation) 이상 점수를 계산합니다.

**구문:**
mad_score(field)
**설명:**

- 중앙값과 MAD를 사용하여 최신 지점의 편차 정도를 측정하며 평균/표준 편차보다 극단값에 더 강건합니다.
- 최소 2개의 유효한 포인트가 필요합니다. MAD가 0이면 null 값을 반환합니다.

**예제:**
// 강건한 이상 점수를 사용하여 최신 지연 지점 감지 M::latency:(mad_score(p95)) [1h::5m] BY service
---

#### change_score

창 내 시퀀스의 변이 점수를 계산하여 평균이 크게 전환된 시계열을 찾는 데 사용됩니다.

**구문:**
change_score(field)
**설명:**

- 가능한 분할 지점을 열거하고 분할 지점 앞뒤 두 부분의 평균 차이를 비교한 후 합동 표준 편차로 정규화합니다.
- 최소 4개의 유효한 포인트가 필요합니다. 유효한 포인트가 부족하면 null 값을 반환합니다.

**예제:**
// 오류율이 창 내에서 변이되었는지 감지 M::error_rate:(change_score(value)) [1h::5m] BY service
---

#### corr

두 숫자 필드 간의 Pearson 상관 계수를 계산합니다.

**구문:**
corr(left_field, right_field)
**설명:**

- 반환 값 범위는 일반적으로 `[-1, 1]`입니다.
- 최소 2개의 유효한 포인트 쌍이 필요합니다. 필드 중 하나에 변화가 없으면 null 값을 반환합니다.
- `corr`는 두 개의 입력 필드가 필요하므로 시간 절 Rollup 작성을 지원하지 않습니다.

**예제:**
// CPU 사용률과 요청량 간의 상관 관계 계산 M::service_metric:(corr(cpu_usage, request_count)) [1h::5m] BY service
---

#### cumsum

누적 합계를 계산합니다.

**구문:**
cumsum(DQL_expression)
**예제:**
// 누적 요청 수 계산 cumsum(M::requests:(sum(count)) [1h::5m] BY service)
---

## 변환 함수

변환 함수는 필드 값에 대한 수학 연산, 유형 변환 또는 문자열 처리를 수행하는 데 사용됩니다.

### 수학 함수

#### abs

절대값을 계산합니다.

**구문:**
abs(field)
**예제:**
// 온도 편차의 절대값 계산 M::temperature:(abs(deviation)) [1h] BY sensor
---

#### round / ceil / floor

반올림 함수.

**구문:**
round(field) // 반올림하여 정수로 round(field, digits) // 반올림하여 지정된 소수 자릿수로 ceil(field) // 올림 floor(field) // 내림
**예제:**
// 응답 시간 올림 M::response_time:(ceil(duration)) [1h]

// 백분율 반올림 M::cpu:(round(usage)) [1h] BY host

// 평균 응답 시간을 소수점 2자리로 반올림 L::log:(round(avg(duration), 2)) BY api

---

#### log / log2 / log10

로그 함수.

**구문:**
log(field) // 자연 로그 log2(field) // 밑이 2인 로그 log10(field) // 밑이 10인 로그
**예제:**
// 로그 변환된 값 계산 M::metrics:(log(value)) [1h] BY metric_name
---

### 유형 변환

#### int / uint / float / string / bool

유형 변환 함수.

**구문:**
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

문자열을 소문자로 변환합니다.

**구문:**
lower(field)
**매개변수:**

- `field`: 문자열 필드

**반환값:**
변환된 소문자 문자열을 반환합니다.

---

#### upper

문자열을 대문자로 변환합니다.

**구문:**
upper(field)
**매개변수:**

- `field`: 문자열 필드

**반환값:**
변환된 대문자 문자열을 반환합니다.

---

#### trim

문자열 양쪽 끝의 공백 문자를 제거합니다.

**구문:**
trim(field)
**매개변수:**

- `field`: 문자열 필드

**반환값:**
양쪽 끝 공백이 제거된 문자열을 반환합니다.

---

#### ltrim

문자열 왼쪽의 공백 문자를 제거합니다.

**구문:**
ltrim(field)
**매개변수:**

- `field`: 문자열 필드

**반환값:**
왼쪽 공백이 제거된 문자열을 반환합니다.

---

#### rtrim

문자열 오른쪽의 공백 문자를 제거합니다.

**구문:**
rtrim(field)
**매개변수:**

- `field`: 문자열 필드

**반환값:**
오른쪽 공백이 제거된 문자열을 반환합니다.

---

#### length

문자열 길이(문자 수 기준)를 반환합니다.

**구문:**
length(field)
**매개변수:**

- `field`: 문자열 필드

**반환값:**
문자열 길이를 반환합니다.

---

#### substr

부분 문자열을 추출합니다.

**구문:**
substr(field, start) substr(field, start, length)
**매개변수:**

- `field`: 문자열 필드
- `start`: 시작 위치(0부터 시작, 음수는 끝에서부터 시작을 의미)
- `length`(선택 사항): 부분 문자열 길이

**반환값:**
추출된 부분 문자열을 반환합니다.

**예제:**
// 메시지의 처음 100자 추출 L::logs:(substr(message, 0, 100)) [1h]

// 마지막 10자 추출 L::logs:(substr(message, -10)) [1h]

**결과 예시:**

| message                     | substr(message, 0, 10) | substr(message, -5) |
| --------------------------- | ---------------------- | ------------------- |
| "Error: connection timeout" | "Error: con"           | "eout"              |

---

#### regexp_extract

정규 표현식 추출.

**구문:**
regexp_extract(field, pattern) regexp_extract(field, pattern, n)
**매개변수:**

- `field`: 문자열 필드
- `pattern`: 정규 표현식
- `n`(선택 사항): n번째 캡처 그룹 추출, 기본값은 0(전체 일치)

**반환값:**
n번째 캡처 그룹의 내용을 포함하는 단일 문자열을 반환합니다. 일치하는 항목이 없으면 null을 반환합니다.

**예제:**
// 오류 코드 추출 L::logs:(regexp_extract(message, 'error_code: (\d+)', 1)) [1h]

// 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

모든 일치 결과를 추출합니다.

**구문:**
regexp_extract_all(field, pattern) regexp_extract_all(field, pattern, n)
**반환값:**
모든 일치하는 부분 문자열을 포함하는 문자열 배열을 반환합니다.

**예제:**
// 모든 숫자 추출 L::logs:(regexp_extract_all(message, '\d+', 0)) [1h]

// 모든 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

정규 표현식을 사용하여 일치하는 텍스트를 바꿉니다.

**구문:**
regexp_replace(field, pattern, replacement)
**매개변수:**

- `field`: 문자열 필드
- `pattern`: 정규 표현식
- `replacement`: 바꿀 문자열; 캡처 그룹을 참조해야 하는 경우 `$1`, `${1}`, `$2` 등을 사용합니다. 캡처 그룹 뒤에 문자, 숫자 또는 밑줄이 오는 경우 `${1}`을 사용하여 모호성을 제거합니다(예: `${1}_suffix`). 리터럴 `$`를 출력해야 하는 경우 `$$`를 사용합니다.

**반환값:**
바꾼 후의 문자열을 반환합니다. 일치하는 항목이 없으면 원래 문자열을 반환합니다.

**예제:**
// 메시지에서 숫자를 삭제한 후 접두사로 집계 L::logs:(substr(regexp_replace(message, '\d+', ''), 0, 20) AS prefix, count(*)) [1h] BY prefix

// 캡처 그룹을 사용하여 사용자 ID 정규화 L::logs:(regexp_replace(message, 'user=([0-9]+)', 'uid=$1') AS normalized) [1h]

---

#### md5

MD5 해시 값을 계산합니다.

**구문:**
md5(field)
**반환값:**
32자리 16진수 문자열(소문자)을 반환합니다.

**예제:**
// 메시지의 MD5 계산 L::logs:(md5(message)) [1h]
**결과 예시:**

| service | md5(message)                     |
| ------- | -------------------------------- |
| api     | 5d41402abc4b2a76b9719d911017c592 |
| web     | 098f6bcd4621d373cade4e832627b4f6 |

---

#### concat

문자열 연결.

**구문:**
concat(field, ...)
**반환값:**
연결된 단일 문자열을 반환합니다.

**예제:**
// 여러 필드 연결 L::logs:(concat(service, ":", level)) [1h]

// 결과: "api:error", "web:info" 등

**결과 예시:**

| service | level | concat(service, ":", level) |
| ------- | ----- | --------------------------- |
| api     | error | "api:error"                 |
| web     | info  | "web:info"                  |

---

#### set

배열 필드를 중복 제거하고 정렬합니다.

**구문:**
set(DQL_expression)
**반환값:**
중복 제거되고 정렬된 배열을 반환합니다.

**예제:**
// 모든 다른 태그 가져오기 set(M::metrics:(tags) [1h] BY metric_name)

// 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 알고리즘을 사용하여 유사한 로그를 동일한 클래스로 그룹화하고 해당 클래스의 대표 로그 샘플을 반환합니다.

**구문:**
drain(field, similarity_threshold) drain(field, similarity_threshold, max_clusters)
**매개변수:**

- `field`: 문자열 필드 또는 문자열 표현식, 일반적으로 `message`
- `similarity_threshold`: 유사도 임계값, 범위 `(0, 1]`; 값이 클수록 더 유사한 로그만 동일한 클래스로 그룹화됩니다.
- `max_clusters`: 선택 사항, 최대 클러스터 수, 범위 `[1, 10000]`; 생략 시 기본값은 `1000`입니다.

**반환값:**
문자열 유형의 대표 로그 샘플을 반환합니다. 샘플은 클러스터가 생성될 때의 원래 로그이며 Drain이 내부적으로 유지 관리하는 일반화된 템플릿이 아닙니다.

**알고리즘 설명:**

Drain은 구문 분석 트리 기반의 로그 클러스터링 알고리즘입니다. 함수는 실행 과정에서 지속적으로 클러스터러를 훈련합니다. 새 로그가 기존 클러스터와 일치하면 해당 클러스터의 대표 샘플을 반환하고, 일치하지 않으면 새 클러스터를 생성하고 현재 로그를 해당 클러스터의 대표 샘플로 설정합니다.

**사용 사례:**

- 유사한 로그 그룹별 통계
- 비정상 로그 클러스터 분석
- 로그 노이즈 감소

**예제:**
// 유사한 로그별 클러스터 통계, 유사도 0.7, 최대 1000개 클러스터 L::logs:(count(*)) [1h] BY drain(message, 0.7, 1000) AS sample

// 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

필드에 지정된 부분 문자열이 포함되어 있는지 확인합니다.

**구문:**
match(pattern) match(field, pattern)
**매개변수:**

- `pattern`: 매칭할 부분 문자열
- `field`: 필드 이름(선택 사항, WHERE 절에서는 생략 가능)

**예제:**
// WHERE에서 사용 L::logs:(message) {match(message, "error")} [1h]

// 약식 형식 L::logs:(message) {match("error")} [1h]

// 표현식으로 사용 L::logs:(match(message, "timeout")) [1h] BY match_result

---

### 구문 매칭

#### search

분석 구문 매칭, 중/영문 혼합 지원.

**구문:**
search(query) search(field, query)
**매개변수:**

- `query`: 검색 구문
- `field`: 필드 이름(선택 사항)

**매칭 규칙:**

- 중국어: 문자 단위로 분석하여 매칭
- 영어: 단어 경계별 매칭(공백, 구두점으로 구분)
- 대소문자 구분하지 않음
- 비어 있지 않은 `query`가 정확히 한 쌍의 큰따옴표만 포함하고 큰따옴표가 전체 값을 감싸는 경우 구문 매칭으로 처리: 각 분석 단어가 인접하고 순서가 일치해야 함; 큰따옴표는 매칭 내용에 포함되지 않음
- 위 큰따옴표 특수 형식에서 공백 또는 구두점만 포함된 내용은 여전히 연속 리터럴 값으로 매칭
- 빈 쿼리 `""`는 위 특수 형식에 해당하지 않으며 일반 분석 검색 매개변수로 처리
- 큰따옴표가 포함된 다른 형식은 모두 합법적인 일반 분석 검색 매개변수로 처리되며 특별히 해석되지 않음. 예를 들어 한쪽 큰따옴표만 있는 경우, 값에 추가 큰따옴표가 포함된 경우 또는 큰따옴표가 양쪽 끝에 없는 경우

**예제:**
// "connection timeout"을 포함하는 로그 매칭 L::logs:(message) {search("connection timeout")} [1h]

// 중국어 매칭 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 / regex / regexp

정규 표현식 매칭, 대소문자 구분.

**구문:**
re(pattern) re(field, pattern) regex(pattern) regex(field, pattern) regexp(pattern) regexp(field, pattern)
**매개변수:**

- `pattern`: 정규 표현식(PromRegex 구문 지원)
- `field`: 필드 이름(선택 사항)

**예제:**
// error로 시작하는 로그 매칭, ERROR로 시작하는 로그는 매칭되지 않음 L::logs:(message) {re("error.*")} [1h]

// 특정 형식의 오류 코드 매칭 L::logs:(message) {regexp(message, "ERR-\d{4}")} [1h]

// 데이터 소스에서 정규 표현식 사용 M::re('cpu.'):(usage) [1h]

---

### 와일드카드 매칭

#### wildcard

와일드카드 패턴 매칭, 대소문자 구분.

**구문:**
wildcard(pattern) wildcard(field, pattern)
**매개변수:**

- `pattern`: 와일드카드 패턴
  - `*`: 임의의 여러 문자 매칭
  - `?`: 단일 문자 매칭
- `field`: 필드 이름(선택 사항)

**예제:**
// error로 시작하는 메시지 매칭, ERROR로 시작하는 메시지는 매칭되지 않음 L::logs:(message) {wildcard("error
")} [1h]

// 특정 형식 매칭 L::logs:(message) {wildcard(message, "ERR-????")} [1h]

---

### CIDR 매칭

#### cidr

IP 주소 네트워크 세그먼트 매칭.

**구문:**
cidr(cidr) cidr(field, cidr)
**매개변수:**

- `cidr`: CIDR 표기법의 네트워크 세그먼트(예: `192.168.1.0/24`)
- `field`: IP 주소 필드(선택 사항)

**예제:**
// 내부 네트워크 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()`는 특수 자리 표시자이며 일반적으로 비교 표현식의 오른쪽에 사용됩니다.

**구문:**
exists()
**권장 사용법:**
field = exists() // 필드 존재(비어 있지 않음) field != exists() // 필드가 존재하지 않거나 비어 있음
**예제:**
// error_type 필드가 있는 로그 찾기 L::logs:(message) {error_type = exists()} [1h]

// error_type 필드가 없는 로그 찾기 L::logs:(message) {error_type != exists()} [1h]

---

### 쿼리 문자열 구문

#### query_string

쿼리 문자열 구문을 사용하여 복잡한 매칭을 수행합니다.

**구문:**
query_string(query) query_string(field, query)
**매개변수:**

- `query`: 쿼리 문자열
- `field`: 필드 이름(선택 사항, 기본값은 전체 텍스트 매칭)

**쿼리 문자열 구문:**

##### 1. 용어 매칭
foo # foo를 포함하는 내용 매칭 "foo bar" # 정확한 구문 매칭, 연속으로 나타나야 함 foo bar # 공백 이스케이프, "foo bar" 전체를 매칭
##### 2. 와일드카드
foo* # foo로 시작하는 내용 매칭 foo?bar # ?는 단일 문자 매칭 "foobar" # 따옴표 안의 와일드카드는 해석되지 않고 리터럴로 매칭
##### 3. 정규 표현식
/foo.
bar/ # 슬래시로 감싼 정규 표현식 /joh?n(ath[oa]n)/ # 복잡한 정규 표현식
##### 4. 불리언 연산자
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와 동일

##### 5. 그룹화
(foo OR bar) AND baz # 괄호를 사용하여 우선 순위 변경 !(status 429 reading) # 전체 표현식 부정
##### 6. 기본 연산자

여러 용어가 공백으로 구분된 경우 기본적으로 OR로 연결됨(AND로 구성 가능):
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 timeout")} [1h]

// 불리언 조합 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)

구문:

outer_function(DQL_expression)

예제:

// 쿼리 내 함수: 원시 데이터의 평균 계산
M::cpu:(avg(usage)) [1h::5m] BY host

// 외부 함수: 쿼리 결과에 대한 이동 평균 계산
moving_average(M::cpu:(avg(usage)) [1h::5m] BY host, 5)

누적 계산

cumsum

누적 합계를 계산하며 시계열의 각 포인트에 대해 앞의 모든 포인트의 누적 값을 계산합니다.

구문:

cumsum(DQL_expression)

예제:

// 누적 요청 수 계산
cumsum(M::requests:(sum(count)) [1h::5m] BY service)

차이와 미분

권장 사용: 이러한 함수는 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차 평활화에만 사용합니다.

구문:

moving_average(DQL_expression, n)

매개변수:

  • 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 이상값 감지를 수행하고 숫자형 이상 마커를 출력합니다.

구문:

dbscan(DQL_expression)
dbscan(DQL_expression, eps)

매개변수:

  • 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

쿼리 결과의 숫자 시계열에 대한 선형 추세 예측을 수행하고 미래 시점의 예측 값을 출력합니다.

구문:

forecast(DQL_expression)
forecast(DQL_expression, steps)

매개변수:

  • 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을 가져옵니다.

구문:

top(DQL_expression, n)
bottom(DQL_expression, n)

예제:

// 외부 함수: 쿼리 결과에 대한 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은 쿼리 외부에서 표현식 계산을 허용하는 특수 함수이며 여러 하위 쿼리의 결과를 참조하여 조합 연산을 수행할 수 있습니다.

구문

eval(expression, name1=(query1), name2=(query2), ..., alias="result_name")

매개변수:

  • expression: 수학 표현식, name.field를 사용하여 하위 쿼리 결과 참조
  • name=(query): 명명된 하위 쿼리
  • alias: 결과 별칭(선택 사항)

설명: evalname="query"와 같은 레거시 작성 방법도 호환되지만 유형 표현 및 가독성 측면에서 name=(query)를 사용하는 것이 좋습니다.

작동 원리

  1. 명명된 모든 하위 쿼리 실행
  2. 각 하위 쿼리 결과를 시간별로 정렬
  3. 각 시간 포인트에 대해 표현식 계산
  4. 계산 결과 반환

사용 사례

  • 여러 메트릭의 비율 계산(예: 오류율, 사용률)
  • 다른 시간대의 메트릭 비교
  • 여러 데이터 소스의 계산 결과 조합

예제

오류율 계산

// 오류율 = 오류 수 / 총 요청 수 * 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외부 함수로 사용하여 전체 쿼리 결과에 대해 작동하는 것이 좋습니다.

fill(M::cpu:(avg(usage)) [1h::5m] BY host, 0)

Select 절에서 fill(avg(usage), 0) 작성 방법도 지원되지만 fill은 실제로 집계가 완료된 후 결과를 채우므로 외부 함수 형식이 작동 메커니즘에 더 부합합니다.

구문(외부 함수):

fill(DQL_expression, value)
fill(DQL_expression, LINEAR)
fill(DQL_expression, PREVIOUS)

매개변수:

  • 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

현재 시간 스탬프(밀리초)를 반환합니다.

구문:

now()

예제:

// 최근 업데이트된 데이터 쿼리
O::HOST:(*) {last_update_time > now() - 600000}  // 10분 내 업데이트

unwrap

집계 결과의 래핑을 해제합니다.

구문:

unwrap(field)

예제:

// 집계된 필드 래핑 해제
M::cpu:(unwrap(usage)) [1h] BY host

Show 함수

Show 함수는 메타데이터(예: measurement, tag, field, 카디널리티 및 시리즈 수)를 보는 데 사용되며 모델링 문제 해결 및 쿼리 전 탐색에 자주 사용됩니다.

일반 구문

show_xxx(arg1=..., arg2=...){ where_conditions } [time_window] LIMIT n OFFSET m
  • 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>_source
  • show_<namespace>_class
  • show_<namespace>_type
  • show_<namespace>_field
  • show_<namespace>_label

여기서 <namespace>는 함수 이름의 중간 부분에서 자동으로 매핑됩니다. 예:

  • show_logging_source -> L
  • show_tracing_field -> T
  • show_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의 경우:
  • 명명된 매개변수가 필요합니다. namesname의 별칭으로 처리됩니다.

제약 조건 및 주의사항

  • show_tag_valueshow_tag_value_cardinalitykeyin을 제공해야 합니다.
  • show_series_count_by_tag_valuekeyin을 제공해야 합니다.
  • 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 다중 쿼리 표현식 계산

문서 평가

이 페이지가 도움이 되었나요?