Диплом: Разработка автоматизированной информационной системы мониторинга промышленного кондиционирования ЦОД

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
41
23 use local-service
2вариант охлаждающей системы4 hostgroup_name
Conditioner6H5, 351
25 service_description Conditioner GE/CW
26
27 }
28
Данный сервис будет отображать показание влажности воздуха
проходящего через кондиционер.
29 define service{
30 use local-service
31 hostgroup_name Conditioner6H5, 351
32 service_description Conditioner humidity
33
34 }
35
Этот сервис будет отображать в системе мониторинга значение
температуры воздуха проходящего через кондиционер.
36 define service{
37 use local-service
38 hostgroup_name Conditioner6H5, 351
39 service_description Conditioner temperature
40
41 }
42
Данную операцию требуется произвести со всеми кондиционерами,
после чего приступить к подключению в /usr/local/nagios/etc/nagios.cfg:
1 cfg_file=/usr/local/nagios/etc/objects/hosts.cfg
2 cfg_file=/usr/local/nagios/etc/objects/host_groups.cfg
3 cfg_file=/usr/local/nagios/etc/objects/services.cfg
Скелет системы мониторинга уже сделан, теперь требуется вывести
данные выходных данных в систему. Почему нельзя сразу вывести все, по
то простой причине что это не будет соответствовать ТЗ и опрос будет
производиться очень долго, поэтому опрос будет производиться в два
этапа:
42
Опрос и логирование выходных данных в файл;
Опрашивание скриптом лог файлов и вывод данных в
NAGIOS.
На языке С++ мы создаем скрипт опроса и логирования выходных
данных. Данный скрипт будет опрашивать по № OID которое мы ему
присвоили, и собирать в лог файл данные командой stulzair -H 10.20.10.53 -
d 1 -l 6h5-conditioner-351.log -P /var/nagdata/inst1/wwwdata (для каждого
кондиционера отдельная команда и запрос на логирование файлов и
выдачу). Так же в этом скрипте мы указываем границы, при которых он
должен забирать значения. Для машинного зала температура холодного
коридора в рамках SLA не должна превышать 21 С
0
, влажность не выше
40%.
Сам скрипт будет следующего содержания:
#!/usr/bin/
use strict;
my $logfile = $ARGV[0];
my $addr = $ARGV[1];
my $div = $ARGV[2];
my $u = $ARGV[3];
Назначаем границы, где параметр «w» (Warning) означает, что показания
опрашиваемого параметра приблежен к критическому значению. А
параметр «с» (Critical) означает, переход опрашиваемого параметра за
пределы допустимых значений.
#my $comp = 5; # 1 нижняя граница, 2 верхняя граница, 0 конкретно
значение
my $w;
my $c;
#if (exists($ARGV[4]))
#{
43
После создания границ нам необходимо сравнивать текущее значение с
установленными границами.
# $comp = $ARGV[4]; # устанавливаем режим сравнения с нижней или
верхней границей
#}
if( exists($ARGV[4]))
{
$w = $ARGV[4];
}
if( exists($ARGV[5]))
{
$c = $ARGV[5];
}
Теперь мы получаем значение из Log-файла, в результате получения
без ошибок в Nagios будет выводиться строка «OK: wait next check» (ОК:
ожидается следующая проверка).
# Получение обрабатываемого значения
my $in = `cat /var/nagdata/inst1/wwwdata/$logfile | grep "$addr :"`;
my @arr = split(/ /, $in);
if( $in eq ""){
printf("OK: wait next check\n");
exit(0);
}
$in = $arr[2]*1/$div;
Описываем появление нештатных показателей Warning и Critical по
сравнению данных с верхней и нижней границей. Так же опишем
состояние ошибки обрабатываемых данных Unknown, когда Warning
больше Critical по установленной верхней границе.
44
# Наличие алармов
if( defined($c) and defined($w))
{
##
## Случай проверки на превышения верхней границы
##
if( $w =~ /^\d+$/ and $c =~/^\d+$/ ){
# Проверим правильность порогов
if( $c < $w ){
printf("UNKNOWN: Crit < Warn");
exit(3);
}
####
if( $in > $c ) {
printf("CRITICAL: %.1f %s (> %.1f) | rta=%.1f;%.1f;%.1f;0;100\n",
$in, $u, $c, $in, $w, $c);
exit(2);
}elsif ( $in <= $w) {
printf("OK: %.1f %s | rta=%.1f;%.1f;%.1f;0;100\n", $in, $u, $in, $w,
$c);
exit(0);
}else{
printf("WARNING: %.1f %s (> %.1f) | rta=%.1f;%.1f;%.1f;0;100\n",
$in, $u, $w, $in, $w, $c);
exit(1);
}
}elsif( $w =~ /^\d+:$/ and $c =~/^\d+:$/ ){
##
45
На данном этапе нам необходимо описать в коде состояние ошибки
обрабатываемых данных Unknown, когда Warning меньше Critical по
установленной нижней границе.
## Проверка на значения ниже порога
##
if( $c > $w ){
printf("UNKNOWN: Crit > Warn");
exit(3);
}
####
if( $in < $c ) {
printf("CRITICAL: %.1f %s (< %.1f) | rta=%.1f;%.1f;%.1f;0;100\n",$in,
$u, $c, $in, $w, $c);
exit(2);
}elsif ( $in > $w) {
printf("OK: %.1f %s | rta=%.1f;%.1f;%.1f;0;100\n", $in, $u, $in, $w, $c
);
exit(0);
}else{
printf("WARNING: %.1f %s (< %.1f) |
rta=%.1f;%.1f;%.1f;0;100\n",$in, $u, $w, $in, $w, $c);
exit(1);
}
}elsif( $w =~ /^\d+:\d+$/ and $c =~ /^\d+:\d+$/ ){
#printf(" r <>: ");
$w =~ m/^(\d+):(\d+)$/;
my $wl = $1;
my $wh = $2;
46
$c =~ m/^(\d+):(\d+)$/;
my $cl = $1;
my $ch = $2;
#printf("w=$w: wl=$wl, wh=$wh, cl=$cl, ch=$ch\n");
##
Если данные из Log-файла читаются с ошибкой, то есть может произойти
сбой и значение будут вне диапазона, потребуется это так же описать.
Определить, что вывелось значение вне диапазона очень просто, оно будет
координально отличаться от показаний за последний час и будет носить
кратковременный характер.
## Проверка на значения вне диапазона
##
if( $cl > $ch or $wl > $wh){
printf("UNKNOWN: Error threhold");
exit(3);
}
####
В данной части необходимо описать вывод значений в системе
мониторинга для каждого состояния и описать правило проверки значения
внутри заданного диапазона значений, начнем со статуса Critical.
if( $in < $cl or $in > $ch ) {
printf("CRITICAL: %.1f %s crit(%.1f:%.1f) |
rta=%.1f;%.1f;%.1f;0;100\n",$in ,$u,$cl ,$ch ,$in ,$w ,$c );
exit(2);
}elsif ( $in >= $wl and $in <= $wh) {
printf("OK: %.1f %s | rta=%.1f;%.1f;%.1f;%.1f;%.1f\n",$in ,$u,$in ,$wl
,$cl ,$wh ,$ch );
47
exit(0);
}else{
Добавим отображение статуса Warning
printf("WARNING: %.1f %s warn(%.1f:%.1f) |
rta=%.1f;%.1f;%.1f;0;100\n",$in ,$u,$wl ,$wh ,$in ,$w ,$c );
exit(1);
}
}elsif( $w =~ /^@\d+:\d+$/ and $c =~/^@\d+:\d+$/ ){
# printf(" r >< ");
$w =~ m/^@(\d+):(\d+)$/;
my $wl = $1;
my $wh = $2;
$c =~ m/^@(\d+):(\d+)$/;
my $cl = $1;
my $ch = $2;
# printf("w=$w: wl=$wl, wh=$wh, cl=$cl, ch=$ch\n");
##
Данная проверка проводит сравнение полученного значения с заданномы
диапазоном и выводит в систему мониторинга понятные для человека
описанные выше значения: OK, Warning, Critical и Unknown в зависимости
от полученного значения.
## Проверка на значения внутри диапазона
##
if( $cl > $ch or $wl > $wh){
printf("UNKNOWN: Error threhold");
exit(3);
}
####
48
if( $in >= $cl and $in <= $ch ) {
printf("CRITICAL: %.1f %s crit@(%.1f:%.1f) |
rta=%.1f;%.1f;%.1f;%.1f;%.1f\n",$in ,$u,$cl ,$ch ,$in ,$wl ,$cl ,$wh ,$ch );
exit(2);
}elsif ( $in < $wl or $in > $wh) {
printf("OK: %.1f %s | rta=%.1f;%.1f;%.1f;%.1f;%.1f\n",$in ,$u,$in ,$wl
,$cl ,$wh ,$ch );
exit(0);
}elsif( $in >= $wl and $in <= $wh) {
printf("WARNING: %.1f %s warn@(%.1f:%.1f) |
rta=%.1f;%.1f;%.1f;%.1f;%.1f\n",$in ,$u,$wl ,$wh ,$in ,$wl ,$cl ,$wh ,$ch );
exit(1);
}
}
}else
{
printf("OK: %.1f %s | rta=%.1f;%.1f;%.1f;%.1f;%.1f\n", $in, $u ,$in ,0 ,0 ,0
,0 );
exit(0);
}
exit(0);
Переходим к настройке системы NAGIOS. Созданный скрипт будет
опрашивать log.файл, который будет в свою очередь выводить выходные
данные в NAGIOS:
#include <iostream>
#include <getopt.h>
#include <string>
49
#include <cstring>
//#include <string.h>
#include <modbus/modbus.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
Описываем действия скрипта в системе и путь к необходимому Log-файлу
#define MAX_ADDR 100
using namespace std;
int mb_connect_f4( modbus_t *mb, FILE * flog, string logname, int devnum, int
sad, int len, uint16_t *tab_reg16, char *IPad );
int mb_connect_f1( modbus_t *mb, FILE * flog, string logname, int devnum, int
sad, int len, uint8_t *tab_reg8, char *IPad );
void print_help() {
cout
<< "ModBus TCP Reader version 0.01 by Roman Suchkov aka Fineson" <<
endl
Как и в любом коде у нас должны быть команды помошники, здесь
описаны команды помощники с помощью которых можно узнать
необходимые сведения при ручном опросе Log-файла.
<< "-h --help Print this help" << endl
<< "-H --ip= <IP address>" << endl
<< "-p --port= [Port number] Default 502" << endl
<< "-d --device= [Device number] Default 1" << endl
<< "-s --start= [Start reference] Default 1" << endl
<< "-l --len= [Number of values] Default 1" << endl
<< "-f --function= <Number of functions>" << endl
50
<< "-c --console = <output to console>" << endl
<< " 1 - Read coils" << endl
<< " 2 - Read input discretes" << endl
<< " 3 - Read multiple registers" << endl
<< " 4 - Read input registers" << endl << endl
<< " Example: ./modbtget -H 192.168.1.123 --port=1502 -d 1 -s 13 --len=10 -
f 4" << endl
<< endl;
}
struct rowlog_s {
char addr[10];
char val[10];
// char* addr;
// char* val;
};
Описываем данные для начала опроса и начала операции вывода
необходимых значений на экраны пользователя.
typedef struct rowlog_s rowlog_t;
int main(int argc, char **argv) {
rowlog_t rl[MAX_ADDR];
modbus_t *mb;
uint16_t tab_reg16[MAX_ADDR];
uint8_t tab_reg8[MAX_ADDR];
int err=0;
int mport = 502; // Port number
int devnum = 1; // Device number
int sad = 1; // Start address
int nv = 1; // Length

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)
Value-based education: ценности в системе образования и способы их реализации на уроке английского языка. Опыт Европейских стран