zabbix_sender .Net (готовый пример на C#)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

    zabbix_sender .Net (готовый пример на C#)

    Добрый день,
    ниже небольшой пример как можно реализовать функционал 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);
    }
    Формирование заголовка TCP сообщения описано в документации "Zabbix Protocols".
    Данные передаются в виде json (нужный формат получен с помощью снифера).

    При чтении ответа Zabbix используются те же правила что и при отправке:
    первые 5 байт -- заголовок, должен быть равен "ZBXD\x01"
    потом 8 байт -- длинна сообщения
    и потом само сообщение в формате JSON.


    ----
    * Zabbix_sender для Windows (за наводку спасибо dima_dm)
    Last edited by AlexB; 23-11-2010, 09:33.

    #2
    Можете добавить свой пример вот сюда
    Заодно найдете себе там кое что интересное

    Comment


      #3
      There's a version of this in VB.net (and English) at https://www.zabbix.com/forum/showthread.php?p=156720 ... it's part of an app to send windows update information to a Zabbix trap but the code dealing with Windows Updates could easily be removed and then this code could be used to send anything.

      Comment


        #4
        I've written another C# implementation which supports async/await - https://github.com/stop-cran/ZabbixSender.Async
        Also available in Nuget - https://www.nuget.org/packages/ZabbixSender.Async

        Comment

        Announcement

        Collapse
        No announcement yet.
        Working...
        X