Мониторинг использования полосы пропускания на интерфейсе

Примечание Данный пример приводится в целях иллюстрации, он не поддерживается. Техническая поддержка доступна для контекстного объекта, SNMP API и среды сценариев, но Ipswitch не предоставляет поддержку по JScript, VBScript или разработке и отладке мониторов и действий активного сценария. Для помощи по этому примеру или по написанию собственных сценариев, посетите сообщество пользователей WhatsUp Gold.

Активный монитор используется для мониторинга общего использования полосы пропускания (входящих и исходящих октетов) на интерфейсе путем опрашивания значений MIB интерфейса.

// Параметры для этого монитора:
// индекс интерфейса ifIndex:
var nInterfaceIndex = 65540;

// на этом мониторе возникнет ошибка, если использование интерфейса превысит этот текущий коэффициент:
// текущая пропускная способность / макс. пропускная способность > nMaxInterfaceUtilizationRatio
var nMaxInterfaceUtilizationRatio = 0.7; // Set to 70%

// Создать объект SNMP, опрашивающий устройство.
var oSnmpRqst = new ActiveXObject("CoreAsp.SnmpRqst");

// Получить ID устройства
var nDeviceID = Context.GetProperty("DeviceID");

// Эта функция опрашивает возвращенные устройством значения с индексом ifSpeed интерфейса, заданным в nIfIndex.
// ifSpeed отображается в битах в секунду.
function getIfSpeed(nIfIndex) {
var oResult = oSnmpRqst.Initialize(nDeviceID);
if (oResult.Failed) {
return null;
}
return parseInt(SnmpGet("1.3.6.1.2.1.2.2.1.5." + nIfIndex)); // ifSpeed
}
// Функция получения на SNMP ifInOctets для интерфейса, проиндексированного в nIfIndex (в байтах).
// Возвращает значение, опрошенное при успешном выполнении, нуль в случае ошибки.
function getInOctets(nIfIndex) {
var oResult = oSnmpRqst.Initialize(nDeviceID);
if (oResult.Failed) {
return null;
}
return parseInt(SnmpGet("1.3.6.1.2.1.2.2.1.10." + nIfIndex)); // inOctets
}

// Функция получения на SNMP ifOutOctets для интерфейса, проиндексированного в nIfIndex (в байтах).
// Возвращает значение, опрошенное при успешном выполнении, нуль в случае ошибки.
function getOutOctets(nIfIndex) {
var oResult = oSnmpRqst.Initialize(nDeviceID);
if (oResult.Failed) {
return null;
}
return parseInt(SnmpGet("1.3.6.1.2.1.2.2.1.16." + nIfIndex)); // outOctets
}

// Вспомогательная функция получения определенного объекта SNMP (OID — sOid).
// Возвращает значение, опрошенное при успешном выполнении, нуль в случае ошибки.
function SnmpGet(sOid) {
var oResult = oSnmpRqst.Get(sOid);
if (oResult.Failed) {
return null;
}
else {
return oResult.GetPayload;
}
}

// Получить текущую дату. Эта дата будет использоваться в качестве базовой для опросов SNMP.
var oDate = new Date();
var nPollDate = parseInt(oDate.getTime()); // получить дату в мс в виде целого числа.
// Выполнить актуальный опрос:
var nInOctets = getInOctets(nInterfaceIndex);
var nOutOctets = getOutOctets(nInterfaceIndex);
var nIfSpeed = getIfSpeed(nInterfaceIndex);
if (nInOctets == null || nOutOctets == null || nIfSpeed == null) {
Context.SetResult(1, "Ошибка опроса этого устройства.");
}
else {
var nTotalOctets = nInOctets + nOutOctets;
// Извлечь значение октетов и дату последнего опроса, сохраненные в контекстной переменной:
var nInOutOctetsMonitorPreviousPolledValue = Context.GetProperty("nInOutOctetsMonitorPreviousPolledValue");
var nInOutOctetsMonitorPreviousPollDate = Context.GetProperty("nInOutOctetsMonitorPreviousPollDate");
if (nInOutOctetsMonitorPreviousPolledValue == null || nInOutOctetsMonitorPreviousPollDate == null) {
// контекстная переменная не задана, это первый опрос.
Context.LogMessage("Для этого монитора требуется два опроса.");
Context.SetResult(0, "success");
}
else {
// рассчитать использование полосы пропускания между этим опросом и предыдущим
var nIntervalSec = (nPollDate - nInOutOctetsMonitorPreviousPollDate) / 1000; // время, прошедшее после последнего опроса, в секундах
var nCurrentBps = (nTotalOctets - nInOutOctetsMonitorPreviousPolledValue) * 8 / nIntervalSec;
Context.LogMessage("всего октетов для интерфейса " + nInterfaceIndex + " = " + nTotalOctets);
Context.LogMessage("предыдущее значение = " + nInOutOctetsMonitorPreviousPolledValue);
Context.LogMessage("разница: " + (nTotalOctets - nInOutOctetsMonitorPreviousPolledValue) + " байт");
Context.LogMessage("Скорость интерфейса: " + nIfSpeed + "bps");
Context.LogMessage("время, прошедшее после последнего опроса: " + nIntervalSec + "s");
Context.LogMessage("Текущее использование полосы пропускания: " + nCurrentBps + "bps");
if (nCurrentBps / nIfSpeed > nMaxInterfaceUtilizationRatio) {
Context.SetResult(1, "Ошибка: используемая пропускная способность на этом интерфейсе " + nCurrentBps + "б/с / всего доступно: " + nIfSpeed + "б/с выше заданного коэффициента: " + nMaxInterfaceUtilizationRatio);
}
else {
Context.SetResult(0, "Success");
}
}
// Сохранить эти данные опроса в контекстных переменных:
Context.PutProperty("nInOutOctetsMonitorPreviousPolledValue", nTotalOctets);
Context.PutProperty("nInOutOctetsMonitorPreviousPollDate", nPollDate);
}

См. также

Пример активных мониторов активного сценария

Отслеживание уровня чернил принтера и его использования

Оповещение при выходе температуры за диапазон

Определение недопустимых действий учетной записи пользователя

Мониторинг агента SNMP, работающего на нестандартном порте

Мониторинг неизвестных MAC-адресов