Sammeln Sie mithilfe von Telegraf Metriken aus .NET-Anwendungen

Eine der wichtigsten Aufgaben beim Entwurf von Systemen ist die Organisation der Überwachung des Status aller Knoten, einschließlich einer großen Anzahl von Diensten. Unter Bedingungen, in denen keine zusätzlichen Kräfte und Mittel dafür bereitgestellt werden, ist es notwendig, vorgefertigte Lösungen maximal zu verwenden.


Ich denke, dass für viele Menschen das Bild im Projekt davon handelt:


Bild


Irgendetwas wird irgendwohin geschickt, irgendwie verarbeitet und an einem Nagel festgehalten. Die Aufgabe bestand darin, Datenverarbeitungsstatistiken von allen Punkten zu sammeln und an einem Ort abzulegen, dann Diagramme zu erstellen und Berichte zu schreiben.


Dank des Artikels fiel die Wahl auf eine Reihe von Telegraf-Elasticsearch-Grafana. Telegraf passt perfekt in das Projekt zur Organisation der Überwachung des Zustands von Eisen und öffentlich verfügbarer Software von Drittanbietern, aber ich werde das Problem der Messung der Belastung meiner eigenen Dienste separat erörtern. In diesem Fall handelt es sich um .NET-Dienste, die in Docker-Containern unter Linux ausgeführt werden. Alle Dienste bilden mehrere Stufen der Verarbeitung eingehender Informationen, und ich musste die Anzahl der erfolgreich verarbeiteten und zurückgewiesenen Pakete mit zusätzlichen Etiketten für die Verarbeitungsstufe, die Quelle usw. messen, um eine spätere statistische Verarbeitung zu ermöglichen.


Ich werde den Installationsvorgang unterlassen und sofort mit der Konfiguration fortfahren. So kann Telegraf Nachrichten mit Metriken auf TCP-, UDP-Kanälen sowie über Unixsocket empfangen:


[[inputs.socket_listener]] #service_address = "unixgram:///tmp/telegraf.sock" service_address = "udp4://:14230" data_format = "json" json_name_key = "name" namepass = ["query_pass"] tag_keys = ["appname","fromip"] 

Die Dienste senden jedes Mal Nachrichten, wenn das nächste Paket verarbeitet wird. Daher konfigurieren wir zusätzlich die Aggregation. Ein Intervall von 10 Sekunden reicht je nach Auslastung eines bestimmten Systems völlig aus.


 [[aggregators.basicstats]] period = "10s" drop_original = true stats = ["sum"] namepass = ["query_pass"] fieldpass = ["pass","fail"] 

Lassen Sie uns die Parameter durchgehen : query_pass - der Name der Metrik, die zukünftige Messungen kombiniert, bestanden - erfolgreiche Verarbeitung, fehlgeschlagen - nein. Darüber hinaus werden Metriken mit Appname- und Fromip-Tags versehen .


Nun ein kleiner Code. Ich sende gerne Metriken über udp und unixsocket, obwohl andere Optionen für Sie möglicherweise funktionieren.


 UdpClient udpClient = new UdpClient("127.0.0.1", 14230); byte[] datagramBytes= Encoding.UTF8.GetBytes("{\"name\":\"query_pass\",\"pass\":1,\"fromip\":\"127.0.0.1\",\"appname\":\"application\"}"); udpClient.Send(datagramBytes, datagramBytes.Length); datagramBytes= Encoding.UTF8.GetBytes("{\"name\":\"query_pass\",\"fail\":1,\"fromip\":\"127.0.0.1\",\"appname\":\"application\"}"); udpClient.Send(datagramBytes, datagramBytes.Length); 

All dies ist perfekt zusammengefasst und der Datenbank hinzugefügt, in meinem Fall ist es Elasticsearch ( Screenshot ).


 [[outputs.elasticsearch]] urls = [ "http://localhost:9200" ] # required. timeout = "5s" health_check_interval = "5s" index_name = "telegraf-%Y.%m.%d" # required. manage_template = true template_name = "tp_telegraf" overwrite_template = true 

Alle Katzen.


PS: Hier ist das endgültige Projekt zum Senden von Metriken unter net.core

Source: https://habr.com/ru/post/de458310/


All Articles