Conectamos un calendario de producción en Zabbix

Como todos sabemos, el proceso de trabajo de una empresa, de acuerdo con los feriados oficiales nacionales e internacionales, a menudo requiere un cambio en el proceso de producción en términos de cambio o reemplazo de días laborables y no laborables. Muchas organizaciones tienen calendarios internos de producción, en cuyo calendario trabajan procesos tecnológicos y comerciales. Los sistemas de monitoreo que funcionan de manera autónoma, a menudo están configurados para monitorear los procesos comerciales en el curso normal del negocio y tienen un horario fijo fijo para monitorear los flujos de información y los datos que acompañan los procesos comerciales. Al momento de cambiar el horario de trabajo diario, los administradores requieren acciones manuales para cambiar la lógica de monitoreo.¿Cómo hacer que Zabbix use un calendario de producción? Consideremos algunas opciones con más detalle.


Introducción


Todos los que trabajaron con Zabbix saben que la lógica de monitorear ciertos servicios se forma usando plantillas que se conectan a servidores con servicios controlados. Cambiar la lógica del trabajo o el cronograma para verificar los servicios es una tarea que requiere bastante tiempo, que depende de la cantidad de elementos controlados. Al cambiar el horario de trabajo, cuando en lugar de la jornada laboral se declara un feriado, para evitar la activación errónea de disparadores de eventos, los administradores deben enviar el circuito de monitoreo al modo de mantenimiento "Mantenimiento". En el caso de un día laboral el fin de semana, debe incluir muchos servicios de monitoreo con sus manos para controlar el trabajo de los procesos comerciales.


La recomendación oficial para una programación flexible de los activadores de monitoreo de Zabbix es reemplazar los parámetros de los ciclos de escaneo con macros globales
https://habr.com/en/company/zabbix/blog/344492/ .
Pero esta solución no permite automatizar el
proceso de activación / desactivación de la verificación de servicios en un horario de forma explícita.


El servidor Zabbix es un sistema autónomo que claramente funciona dentro del marco de su lógica interna. Por lo tanto, no se recomiendan las influencias externas en el sistema.


Intentemos implementar la lógica del calendario de producción basada en mecanismos internos de Zabbix.


, . , .
github.com, .



Zabbix :


  • Zabbix
  • Zabbix
  • ()

Zabbix


Zabbix :


  • ,
  • ""


  • , /
  • ,
  • HTTP/HTTPS


:




  • Zabbix-agent. Zabbix-agent
  • , ,

№1


.
{$DATEURL} . "HTTP agent" "holiday.date.by.http".


( 1). 1. .



.
"Preprocessing" "$.date".



, "holiday.date.by.http" .


"Calculated" "today.is.a.holiday"



:
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" .



.



.


. "{Zabbix server:system.users.num.last()}>1", 1.


"{Zabbix server:proc.num.last()}>20"


""





(, 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 , .




Preprocessing .



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
Aborche


All Articles