eval 명령

eval 명령

eval 명령은 지정된 표현식을 평가하고 그 평가 결과를 검색 결과에 추가해요. eval 명령은 문서가 샤드에서 검색된 후 데이터를 처리하므로, 문서가 반환되기 전에 필터링하는 데는 사용할 수 없어요. 필터링에는 where 절을 사용해요. 또한 eval 연산은 데이터 노드에 분산되지 않고 코디네이팅 노드에서 수행되므로 큰 결과 집합에서는 성능이 느릴 수 있어요.

출처: 문서

본문

eval 명령은 쿼리 도메인 특화 언어(DSL)로 재작성되지 않아요. 코디네이팅 노드에서만 실행돼요.

구문(Syntax)

eval 명령은 다음과 같은 구문을 가져요.

eval <field>=<expression> ["," <field>=<expression> ]...

매개변수(Parameters)

eval 명령은 다음 매개변수를 지원해요.

Parameter Required/Optional Description
<field> Required 생성하거나 업데이트할 필드의 이름. 필드가 없으면 새 필드가 추가되고, 이미 존재하면 값이 덮어써져요.
<expression> Required 평가할 표현식.

예시 1: 심각도 등급으로 로그 분류하기

다음 쿼리는 심각도에 따라 각 로그를 중요(critical) 또는 비중요로 분류하는 is_critical 필드를 만들어요. 알림 규칙을 구축할 때 유용해요.

source=otellogs
| eval is_critical = IF(severityNumber >= 17, 'yes', 'no')
| dedup severityText
| sort severityNumber
| fields severityText, is_critical

이 쿼리는 다음과 같은 결과를 반환해요.

severityText is_critical
DEBUG no
INFO no
WARN no
ERROR yes

예시 2: 트레이스가 없는 오류 찾기

다음 쿼리는 오류 로그를 식별하고 분산 추적 컨텍스트가 있는지 확인하는 두 개의 Boolean 필드를 만들어요. 트레이스되지 않은 오류는 서비스 전반에 걸쳐 요청을 추적할 수 없어 디버깅이 더 어려워요.

source=otellogs
| eval is_error = severityNumber >= 17, is_traced = LENGTH(traceId) > 0
| where is_error = true
| sort `resource.attributes.service.name`
| fields `resource.attributes.service.name`, is_error, is_traced

이 쿼리는 다음과 같은 결과를 반환해요.

resource.attributes.service.name is_error is_traced
checkout True True
checkout True False
frontend-proxy True True
payment True True
payment True False
product-catalog True False
recommendation True True

예시 3: 표준화된 로그 줄 만들기

다음 쿼리는 로그 본문 앞에 심각도 수준을 붙여 내보내기나 알림에 사용할 표준화된 형식을 만들어요.

source=otellogs
| where severityText IN ('ERROR', 'WARN')
| eval formatted = '[' + severityText + '] ' + body
| sort severityNumber, `resource.attributes.service.name`
| fields formatted
| head 3

이 쿼리는 다음과 같은 결과를 반환해요.

formatted
[WARN] SSL certificate for api.example.com expires in 14 days
[WARN] Rate limit threshold reached: 450/500 requests per minute for API key ending in …abc789
[WARN] Slow query detected: SELECT * FROM products WHERE category = ‘electronics’ took 3200ms

더 알아보기 (Learn more)