Nous connectons un calendrier de production dans Zabbix

Comme nous le savons tous, le processus de travail d'une entreprise, conformément aux jours fériés officiels nationaux et internationaux, nécessite souvent une modification du processus de production en termes de décalage ou de remplacement des jours ouvrables et non ouvrables. De nombreuses organisations ont des calendriers de production internes, sur le calendrier desquels fonctionnent les processus technologiques et commerciaux. Les systèmes de surveillance qui fonctionnent de manière autonome, sont souvent configurés pour surveiller les processus commerciaux dans le cours normal des affaires et ont un calendrier fixe fixe pour surveiller les flux d'informations et les données accompagnant les processus commerciaux. Au moment de modifier l'horaire de travail quotidien, les administrateurs nécessitent des actions manuelles pour modifier la logique de surveillance.Comment amener Zabbix à utiliser un calendrier de production? Examinons quelques options plus en détail.


introduction


Tous ceux qui ont travaillé avec Zabbix savent que la logique de surveillance de certains services est formée à l'aide de modèles qui se connectent à des serveurs avec des services contrôlés. Changer la logique du travail ou le calendrier de vérification des services est une tâche assez longue, qui dépend du nombre d'éléments contrôlés. La modification de l'horaire de travail, lorsqu'au lieu du jour ouvrable, un jour férié est déclaré, afin d'éviter le déclenchement erroné de déclencheurs d'événements, oblige les administrateurs à envoyer le circuit de surveillance en mode de maintenance "Maintenance". Dans le cas d'une journée de travail le week-end, vous devez inclure de nombreux services de surveillance pour contrôler le travail des processus métier.


La recommandation officielle pour une planification flexible des déclencheurs de surveillance de Zabbix est de remplacer les paramètres des cycles de scan par des macros globales
https://habr.com/en/company/zabbix/blog/344492/ .
Mais cette solution ne permet pas d'automatiser le
processus d'activation / désactivation de la vérification des services sur un calendrier sous une forme explicite.


Le serveur Zabbix est un système autonome qui fonctionne clairement dans le cadre de sa logique interne. Par conséquent, les influences externes sur le système ne sont pas recommandées.


Essayons d'implémenter la logique du calendrier de production sur la base des mécanismes internes 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