2 Trigger 표현식
원본 보기2 트리거 표현식
개요
트리거에서 사용되는 표현식은 매우 유연합니다. 이를 사용하여 모니터링되는 통계에 대한 복잡한 논리 테스트를 만들 수 있습니다.
간단한 표현식은 일부 매개변수와 함께 항목에 적용되는 함수를 사용합니다. 함수는 연산자와 상수를 사용하여 임계값과 비교되는 결과를 반환합니다.
간단하고 유용한 표현식의 구문은 function(/host/key,parameter)<operator><constant>입니다.
예를 들어:
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
이는 지난 5분 동안 수신된 바이트 수가 항상 100킬로바이트를 초과했을 때 트리거됩니다.
구문은 정확히 같지만, 기능적 관점에서 트리거 표현식에는 두 가지 유형이 있습니다:
- 문제 표현식 - 문제의 조건을 정의합니다
- 복구 표현식(선택사항) - 문제 해결의 추가 조건을 정의합니다
문제 표현식만 정의할 때, 이 표현식은 문제 임계값과 문제 복구 임계값 모두로 사용됩니다. 문제 표현식이 TRUE로 평가되는 즉시 문제가 발생합니다. 문제 표현식이 FALSE로 평가되는 즉시 문제가 해결됩니다.
문제 표현식과 보조 복구 표현식을 모두 정의할 때, 문제 해결이 더 복잡해집니다: 문제 표현식이 FALSE여야 할 뿐만 아니라 복구 표현식도 TRUE여야 합니다. 이는 히스테리시스를 생성하고 트리거 플래핑을 방지하는 데 유용합니다.
복구 표현식에서 {TRIGGER.VALUE} 매크로를 사용하는 것은 비생산적입니다. 왜냐하면 이 표현식은 트리거가 "문제" 상태에 있을 때만 평가되기 때문입니다. 따라서 표현식을 평가하는 동안 {TRIGGER.VALUE}는 항상 "1"("문제" 상태를 나타냄)로 해석됩니다.
Functions
Functions allow to calculate the collected values (average, minimum, maximum, sum), find strings, reference current time and other factors.
A complete list of supported functions is available.
Typically functions return numeric values for comparison. When returning strings, comparison is possible with the = and <> operators (see example).
함수 매개변수
함수 매개변수를 사용하면 다음을 지정할 수 있습니다:
- 호스트 및 아이템 키 (호스트 아이템 히스토리만 참조하는 함수)
- 함수별 매개변수
- 기타 표현식 (호스트 아이템 히스토리를 참조하는 함수에서는 사용할 수 없음, 예시는 기타 표현식 참조)
호스트와 아이템 키는 /host/key로 지정할 수 있습니다.
첫 번째 매개변수에서 호스트명을 생략하는 것(즉, function(//key,parameter,...)와 같이)은 특정 상황에서만 지원됩니다:
이러한 상황에서는 {HOST.HOST} 매크로도 사용할 수 있습니다.
{HOST.HOST<1-9>}는 이벤트 이름 필드와 "Trigger" 맵 요소의 경우 트리거 표현식의 특정 아이템을 참조하기 위해 사용할 수 있습니다.
이러한 상황에서 호스트명이 생략되거나 {HOST.HOST}로 대체될 때, 참조는 트리거 표현식의 첫 번째 아이템 또는 그래프의 첫 번째 아이템을 가리킵니다.
지원되는 이러한 상황을 벗어나서 트리거 표현식에서 호스트명을 생략하면 오류가 발생합니다.
이벤트 이름 매크로에서 이중 슬래시 사용법의 예시는 Example 18을 참조하세요.
참조되는 아이템은 지원되는 상태여야 합니다 (지원되지 않는 아이템에 대해서도 계산되는 nodata() 함수 제외).
함수 매개변수로서의 다른 트리거 표현식은 트리거에서 비히스토리 함수로 제한되지만, 이 제한은 계산된 아이템에서는 적용되지 않습니다.
Function-specific parameters
Function-specific parameters are placed after the item key and are separated from the item key by a comma. See the supported functions for a complete list of these parameters.
Most of numeric functions accept time as a parameter. You may use seconds or time suffixes to indicate time. Preceded by a hash mark, the parameter has a different meaning:
| Expression | Description |
|---|---|
| sum(/host/key,10m) | Sum of values in the last 10 minutes. |
| sum(/host/key,#10) | Sum of the last ten values. |
Parameters with a hash mark have a different meaning with the function last - they denote the Nth previous value, so given the values 30, 70, 20, 60, 50 (from the most recent to the least recent):
last(/host/key,#2)would return '70'last(/host/key,#5)would return '50'
Time shift
An optional time shift is supported with time or value count as the function parameter. This parameter allows to reference data from a period of time in the past.
Time shift starts with now - specifying the current time, and is followed by +N<time unit> or -N<time unit> - to add or subtract N time units.
For example, avg(/host/key,1h:now-1d) will return the average value for an hour one day ago.
Time shift specified in months (M) and years (y) is only supported for trend functions. Other functions support seconds (s), minutes (m), hours (h), days (d), and weeks (w).
Time shift with absolute time periods
Absolute time periods are supported in the time shift parameter, for example, midnight to midnight for a day, Monday-Sunday for a week, first day-last day of the month for a month.
Time shift for absolute time periods starts with now - specifying the current time, and is followed by any number of time operations: /<time unit> - defines the beginning and end of the time unit, for example, midnight to midnight for a day, +N<time unit> or -N<time unit> - to add or subtract N time units.
Please note that the value of time shift can be greater or equal to 0, while the time period minimum value is 1.
| Parameter | Description |
|---|---|
| 1d:now/d | Yesterday |
| 1d:now/d+1d | Today |
| 2d:now/d+1d | Last 2 days |
| 1w:now/w | Last week |
| 1w:now/w+1w | This week |
기타 표현식
함수 매개변수는 다음 구문과 같이 다른 표현식을 포함할 수 있습니다:
min(min(/host/key,1h),min(/host2/key2,1h)*10)
함수가 항목 히스토리를 참조하는 경우에는 다른 표현식을 사용할 수 없습니다. 예를 들어, 다음 구문은 허용되지 않습니다:
min(/host/key,#5*10)
연산자
트리거에서 지원하는 연산자는 다음과 같습니다 (실행 우선순위 내림차순):
| 우선순위 | 연산자 | 정의 | 알 수 없는 값에 대한 참고사항 | 피연산자를 float로 강제 캐스트 1 |
|---|---|---|---|---|
| 1 | - | 단항 마이너스 | -Unknown → Unknown | Yes |
| 2 | not | 논리 NOT | not Unknown → Unknown | Yes |
| 3 | * | 곱셈 | 0 * Unknown → Unknown (예, Unknown입니다. 0이 아님 - 산술 연산에서 Unknown을 잃지 않기 위함) 1.2 * Unknown → Unknown |
Yes |
| / | 나눗셈 | Unknown / 0 → 오류 Unknown / 1.2 → Unknown 0.0 / Unknown → Unknown |
Yes | |
| 4 | + | 산술 덧셈 | 1.2 + Unknown → Unknown | Yes |
| - | 산술 뺄셈 | 1.2 - Unknown → Unknown | Yes | |
| 5 | < | 보다 작음. 연산자 정의: A<B ⇔ (A<B-0.000001) |
1.2 < Unknown → Unknown | Yes |
| <= | 보다 작거나 같음. 연산자 정의: A<=B ⇔ (A≤B+0.000001) |
Unknown <= Unknown → Unknown | Yes | |
| > | 보다 큼. 연산자 정의: A>B ⇔ (A>B+0.000001) |
Yes | ||
| >= | 보다 크거나 같음. 연산자 정의: A>=B ⇔ (A≥B-0.000001) |
Yes | ||
| 6 | = | 같음. 연산자 정의: A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001) |
No 1 | |
| <> | 같지 않음. 연산자 정의: A<>B ⇔ (A<B-0.000001) or (A>B+0.000001) |
No 1 | ||
| 7 | and | 논리 AND | 0 and Unknown → 0 1 and Unknown → Unknown Unknown and Unknown → Unknown |
Yes |
| 8 | or | 논리 OR | 1 or Unknown → 1 0 or Unknown → Unknown Unknown or Unknown → Unknown |
Yes |
1 다음의 경우에는 여전히 문자열 피연산자가 숫자로 캐스트됩니다:
- 다른 피연산자가 숫자인 경우
- 피연산자에 = 또는 <> 이외의 연산자가 사용된 경우
관계 연산자(<, <=, >, >=)의 경우: 캐스트가 실패하면(예: ""에서), 표현식은 Unknown을 반환합니다(문자열 비교 대체 없음).
등호 연산자(=, <>)의 경우: 캐스트가 실패하면, 피연산자는 원시 문자열로 비교됩니다.
not, and 및 or 연산자는 대소문자를 구분하며 소문자여야 합니다. 또한 공백이나 괄호로 둘러싸여야 합니다.
단항 -와 not을 제외한 모든 연산자는 왼쪽에서 오른쪽으로의 결합성을 가집니다. 단항 -와 not은 비결합적입니다(--1과 not not 1 대신 -(-1)과 not (not 1)을 사용해야 함).
평가 결과:
- <, <=, >, >=, =, <> 연산자는 지정된 관계가 참이면 트리거 표현식에서 '1'을, 거짓이면 '0'을 반환합니다. 피연산자 중 하나라도 Unknown이면 결과는 Unknown입니다;
- and는 알려진 피연산자의 경우 두 피연산자가 모두 '0'과 같지 않으면 '1'을, 그렇지 않으면 '0'을 반환합니다; 알 수 없는 피연산자의 경우 and는 한 피연산자가 '0'과 같을 때만 '0'을, 그렇지 않으면 'Unknown'을 반환합니다;
- or는 알려진 피연산자의 경우 피연산자 중 하나라도 '0'과 같지 않으면 '1'을, 그렇지 않으면 '0'을 반환합니다; 알 수 없는 피연산자의 경우 or는 한 피연산자가 '0'과 같지 않을 때만 '1'을, 그렇지 않으면 'Unknown'을 반환합니다;
- 논리 부정 연산자 not의 결과는 알려진 피연산자의 경우 피연산자 값이 '0'과 같지 않으면 '0'을, 피연산자 값이 '0'과 같으면 '1'을 반환합니다. 알 수 없는 피연산자의 경우 not은 'Unknown'을 반환합니다.
값 캐싱
트리거 평가에 필요한 값들은 Zabbix 서버에 의해 캐시됩니다. 이로 인해 서버 재시작 후 일정 시간 동안 트리거 평가가 더 높은 데이터베이스 부하를 발생시킵니다. 값 캐시는 아이템 히스토리 값이 제거되어도 (수동으로 또는 하우스키퍼에 의해) 지워지지 않으므로, 서버는 캐시된 값들이 트리거 함수에 정의된 시간 주기보다 오래되거나 서버가 재시작될 때까지 캐시된 값들을 사용합니다.
캐시에 최근 데이터가 없고 함수에 정의된 조회 기간이 없는 경우, Zabbix는 기본적으로 과거 일주일까지 거슬러 올라가서 데이터베이스에서 히스토리 값을 조회합니다.
트리거 예시
예제 1
Zabbix 서버의 프로세서 부하가 너무 높습니다.
last(/Zabbix server/system.cpu.load[all,avg1])>5
'last()' 함수를 사용하여 가장 최근 값을 참조하고 있습니다.
/Zabbix server/system.cpu.load[all,avg1]은 모니터링되는 매개변수의 짧은 이름을 제공합니다.
이것은 호스트가 'Zabbix server'이고 모니터링되는 키가 'system.cpu.load[all,avg1]'임을 지정합니다.
마지막으로, >5는 Zabbix 서버에서 가장 최근 프로세서 부하 측정값이 5보다 클 때마다 트리거가 문제 상태가 됨을 의미합니다.
예제 2
www.example.com이 과부하 상태입니다.
last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2
이 표현식은 현재 프로세서 부하가 5를 초과하거나 지난 10분 동안 프로세서 부하가 2를 초과했을 때 참이 됩니다.
예제 3
/etc/passwd가 변경되었습니다.
last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2)
이 표현식은 /etc/passwd 체크섬의 이전 값이 가장 최근 값과 다를 때 참이 됩니다.
유사한 표현식들은 /etc/passwd, /etc/inetd.conf, /kernel 등과 같은 중요한 파일의 변경사항을 모니터링하는 데 유용할 수 있습니다.
예제 4
누군가 인터넷에서 큰 파일을 다운로드하고 있습니다.
min 함수 사용:
min(/www.example.com/net.if.in[eth0,bytes],5m)>100K
이 표현식은 지난 5분 동안 eth0에서 수신된 바이트 수가 100 KB를 초과할 때 참이 됩니다.
예제 5
클러스터된 SMTP 서버의 두 노드가 모두 다운되었습니다.
하나의 표현식에서 두 개의 다른 호스트를 사용하는 방법에 주목하세요:
last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0
이 표현식은 smtp1.example.com과 smtp2.example.com 모두에서 SMTP 서버가 다운되었을 때 참이 됩니다.
예제 6
Zabbix 에이전트를 업그레이드해야 합니다.
find() 함수 사용:
find(/example.example.com/agent.version,,"like","beta8")=1
이 표현식은 Zabbix 에이전트가 beta8 버전을 가지고 있을 때 참이 됩니다.
예제 7
서버에 연결할 수 없습니다.
count(/example.example.com/icmpping,30m,,"0")>5
이 표현식은 지난 30분 동안 호스트 "example.example.com"에 5회 이상 연결할 수 없었을 때 참이 됩니다.
예제 8
지난 3분 내에 하트비트가 없습니다.
nodata() 함수 사용:
nodata(/example.example.com/tick,3m)=1
이 트리거를 사용하려면 'tick'이 Zabbix trapper 아이템으로 정의되어야 합니다. 호스트는 zabbix_sender를 사용하여 이 아이템에 대한 데이터를 주기적으로 전송해야 합니다. 180초 내에 데이터가 수신되지 않으면 트리거 값이 PROBLEM이 됩니다.
참고: 'nodata'는 모든 아이템 유형에 사용할 수 있습니다.
예제 9
야간 시간대 CPU 활동.
time() 함수 사용:
min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000
트리거는 야간 시간대(00:00 - 06:00)에만 문제 상태로 변경될 수 있습니다.
예제 10
예외가 있는 모든 시간의 CPU 활동.
time() 함수와 not 연산자 사용:
min(/zabbix/system.cpu.load[all,avg1],5m)>2
and not (dayofweek()=7 and time()>230000)
and not (dayofweek()=1 and time()<010000)
트리거는 주 변경 시 2시간(일요일 23:00 - 월요일 01:00)을 제외하고 언제든지 문제 상태로 변경될 수 있습니다.
예제 11
클라이언트 로컬 시간이 Zabbix 서버 시간과 동기화되어 있는지 확인합니다.
fuzzytime() 함수 사용법:
fuzzytime(/MySQL_DB/system.localtime,10s)=0
MySQL_DB 서버의 로컬 시간과 Zabbix 서버 시간이 10초 이상 차이날 경우 트리거가 문제 상태로 변경됩니다. 'system.localtime'은 Zabbix 에이전트에서 패시브 체크로 구성되어야 합니다. Zabbix agent 2에서는 액티브 체크로 구성할 수 있습니다.
예제 12
오늘의 평균 부하를 어제 같은 시간의 평균 부하와 비교합니다 (시간 이동을 now-1d로 사용).
avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2
지난 1시간의 평균 부하가 어제 같은 시간의 평균 부하보다 2배 이상 높으면 트리거가 실행됩니다.
예제 13
다른 항목의 값을 사용하여 트리거 임계값 설정하기:
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1
이 트리거는 사용 가능한 저장 공간이 10퍼센트 아래로 떨어지면 발동됩니다.
예제 14
평가 결과를 사용하여 임계값을 초과한 트리거 수를 구하기:
(last(/server1/system.cpu.load[all,avg1])>5) + (last(/server2/system.cpu.load[all,avg1])>5) + (last(/server3/system.cpu.load[all,avg1])>5)>=2
표현식에서 적어도 두 개의 트리거가 문제 상태에 있으면 트리거가 작동됩니다.
예제 15
두 항목의 문자열 값 비교 - 여기서 피연산자는 문자열을 반환하는 함수입니다.
문제: 서로 다른 호스트에서 Ubuntu 버전이 다를 경우 알림을 생성합니다
last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
예제 16
두 문자열 값 비교 - 피연산자는:
- 문자열을 반환하는 함수
- 매크로와 문자열의 조합
문제: DNS 쿼리의 변경 사항 감지
아이템 키는:
net.dns.record[192.0.2.0,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]
매크로는 다음과 같이 정의됩니다
{$WEBSITE_NAME} = example.com
{$DNS_RESOURCE_RECORD_TYPE} = MX
일반적으로 다음을 반환합니다:
example.com MX 0 mail.example.com
따라서 DNS 쿼리 결과가 예상 결과에서 벗어났는지 감지하는 트리거 표현식은:
last(/Zabbix server/net.dns.record[192.0.2.0,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME} {$DNS_RESOURCE_RECORD_TYPE} 0 mail.{$WEBSITE_NAME}"
두 번째 피연산자 주위의 따옴표에 주목하세요.
예시 17
두 문자열 값 비교 - 피연산자는 다음과 같습니다:
- 문자열을 반환하는 함수
- 특수 문자 \ 및 "가 포함된 문자열 상수
문제: /tmp/hello 파일 내용이 다음과 같은지 확인:
\" //hello ?\"
옵션 1. 문자열을 직접 작성:
last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""
문자열을 직접 비교할 때 \ 및 " 문자가 어떻게 이스케이프되는지 확인하세요.
옵션 2. 매크로 사용
{$HELLO_MACRO} = \" //hello ?\"
표현식에서:
last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
예제 18
장기간 비교.
문제: Exchange 서버 부하가 지난 달 대비 10% 이상 증가함
trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)
트리거 설정에서 이벤트 이름 필드를 사용하여 의미 있는 알림 메시지를 구성할 수도 있습니다. 예를 들어 다음과 같은 메시지를 받기 위해
"Exchange 서버 부하가 7월(0.69)에 6월(0.56) 대비 24% 증가했습니다"
이벤트 이름은 다음과 같이 정의되어야 합니다:
Load of {HOST.HOST} server increased by {{?100*trendavg(//system.cpu.load,1M:now/M)/trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(0)}% in {{TIME}.fmttime(%B,-1M)} ({{?trendavg(//system.cpu.load,1M:now/M)}.fmtnum(2)}) comparing to {{TIME}.fmttime(%B,-2M)} ({{?trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(2)})
이런 종류의 문제에 대해서는 트리거 설정에서 수동 종료를 허용하는 것도 유용합니다.
다른 사람들에게 유용할 수 있는 트리거 표현식 예제가 있나요? 예제 제안 양식을 사용하여 Zabbix 개발자에게 보내주세요.
히스테리시스
때때로 단순한 임계값이 아닌, 문제 상태와 복구 상태 사이에 간격이 필요한 경우가 있습니다. 예를 들어, 서버실 온도가 20°C를 넘으면 문제를 보고하고 온도가 15°C 아래로 떨어질 때까지 문제 상태를 유지하는 트리거를 정의하려고 한다면, 20°C에서의 단순한 트리거 임계값으로는 충분하지 않습니다.
대신에 먼저 문제 이벤트에 대한 트리거 표현식(온도가 20°C 초과)을 정의해야 합니다. 그런 다음 추가 복구 조건(온도가 15°C 미만)을 정의해야 합니다. 이는 트리거를 정의할 때 추가적인 복구 표현식 매개변수를 정의하여 수행됩니다.
이 경우 문제 복구는 두 단계로 이루어집니다:
- 첫 번째로, 문제 표현식(온도가 20°C 초과)이 FALSE로 평가되어야 합니다
- 두 번째로, 복구 표현식(온도가 15°C 미만)이 TRUE로 평가되어야 합니다
복구 표현식은 문제 이벤트가 먼저 해결되었을 때만 평가됩니다.
문제 표현식이 여전히 TRUE인 상태에서는 복구 표현식이 TRUE라는 것만으로는 문제가 해결되지 않습니다!
예시 1
서버실 온도가 너무 높습니다.
문제 표현식:
last(/server/temp)>20
복구 표현식:
last(/server/temp)<=15
예제 2
사용 가능한 디스크 공간이 너무 적습니다.
문제 표현식: 최근 5분 동안 10GB 미만인 경우
max(/server/vfs.fs.size[/,free],5m)<10G
복구 표현식: 최근 10분 동안 40GB 초과인 경우
min(/server/vfs.fs.size[/,free],10m)>40G
알 수 없는 피연산자가 포함된 표현식
일반적으로 표현식에서 알 수 없는 피연산자(지원되지 않는 항목 등)가 있으면 즉시 트리거 값이 Unknown으로 처리됩니다.
하지만 일부 경우에는 알 수 없는 피연산자(지원되지 않는 항목, 함수 오류)가 표현식 평가에 허용됩니다:
nodata()함수는 참조된 항목이 지원되는지 여부에 관계없이 평가됩니다.- OR 및 AND가 포함된 논리 표현식은 알 수 없는 피연산자에 관계없이 두 가지 경우에서 알려진 값으로 평가될 수 있습니다:
- 케이스 1: "
1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..."는 알려진 결과('1' 또는 "Problem")로 평가될 수 있습니다. - 케이스 2: "
0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..."는 알려진 결과('0' 또는 "OK")로 평가될 수 있습니다.
Zabbix는 지원되지 않는 항목을 알 수 없는 피연산자로 간주하여 이러한 논리 표현식을 평가하려고 시도합니다. 위의 두 경우에서는 알려진 값("Problem" 또는 "OK")이 생성됩니다. 다른 모든 경우에는 트리거가Unknown으로 평가됩니다.
- 케이스 1: "
- 지원되는 항목에 대한 함수 평가가 오류로 이어지면, 함수 값이
Unknown이 되고 추가 표현식 평가에서 알 수 없는 피연산자로 참여합니다.
알 수 없는 피연산자는 위에서 설명한 논리 표현식에서만 "사라질" 수 있다는 점에 유의하세요.
산술 표현식에서는 알 수 없는 피연산자가 항상 Unknown 결과로 이어집니다(0으로 나누기 제외).
Unknown으로 결과가 나오는 표현식은 트리거 상태("Problem/OK")를 변경하지 않습니다.
따라서 "Problem" 상태였다면(케이스 1 참조), 알려진 부분이 해결되어도('1'이 '0'이 됨) 표현식이 이제 Unknown으로 평가되고 이는 트리거 상태를 변경하지 않기 때문에 동일한 문제 상태를 유지합니다.
여러 지원되지 않는 항목이 포함된 트리거 표현식이 Unknown으로 평가되면 프론트엔드의 오류 메시지는 마지막으로 평가된 지원되지 않는 항목을 참조합니다.