Добрый день,
ниже небольшой пример как можно реализовать функционал zabbix_sender на .Net.
Утилита Zabbix_sender позволяет извещать Zabbix о событии сразу же как только оно произошло.
Для начала нужно создать item c типом "Zabbix trapper".
После этого можно обновлять значения item с помощью вызова утилиты*:
Аналогичные результат можно получить с помощью следующего кода на .Net
Код метода получающего информацию из сокета
Формирование заголовка TCP сообщения описано в документации "Zabbix Protocols".
Данные передаются в виде json (нужный формат получен с помощью снифера).
При чтении ответа Zabbix используются те же правила что и при отправке:
первые 5 байт -- заголовок, должен быть равен "ZBXD\x01"
потом 8 байт -- длинна сообщения
и потом само сообщение в формате JSON.
----
* Zabbix_sender для Windows (за наводку спасибо dima_dm)
ниже небольшой пример как можно реализовать функционал zabbix_sender на .Net.
Утилита Zabbix_sender позволяет извещать Zabbix о событии сразу же как только оно произошло.
Для начала нужно создать item c типом "Zabbix trapper".
После этого можно обновлять значения item с помощью вызова утилиты*:
Code:
zabbix_sender -z ***.***.***.*** -p 10051 -s myHost -k myItem -o itemValue
Аналогичные результат можно получить с помощью следующего кода на .Net
Code:
string zabbixIp = "***.***.***.***";
int zabbixPort = 10051;
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(
new
{
request = "sender data",
data = new[]
{
new
{
host = "myHost",
key = "myItem",
value = "1"
}
}
});
byte[] header = Encoding.ASCII.GetBytes("ZBXD\x01");
byte[] length = BitConverter.GetBytes((long)json.Length);
byte[] data = Encoding.ASCII.GetBytes(json);
byte[] all = new byte[header.Length + length.Length + data.Length];
System.Buffer.BlockCopy(header, 0, all, 0, header.Length);
System.Buffer.BlockCopy(length, 0, all, header.Length, length.Length);
System.Buffer.BlockCopy(data, 0, all, header.Length + length.Length,
data.Length);
using (var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp))
{
client.Connect(zabbixIp, zabbixPort);
client.Send(all);
// Заголовок
byte[] buffer = new byte[5];
_Receive(client, buffer, 0, buffer.Length, 10000);
if ("ZBXD\x01" != Encoding.ASCII.GetString(buffer, 0, buffer.Length))
throw new Exception("Invalid response");
// Длинна сообщения
buffer = new byte[8];
_Receive(client, buffer, 0, buffer.Length, 10000);
int dataLength = BitConverter.ToInt32(buffer, 0);
if (dataLength == 0)
throw new Exception("Invalid response");
// Сообщение
buffer = new byte[dataLength];
_Receive(client, buffer, 0, buffer.Length, 10000);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, buffer.Length));
}
Code:
private static void _Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
{
int startTickCount = Environment.TickCount;
int received = 0;
do
{
if (Environment.TickCount > startTickCount + timeout)
throw new Exception("Timeout.");
try
{
received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.WouldBlock ||
ex.SocketErrorCode == SocketError.IOPending ||
ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
{
// socket buffer is probably empty, wait and try again
Thread.Sleep(30);
}
else
throw ex; // any serious error occurr
}
} while (received < size);
}
Данные передаются в виде json (нужный формат получен с помощью снифера).
При чтении ответа Zabbix используются те же правила что и при отправке:
первые 5 байт -- заголовок, должен быть равен "ZBXD\x01"
потом 8 байт -- длинна сообщения
и потом само сообщение в формате JSON.
----
* Zabbix_sender для Windows (за наводку спасибо dima_dm)
Comment