예측 트리거 함수
개요
때로는 다가올 문제의 징후가 나타나기도 합니다. 이러한 징후를 포착하면 문제를 예방하거나 최소한 영향을 최소화하기 위해 사전에 조치를 취할 수 있습니다.
Zabbix에는 과거 데이터를 기반으로 모니터링 대상 시스템의 향후 동작을 예측하는 도구가 있습니다. 이러한 도구는 예측 트리거 함수를 통해 구현됩니다.
함수
트리거를 설정하기 전에, 문제 상태가 무엇인지 그리고 조치를 취하는 데 얼마나 시간이 필요한지 정의해야 합니다. 이후 잠재적으로 바람직하지 않은 상황을 알리는 트리거를 설정하는 방법에는 두 가지가 있습니다. 첫 번째: "조치 시간(time to act)"이 지난 후 시스템이 문제 상태에 있을 것으로 예상될 때 트리거가 발동해야 합니다. 두 번째: 시스템이 "조치 시간(time to act)"보다 짧은 시간 내에 문제 상태에 도달할 것으로 예상될 때 트리거가 발동해야 합니다. 이때 사용할 트리거 함수는 각각 forecast와 timeleft입니다. 두 함수의 기본 통계 분석 방식은 기본적으로 동일하다는 점에 유의하세요. 어느 방식을 선호하든 비슷한 결과로 트리거를 설정할 수 있습니다.
매개변수
두 함수는 거의 동일한 매개변수 집합을 사용합니다. 참고용으로 지원되는 함수 목록을 확인하세요.
시간 간격
먼저 Zabbix가 예측을 산출하기 위해 분석해야 할 과거 기간을
지정해야 합니다. 이는 avg, count, delta, max,
min, sum 함수에서와 마찬가지로 익숙한 방식으로
time period 매개변수와 선택적인 시간 이동(time shift)을 통해
지정합니다.
예측 범위(Forecasting horizon)
(forecast 전용)
time 매개변수는 Zabbix가 과거 데이터에서 발견한 종속성을
미래로 얼마나 멀리까지 외삽(extrapolate)할지를 지정합니다.
time_shift 사용 여부와 관계없이 time은 항상 현재 시점부터
계산됩니다.
도달할 임계값(Threshold to reach)
(timeleft 전용)
threshold 매개변수는 분석 대상 아이템이 도달해야 하는 값을
지정하며, 위쪽에서든 아래쪽에서든 방향은 상관없습니다. f(t)를
구한 후(아래 참조), 방정식 f(t) = threshold를 풀어 현재 시점에서
가장 가깝고 현재 시점보다 미래에 있는 근(root)을 반환합니다.
그런 근이 없으면 1.7976931348623158E+308을 반환합니다.
아이템 값이 임계값에 접근했다가 이를 넘어서면,
timeleft는 해당 교차점이 이미 과거에 발생한 것으로 간주하여
다음으로 threshold 수준과 교차하는 지점이 있다면 그쪽으로
전환합니다. 예측은 기존의 문제 진단을 대체하는 용도가 아니라
보완하는 용도로 사용하는 것이 가장 좋습니다.^1^
피팅 함수(Fit functions)
기본 fit은 linear 함수입니다. 하지만 모니터링 대상 시스템이
더 복잡하다면 선택할 수 있는 옵션이 더 있습니다.
fit |
x = f(t) |
|---|---|
| linear | x = a + b*t |
| polynomialN^2^ | x = a~0~ + a~1~*t + a~2~*t^2^ + ... + a~n~*t^n^ |
| exponential | x = a*exp(b*t) |
| logarithmic | x = a + b*log(t) |
| power | x = a*t^b^ |
모드
(forecast 전용)
트리거 함수가 평가될 때마다 지정된 이력 기간의 데이터를 가져와
지정된 함수를 데이터에 피팅합니다. 따라서 데이터가 조금만
달라져도 피팅된 함수는 조금씩 달라집니다. 만약 미래의 특정
시점에서 피팅된 함수의 값을 단순히 계산한다면, 지금부터 그
미래 시점까지 분석 대상 아이템이 어떻게 동작할 것으로 예상되는지에
대해서는 전혀 알 수 없습니다. 일부 fit 옵션(예: polynomial)의
경우 미래의 단순한 값 하나만으로는 오해를 불러일으킬 수
있습니다.
mode |
forecast 결과 |
|---|---|
| value | f(now + time) |
| max | max~now\ <=\ t\ <=\ now\ +\ time~ f(t) |
| min | min~now\ <=\ t\ <=\ now\ +\ time~ f(t) |
| delta | max - min |
| avg | 정의에 따른 f(t) (now <= t <= now + time)의 평균값 |
세부 사항
큰 숫자로 계산하는 것을 피하기 위해, 지정된 기간의 첫 번째 값의 타임스탬프에 1 ns를 더한 값을 새로운 제로 시점(zero-time)으로 간주합니다(현재 에폭 시간은 10^9^ 정도이고, 에폭의 제곱은 10^18^이며, 배정밀도(double precision)는 약 10^-16^ 수준입니다). 1 ns를 더하는 것은 log(t)를 계산하는 logarithmic과 power 피팅에서 모든 시간 값을 양수로 만들기 위한 것입니다. 시간 이동(time shift)은 linear, polynomial, exponential에는 영향을 주지 않지만(계산이 더 쉽고 정밀해지는 것 외에는), logarithmic과 power 함수의 형태는 변화시킵니다.
발생 가능한 오류
함수는 다음과 같은 상황에서 -1을 반환합니다:
- 지정된 평가 기간에 데이터가 없는 경우;
- 수학 연산의 결과가 정의되지 않는 경우^3^;
- 수치적인 문제가 있는 경우(안타깝게도 일부 입력 데이터 집합에서는 배정밀도 부동소수점 형식의 범위와 정밀도가 충분하지 않을 수 있습니다)^4^.
선택한 피팅이 제공된 데이터를 제대로 설명하지 못하거나 정확한 예측을 하기에 데이터가 너무 적은 경우에도 경고나 오류는 표시되지 않습니다.
예제 및 오류 처리
호스트의 여유 디스크 공간이 곧 부족해질 것이라는 경고를 받으려면 다음과 같은 트리거 표현식을 사용할 수 있습니다:
timeleft(/host/vfs.fs.size[/,free],1h,0)<1h
하지만 오류 코드 -1이 발생하여 트리거가 문제 상태가 될 수도 있습니다. 일반적으로는 이것이 예측이 제대로 작동하지 않는다는 경고를 받게 되므로 좋은 일이며, 왜 그런지 더 자세히 살펴봐야 합니다. 하지만 때로는 나쁜 경우도 있는데, -1은 단순히 지난 한 시간 동안 호스트의 여유 디스크 공간에 대한 데이터가 전혀 얻어지지 않았음을 의미할 수도 있기 때문입니다. 오탐(false positive) 경고가 너무 많이 발생한다면 더 복잡한 트리거 표현식 사용을 고려하세요 ^5^:
timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1
forecast의 경우 상황이 조금 더 어렵습니다. 우선, -1이
트리거를 문제 상태로 만들지 여부는 표현식이
forecast(/host/item,(...))<...인지 아니면
forecast(/host/item,(...))>...인지에 따라 달라집니다.
또한, 아이템 값이 음수인 것이 정상이라면 -1도 유효한 예측값일
수 있습니다. 하지만 실제 세계에서 이런 상황이 발생할 확률은
무시할 수 있는 수준입니다(연산자 =가 어떻게 동작하는지는
여기를
참조하세요). 따라서 -1을 문제로 처리하고 싶다면
... or forecast(/host/item,(...))=-1을, 처리하고 싶지 않다면
... and forecast(/host/item,(...))<>-1을 추가하세요.
각주
^1^ 예를 들어,
timeleft(/host/item,1h,X) < 1h와 같은 단순한 트리거는 아이템
값이 X에 접근하다가 X에 도달한 순간 갑자기 회복되면 문제
상태가 될 수 있습니다. 문제가 아이템 값이 X보다 낮아지는
것이라면 다음을 사용하세요:
last(/host/item) < X or timeleft(/host/item,1h,X) < 1h 문제가
아이템 값이 X보다 높아지는 것이라면 다음을 사용하세요:
last(/host/item) > X or timeleft(/host/item,1h,X) < 1h
^2^ 다항식 차수는 1에서 6까지 가능하며, polynomial1은 linear와 동일합니다. 하지만 더 높은 차수의 다항식은 주의해서 사용하세요. 평가 기간에 다항식 계수를 결정하는 데 필요한 개수보다 적은 데이터 포인트가 포함되어 있으면 다항식 차수가 낮춰집니다(예: polynomial5를 요청했지만 데이터 포인트가 4개뿐인 경우, polynomial3이 피팅됩니다).
^3^ 예를 들어, exponential 또는 power 함수를 피팅하려면 아이템 값의 log()를 계산해야 합니다. 데이터에 0이나 음수가 포함되어 있으면 log()는 양수에 대해서만 정의되므로 오류가 발생합니다.
^4^ linear, exponential, logarithmic, power 피팅의 경우 필요한 모든 계산을 명시적으로 작성할 수 있습니다. polynomial의 경우 value만 추가적인 단계 없이 계산할 수 있습니다. avg 계산에는 다항식의 부정적분(역도함수)을(해석적으로) 계산하는 과정이 포함됩니다. max, min, delta 계산에는 다항식의 도함수를(해석적으로) 계산하고 그 근을(수치적으로) 구하는 과정이 포함됩니다. f(t) = 0을 푸는 것에는 다항식의 근을(수치적으로) 구하는 과정이 포함됩니다.
^5^ 하지만 이 경우 -1로 인해 트리거가 문제 상태에서 회복될
수 있습니다. 완전히 방지하려면 다음을 사용하세요:
timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and ({TRIGGER.VALUE}=0 and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1 or {TRIGGER.VALUE}=1)