Данные берем из файла C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml
Мониторинг доступной квоты
квота задаётся в макросе
Отправка {$OTRAFKVOTA}
Прием {$PTRAFKVOTA}
За сутки
Отправка {$ODTRAFKVOTA}
Прием {$PDTRAFKVOTA}
Шаблон Элементы данных:
Содержимое файла в JSON: test Обнаружение правил трафика serc.traffic.rulestrafsvc.tmeter 90d Зависимый элемент данных TrafSvc Деактивировано
Предобработка
Показать
Код: Выделить всё
// Преобразуем строку JSON в объект
var jsonObj = JSON.parse(value);
// Инициализируем массив для результата
var result = [];
// Получаем массив фильтров из JSON
var filters = jsonObj.TrafficReport.Filter;
// Функция для получения последней доступной даты и времени
function getLastDate(day) {
if (Array.isArray(day)) {
var lastEntry = day[day.length - 1];
var lastDate = lastEntry.dt;
if (lastEntry.Day2h) {
var lastDay2hEntry = lastEntry.Day2h[lastEntry.Day2h.length - 1];
if (lastDay2hEntry) {
lastDate = lastDay2hEntry.dt;
}
}
return lastDate;
} else {
var lastDate = day.dt;
if (day.Day2h) {
lastDate = day.Day2h.dt;
}
return lastDate;
}
}
// Проходим по каждому фильтру и создаем новый объект с необходимыми свойствами
for (var i = 0; i < filters.length; i++) {
var filter = filters[i];
var lastDate = getLastDate(filter.Day);
var transformed = {
"{#TMETERID}": filter.Id,
"{#TMETERNAME}": filter.Name,
"{#TMETERDAYDT}": lastDate
};
result.push(transformed);
}
// Возвращаем результат в виде строки JSON
return JSON.stringify(result).replace(/\[/g, "[\n").replace(/\},/g, "},\n").replace(/\}]/g, "}\n]");
Получение содержимого файла: Содержимое файла в JSON json.trafsvc.tmete 0 Зависимый элемент данных TrafSvc Активировано
Предобработка
Показать
Код: Выделить всё
//Преобразуем XML в JSON
// Проверка на пустую строку
if (value === '') {
// Выводим пустой результат если строка пустая, дальше ничего не делаем.
return value;
} else {
// Удалим первые 1-2 строки в XML
var stdl = value.replace(/\<\?xml(.+?)\?\>[\n\r]/g, "").replace(/version="[0-9.]+"\s+xmlns=.*\"/g, "");
// Преобразуем XML в JSON
var fromXML;
!function(r) {
var t = {"&": "&", "<": "<", ">": ">", "'": "'", """: '"'};
function n(r) { return r && r.replace(/^\s+|\s+$/g, ""); }
function s(r) { return r.replace(/(&(?:lt|gt|amp|apos|quot|#(?:\d{1,6}|x[0-9a-fA-F]{1,5}));)/g, function(r) { if ("#" === r[1]) { var n = "x" === r[2] ? parseInt(r.substr(3), 16) : parseInt(r.substr(2), 10); if (n > -1) return String.fromCharCode(n); } return t[r] || r; }); }
function e(r, t) {
if ("string" == typeof r) return r;
var u = r.r;
if (u) return u;
var a, o = function(r, t) {
if (r.t) {
for (var e, u, a = r.t.split(/([^\s='"]+(?:\s*=\s*(?:'[\S\s]*?'|"[\S\s]*?"|[^\s'"]*))?)/), o = a.length, i = 0; i < o; i++) {
var l = n(a[i]);
if (l) {
e || (e = {});
var c = l.indexOf("=");
if (c < 0) l = l, u = null;
else {
u = l.substr(c + 1).replace(/^\s+/, ""), l = l.substr(0, c).replace(/\s+$/, "");
var p = u[0];
p !== u[u.length - 1] || "'" !== p && '"' !== p || (u = u.substr(1, u.length - 2)), u = s(u);
}
t && (u = t(l, u)), f(e, l, u);
}
}
return e;
}
}(r, t), i = r.f, l = i.length;
if (o || l > 1) a = o || {}, i.forEach(function(r) { "string" == typeof r ? f(a, "#", r) : f(a, r.n, e(r, t)); });
else if (l) {
var c = i[0];
if (a = e(c, t), c.n) {
var p = {};
p[c.n] = a, a = p;
}
} else a = r.c ? null : "";
return t && (a = t(r.n || "", a)), a;
}
function f(r, t, n) { if (void 0 !== n) { var s = r[t]; s instanceof Array ? s.push(n) : r[t] = t in r ? [s, n] : n; } }
r.fromXML = fromXML = function(r, t) { return e(function(r) { for (var t = String.prototype.split.call(r, /<([^!<>?](?:'[\S\s]*?'|"[\S\s]*?"|[^'"<>])*|!(?:--[\S\s]*?--|\[[^\[\]'"<>]+\[[\S\s]*?]]|DOCTYPE[^\[<>]*?\[[\S\s]*?]|(?:ENTITY[^"<>]*?"[\S\s]*?")?[\S\s]*?)|\?[\S\s]*?\?)>/), e = t.length, f = {f: []}, u = f, a = [], o = 0; o < e;) {
var i = t[o++];
i && v(i);
var l = t[o++];
l && c(l);
}
return f;
function c(r) {
var t = r.length, n = r[0];
if ("/" === n) for (var s = r.replace(/^\/|[\s\/].*$/g, "").toLowerCase(); a.length;) {
var e = u.n && u.n.toLowerCase();
if (u = a.pop(), e === s) break;
} else if ("?" === n) p({n: "?", r: r.substr(1, t - 2)});
else if ("!" === n) "[CDATA[" === r.substr(1, 7) && "]]" === r.substr(-2) ? v(r.substr(8, t - 10)) : p({n: "!", r: r.substr(1)});
else {
var f = function(r) {
var t = {f: []}, n = (r = r.replace(/\s*\/?$/, "")).search(/[\s='"\/]/);
n < 0 ? t.n = r : (t.n = r.substr(0, n), t.t = r.substr(n));
return t;
}(r);
p(f), "/" === r[t - 1] ? f.c = 1 : (a.push(u), u = f);
}
}
function p(r) { u.f.push(r); }
function v(r) { (r = n(r)) && p(s(r)); }
}(r), t); };
}("object" == typeof exports && exports || {});
// Преобразовываем и выводим результат
var jsonString = JSON.stringify(fromXML(stdl));
// Удаляем "@" из ключей
jsonString = jsonString.replace(/"@/g, '"');
// Возвращаем результат в читаемом виде с переносами строк
return jsonString.replace(/\{/g, "{\n").replace(/\[/g, "[\n").replace(/\,/g, ",\n").replace(/\"}/g, "\"\n}").replace(/\]/g, "\n]");
}
Контрольная сумма файла vfs.file.cksum[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml] 1h 90d 90d Zabbix агент TrafSvc Активировано
Проверка существования файла Триггеры 1 vfs.file.exists[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml] 1h 90d 90d Zabbix агент TrafSvc Активировано
MD5 контрольная сумма файла vfs.file.md5sum[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml] 1h 90d Zabbix агент TrafSvc Активировано
Размер файла Триггеры 1 vfs.file.size[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml] 1h 90d 90d Zabbix агент TrafSvc Активировано
Информация о времени файла vfs.file.time[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml] 1h 90d 90d Zabbix агент TrafSvc Активировано
Поиск строки в файле vfs.file.regexp[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml,utf8,начальная строка,конечная строка,вывод] 1h 90d Zabbix агент TrafSvc Деактивировано
Триггеры
Внимание/Предупреждение Файл не найден {$DATE_YYYY}-{$DATE_MM}.xml {TrafSvc TMeter:vfs.file.exists[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml].last()}=0 Активировано
Информационная Файл более 300Mb {$DATE_YYYY}-{$DATE_MM}.xml {TrafSvc TMeter:vfs.file.size[C:\Program Files\TMeter\XmlTrafficReports\{$DATE_YYYY}-{$DATE_MM}.xml].last()}>=300M Активировано
Правила обнаружения
Получение содержимого файла: Обнаружение правил трафика Прототипы элементов данных 4 Прототипы триггеров 5 Прототипы графиков 2 Прототипы узлов сети detecting.traffic.rulestrafsvc.tmeter Зависимый элемент данных Активировано
Предобработка
Показать
Код: Выделить всё
//Преобразуем XML в JSON
// Проверка на пустую строку
if (value === '') {
// Выводим пустой результат если строка пустая, дальше ничего не делаем.
return value;
} else {
// Удалим первые 1-2 строки в XML
var stdl = value.replace(/\<\?xml(.+?)\?\>[\n\r]/g, "").replace(/version="[0-9.]+"\s+xmlns=.*\"/g, "");
// Преобразуем XML в JSON
var fromXML;
!function(r) {
var t = {"&": "&", "<": "<", ">": ">", "'": "'", """: '"'};
function n(r) { return r && r.replace(/^\s+|\s+$/g, ""); }
function s(r) { return r.replace(/(&(?:lt|gt|amp|apos|quot|#(?:\d{1,6}|x[0-9a-fA-F]{1,5}));)/g, function(r) { if ("#" === r[1]) { var n = "x" === r[2] ? parseInt(r.substr(3), 16) : parseInt(r.substr(2), 10); if (n > -1) return String.fromCharCode(n); } return t[r] || r; }); }
function e(r, t) {
if ("string" == typeof r) return r;
var u = r.r;
if (u) return u;
var a, o = function(r, t) {
if (r.t) {
for (var e, u, a = r.t.split(/([^\s='"]+(?:\s*=\s*(?:'[\S\s]*?'|"[\S\s]*?"|[^\s'"]*))?)/), o = a.length, i = 0; i < o; i++) {
var l = n(a[i]);
if (l) {
e || (e = {});
var c = l.indexOf("=");
if (c < 0) l = l, u = null;
else {
u = l.substr(c + 1).replace(/^\s+/, ""), l = l.substr(0, c).replace(/\s+$/, "");
var p = u[0];
p !== u[u.length - 1] || "'" !== p && '"' !== p || (u = u.substr(1, u.length - 2)), u = s(u);
}
t && (u = t(l, u)), f(e, l, u);
}
}
return e;
}
}(r, t), i = r.f, l = i.length;
if (o || l > 1) a = o || {}, i.forEach(function(r) { "string" == typeof r ? f(a, "#", r) : f(a, r.n, e(r, t)); });
else if (l) {
var c = i[0];
if (a = e(c, t), c.n) {
var p = {};
p[c.n] = a, a = p;
}
} else a = r.c ? null : "";
return t && (a = t(r.n || "", a)), a;
}
function f(r, t, n) { if (void 0 !== n) { var s = r[t]; s instanceof Array ? s.push(n) : r[t] = t in r ? [s, n] : n; } }
r.fromXML = fromXML = function(r, t) { return e(function(r) { for (var t = String.prototype.split.call(r, /<([^!<>?](?:'[\S\s]*?'|"[\S\s]*?"|[^'"<>])*|!(?:--[\S\s]*?--|\[[^\[\]'"<>]+\[[\S\s]*?]]|DOCTYPE[^\[<>]*?\[[\S\s]*?]|(?:ENTITY[^"<>]*?"[\S\s]*?")?[\S\s]*?)|\?[\S\s]*?\?)>/), e = t.length, f = {f: []}, u = f, a = [], o = 0; o < e;) {
var i = t[o++];
i && v(i);
var l = t[o++];
l && c(l);
}
return f;
function c(r) {
var t = r.length, n = r[0];
if ("/" === n) for (var s = r.replace(/^\/|[\s\/].*$/g, "").toLowerCase(); a.length;) {
var e = u.n && u.n.toLowerCase();
if (u = a.pop(), e === s) break;
} else if ("?" === n) p({n: "?", r: r.substr(1, t - 2)});
else if ("!" === n) "[CDATA[" === r.substr(1, 7) && "]]" === r.substr(-2) ? v(r.substr(8, t - 10)) : p({n: "!", r: r.substr(1)});
else {
var f = function(r) {
var t = {f: []}, n = (r = r.replace(/\s*\/?$/, "")).search(/[\s='"\/]/);
n < 0 ? t.n = r : (t.n = r.substr(0, n), t.t = r.substr(n));
return t;
}(r);
p(f), "/" === r[t - 1] ? f.c = 1 : (a.push(u), u = f);
}
}
function p(r) { u.f.push(r); }
function v(r) { (r = n(r)) && p(s(r)); }
}(r), t); };
}("object" == typeof exports && exports || {});
// Преобразовываем и выводим результат
var jsonString = JSON.stringify(fromXML(stdl));
// Удаляем "@" из ключей
jsonString = jsonString.replace(/"@/g, '"');
// Возвращаем результат в читаемом виде с переносами строк
return jsonString.replace(/\{/g, "{\n").replace(/\[/g, "[\n").replace(/\,/g, ",\n").replace(/\"}/g, "\"\n}").replace(/\]/g, "\n]");
}
Код: Выделить всё
// Преобразуем строку JSON в объект
var jsonObj = JSON.parse(value);
// Инициализируем массив для результата
var result = [];
// Получаем массив фильтров из JSON
var filters = Array.isArray(jsonObj.TrafficReport.Filter) ? jsonObj.TrafficReport.Filter : [jsonObj.TrafficReport.Filter];
// Проходим по каждому фильтру и создаем новый объект с необходимыми свойствами
for (var i = 0; i < filters.length; i++) {
var filter = filters[i];
var lastDate = "";
// Проверяем, является ли Day массивом или объектом и не пусто ли оно
if (Array.isArray(filter.Day) && filter.Day.length > 0) {
// Если Day является массивом и не пусто, находим последнюю дату
lastDate = filter.Day[filter.Day.length - 1].dt;
} else if (filter.Day && typeof filter.Day === 'object') {
// Если Day является объектом, берем значение dt из объекта
lastDate = filter.Day.dt;
}
var transformed = {
"{#TMETERID}": filter.Id,
"{#TMETERNAME}": filter.Name,
"{#TMETERDAYDT}": lastDate
};
result.push(transformed);
}
// Возвращаем результат в виде строки JSON
return JSON.stringify(result, null, 2);
A {#TMETERNAME} не соответствует пример
Прототипы элементов данных
Содержимое файла в JSON: За Сутки Трафик Приема правило: {#TMETERID} {#TMETERNAME} recv.d.[{#TMETERID}] 90d 90d Зависимый элемент данных Квота TrafSvc Да
Предобработка
Показать
Код: Выделить всё
// Преобразуем JSON в объект JS
var obj = JSON.parse(value);
// Переменная для хранения результата
var result = 0;
// Проверяем наличие объекта obj и объекта TrafficReport
if (obj && obj.TrafficReport) {
// Проверяем, является ли Filter массивом или объектом
var filters = Array.isArray(obj.TrafficReport.Filter) ? obj.TrafficReport.Filter : [obj.TrafficReport.Filter];
// Перебираем каждый фильтр в массиве
filters.forEach(function(filter) {
// Если Id текущего фильтра равен "{#TMETERID}"
if (filter.Id === "{#TMETERID}") {
// Проверяем, является ли Day массивом или объектом
if (Array.isArray(filter.Day)) {
// Если Day является массивом, находим последний день и присваиваем его Recv
var lastDay = filter.Day[filter.Day.length - 1];
result = lastDay.Recv || 0;
} else {
// Если Day является объектом, берем значение Recv из объекта
result = filter.Day.Recv || 0;
}
}
});
}
// Возвращаем результат
return result;
Предобработка
Показать
Код: Выделить всё
// Преобразуем JSON в объект JS
var obj = JSON.parse(value);
// Переменная для хранения результата
var result = 0;
// Проверяем наличие объекта value, объекта TrafficReport и свойства Filter
if (obj && obj.TrafficReport && obj.TrafficReport.Filter) {
// Преобразуем Filter в массив, если это не массив
var filters = Array.isArray(obj.TrafficReport.Filter) ? obj.TrafficReport.Filter : [obj.TrafficReport.Filter];
// Перебираем каждый фильтр в массиве
filters.forEach(function(filter) {
// Если Id текущего фильтра равен "{#TMETERID}"
if (filter.Id === "{#TMETERID}") {
// Присваиваем значение Sent переменной result
result = filter.Recv || 0;
}
});
}
// Возвращаем результат
return result;
Предобработка
Показать
Код: Выделить всё
// Преобразуем JSON в объект JS
var obj = JSON.parse(value);
// Переменная для хранения результата
var result = 0;
// Проверяем наличие объекта obj и объекта TrafficReport
if (obj && obj.TrafficReport) {
// Проверяем, является ли Filter массивом или объектом
var filters = Array.isArray(obj.TrafficReport.Filter) ? obj.TrafficReport.Filter : [obj.TrafficReport.Filter];
// Перебираем каждый фильтр в массиве
filters.forEach(function(filter) {
// Если Id текущего фильтра равен "{#TMETERID}"
if (filter.Id === "{#TMETERID}") {
// Проверяем, является ли Day массивом или объектом
if (Array.isArray(filter.Day)) {
// Если Day является массивом, находим последний день и присваиваем его Sent
var lastDay = filter.Day[filter.Day.length - 1];
result = lastDay.Sent || 0;
} else {
// Если Day является объектом, берем значение Sent из объекта
result = filter.Day.Sent || 0;
}
}
});
}
// Возвращаем результат
return result;
Предобработка
Показать
Код: Выделить всё
// Преобразуем JSON в объект JS
var obj = JSON.parse(value);
// Переменная для хранения результата
var result = 0;
// Проверяем наличие объекта value, объекта TrafficReport и свойства Filter
if (obj && obj.TrafficReport && obj.TrafficReport.Filter) {
// Преобразуем Filter в массив, если это не массив
var filters = Array.isArray(obj.TrafficReport.Filter) ? obj.TrafficReport.Filter : [obj.TrafficReport.Filter];
// Перебираем каждый фильтр в массиве
filters.forEach(function(filter) {
// Если Id текущего фильтра равен "{#TMETERID}"
if (filter.Id === "{#TMETERID}") {
// Присваиваем значение Sent переменной result
result = filter.Sent || 0;
}
});
}
// Возвращаем результат
return result;
Прототипы триггеров
Высокая Общее Превышение Квоты Отправки правило: {#TMETERID} {#TMETERNAME} {TrafSvc TMeter:sent.[{#TMETERID}].last()}>={$OTRAFKVOTA} or {TrafSvc TMeter:sent.[{#TMETERID}].nodata(8h)}=1 Нет
Высокая Общее Превышение Квоты Приема правило: {#TMETERID} {#TMETERNAME} {TrafSvc TMeter:recv.[{#TMETERID}].last()}>={$PTRAFKVOTA} or {TrafSvc TMeter:recv.[{#TMETERID}].nodata(8h)}=1 Нет
Высокая Превышение квоты на передачу данных в сутки порт 8080 {#TMETERID} {#TMETERNAME} {TrafSvc TMeter:sent.d.[{#TMETERID}].last()}>={$ODTRAFKVOTA} or {TrafSvc TMeter:sent.d.[{#TMETERID}].nodata(8h)}=1 Да
Высокая Превышение квоты на приема данных в сутки порт 8080 {#TMETERID} {#TMETERNAME} {TrafSvc TMeter:recv.d.[{#TMETERID}].last()}>={$PDTRAFKVOTA} or {TrafSvc TMeter:recv.d.[{#TMETERID}].nodata(8h)}=1 Да
Высокая Проверьте работу TMetr порт 8080 {#TMETERID} {#TMETERNAME} {$WEEK_DAY}<=5 and {$TIME_HH}>=12 and {TrafSvc TMeter:sent.d.[{#TMETERID}].last()}<=500M or {TrafSvc TMeter:sent.d.[{#TMETERID}].nodata(8h)}=1 Да
Прототипы графиков
За сутки Трафик для правила: {#TMETERID} {#TMETERNAME} 900 200 Нормальный
Общее Трафик для правила: {#TMETERID} {#TMETERNAME} 900 200 Нормальный