众所周知,根据法定的国家法定假日和国际假日,企业的工作流程通常需要更改生产流程,以轮班或更换工作日和非工作日为准。许多组织都有内部生产日历,按计划可以处理技术和业务流程。自主运行的监视系统通常被配置为在正常业务过程中监视业务流程,并具有固定的固定时间表以监视伴随业务流程的信息流和数据。在更改日常工作时间表时,管理员需要手动操作来更改监视逻辑。如何让Zabbix使用生产日历?让我们更详细地考虑一些选项。
介绍
与Zabbix一起工作的每个人都知道,监视某些服务的逻辑是通过使用模板来形成的,这些模板连接到具有受控服务的服务器。更改工作逻辑或检查服务的时间表是一项非常耗时的任务,它取决于受控元素的数量。为了避免误触发事件触发器,在更改工作日程(而不是工作日)时,强制管理员将监视电路发送到维护模式“维护”。对于周末的工作日,您必须包括许多监视服务以控制业务流程的工作。
从Zabbix灵活安排监视触发器的官方建议是使用全局宏
https://habr.com/zh-cn/company/zabbix/blog/344492/替换扫描周期的参数。
但是,该解决方案不允许以
显式形式自动执行按计划检查服务的开/关过程。
Zabbix服务器是一个自治系统,显然可以在其内部逻辑框架内工作。因此,不建议对系统产生外部影响。
让我们尝试基于内部Zabbix机制实现生产日历的逻辑。
我必须马上说,已经尝试了大量选项来测试各种配置下的生产日历。以下仅是经过严格测试的工作示例。
部署模板位于github.com上,位于文章末尾的链接。
局限性
Zabbix服务器的逻辑受以下限制:
- Zabbix关于控制特定网络节点数据的工作的整个逻辑仅限于该网络节点
- 被监视节点的数据节点与Zabbix服务器的数据空间不重叠
- 节点数据元素的功能(计算)更改仅受整数值限制
- 触发器依赖性受主机空间限制
Zabbix服务器系统连接
当Zabbix服务器运行时,允许以下约定:
:
- Zabbix-agent. Zabbix-agent
- , ,
№1
.
{$DATEURL} . "HTTP agent" "holiday.date.by.http".
( 1). 1. .
![](https://habrastorage.org/webt/jy/uq/0l/jyuq0l3l892opr9jselcjiptbqm.png)
.
"Preprocessing" "$.date".
![](https://habrastorage.org/webt/h-/11/-a/h-11-awzmg8jyd3tpaxbbfotsqa.png)
, "holiday.date.by.http" .
"Calculated" "today.is.a.holiday"
![](https://habrastorage.org/webt/u9/si/8y/u9si8y77dxbze_pgobaa-soyd4e.png)
:
last(holiday.date.by.http)=date(system.localtime)
"Numeric(Unsigned)"
, 0 1.
, 0 1 . , "" , . .
, :
" "
" " . .
:
{Zabbix server:system.users.num.last()}>1
{Zabbix server:system.users.num.last()}>1 and {Zabbix server:today.is.a.holiday.last()}=0
.
.
" "
"/".
"today.is.a.holiday" .
![](https://habrastorage.org/webt/ie/z8/4a/iez84a2boqqao9suirse0dgv4rs.png)
.
![](https://habrastorage.org/webt/dh/pw/cb/dhpwcbvknos_ehlbqfkj2izlbba.jpeg)
.
. "{Zabbix server:system.users.num.last()}>1", 1.
"{Zabbix server:proc.num.last()}>20"
""
![](https://habrastorage.org/webt/1w/zi/ef/1wziefcapb0doatvsvafj-aitjw.jpeg)
![](https://habrastorage.org/webt/vt/eb/am/vtebamf2nmeiuq5xjmcjoxxkh8s.jpeg)
(, TG, SMS).
. . .
№2
, Zabbix . , . .
?
1
- , .
2
, .
, .
, . {$HOLIDAY_DATE}. , , Zabbix-agent, {$CURRENT_DATE} .
InfluxDB. , 1 5 .
InfluxDB
, . fuzzytime . .
<item>
<name>Today is a holiday</name>
<type>CALCULATED</type>
<key>influxdb.holiday</key>
<history>1h</history>
<trends>0</trends>
<params>date(system.localtime)={$HOLIDAY_DATE}</params>
<applications>
<application>
<name>InfluxDB DataCheck</name>
</application>
</applications>
<triggers>
<trigger>
<expression>{last()}</expression>
<name>InfluxDB Holiday Activated</name>
<opdata>If Fired - all dependent triggers are disabled</opdata>
<priority>INFO</priority>
<description> </description>
</trigger>
</triggers>
</item>
.
, .
<params>{$CURRENT_DATE}={$HOLIDAY_DATE}</params>
, .
"" , " , Zabbix ?"
, , . Zabbix JSON RPC, , . Zabbix , , . , Zabbix , .
![](https://habrastorage.org/webt/ak/cy/sh/akcyshemlekp1-0a0lq9somgutu.jpeg)
Preprocessing .
![](https://habrastorage.org/webt/xp/ec/dj/xpecdje882mioyb-s7nbz9cvqos.jpeg)
Preprocessing Script//Zabbix.Log(2, 'Date Update request value='+value);
var authtoken = '';
var globalmacroid = -1;
var req = new CurlHttpRequest();
req.AddHeader('Content-Type: application/json');
resp = req.Post("{$DATEURL}", '{}');
var holidaydate = JSON.parse(resp).date;
Zabbix.Log(2, 'Found new holiday date='+holidaydate);
resp = req.Post("{$JSONRPC}", '{"jsonrpc": "2.0","method": "user.login","params": {"user": "Calendar","password": "SomePassword"},"id": 1}');
//
if (req.Status() == 200) {
jv = JSON.parse(resp);
if (jv.result)
authtoken= jv.result;
else
return 0;
}
else
return 0;
//
var reqmacros =
{
"jsonrpc": "2.0",
"method": "usermacro.get",
"params": {
"output": "extend",
"globalmacro": true
},
"auth": authtoken,
"id": 1
}
resp = req.Post("{$JSONRPC}", JSON.stringify(reqmacros));
if (req.Status() == 200) {
var jv = JSON.parse(resp);
for(item in jv.result) {
if (jv.result[item].macro == '{\$HOLIDAY_DATE}')
{
globalmacroid = jv.result[item].globalmacroid
Zabbix.Log(2, 'Old Date value: '+jv.result[item].value)
}
}
if (globalmacroid == -1)
return 0;
}
else
{
return 0;
}
//
var changemacros =
{ "jsonrpc": "2.0",
"method": "usermacro.updateglobal",
"params": {
"globalmacroid": globalmacroid,
"value": holidaydate
},
"auth": authtoken,
"id": 1
}
resp = req.Post("{$JSONRPC}", JSON.stringify(changemacros));
if (req.Status() == 200) {
jv = JSON.parse(resp);
if (jv.result.globalmacroids.indexOf(globalmacroid) != -1)
return 1
}
return 0;
"{$HOLIDAY_DATE}" "{$CURRENT_DATE}". , . — . .
, , / , -, / .
P.S.: , WEB , "HTTP agent" .
github.com
UPD: .
" ". 4.X , . , .
© Aborche 2020
![阿伯切](https://habrastorage.org/getpro/habr/post_images/7c5/e49/ede/7c5e49ede95e47e91424dbb9bafbb7bb.jpg)