Recopile métricas de aplicaciones .NET usando Telegraf

Una de las tareas más importantes en el diseño de sistemas es la organización del monitoreo del estado de todos los nodos, incluida una gran cantidad de servicios. En condiciones en las que no se asignan fuerzas y fondos adicionales para esto, es necesario utilizar soluciones preparadas al máximo.


Creo que para muchas personas la imagen en el proyecto es algo como esto:


imagen


Algo está siendo enviado a alguna parte, de alguna manera procesado y retenido en un clavo. La tarea consistía en recopilar estadísticas de procesamiento de datos de todos los puntos y colocarlas en un solo lugar, luego construir gráficos y escribir informes.


Gracias al artículo, la elección recayó en un grupo de Telegraf-Elasticsearch-Grafana. Telegraf encaja perfectamente en el proyecto para organizar el monitoreo del estado del software de terceros tanto disponible como público, pero analizaré por separado el tema de medir la carga en mis propios servicios. En este caso, estamos hablando de servicios .NET que se ejecutan en contenedores docker en Linux. Todos los servicios forman varias etapas de procesamiento de información entrante, y necesitaba medir el número de paquetes procesados ​​y rechazados con éxito con etiquetas adicionales para la etapa de procesamiento, fuente, etc. para la posibilidad de procesamiento estadístico posterior.


Omitiré el proceso de instalación y procederé inmediatamente a la configuración. Entonces, Telegraf puede recibir mensajes con métricas en tcp, canales udp, así como a través de unixsocket:


[[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"] 

Los servicios enviarán mensajes cada vez que se procese el siguiente paquete, por lo que configuraremos aún más la agregación. Un intervalo de 10 segundos es suficiente, dependiendo de la carga de un sistema en particular.


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

Repasemos los parámetros: query_pass : el nombre de la métrica que combina mediciones futuras, pasa - procesamiento exitoso, falla - no. Además, las métricas se etiquetarán con el nombre de la aplicación y las etiquetas fromip .


Ahora un pequeño código. Me gusta enviar métricas a través de udp y unixsocket, aunque otras opciones podrían funcionar para usted.


 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); 

Todo esto se resume perfectamente y se agrega a la base de datos, en mi caso es elasticsearch ( captura de pantalla ).


 [[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 

Todos los gatos


PD: aquí está el proyecto final para enviar métricas en net.core

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


All Articles