L'une des tâches les plus importantes dans la conception de systèmes est l'organisation de la surveillance de l'état de tous les nœuds, y compris un grand nombre de services. Dans des conditions où des forces et des fonds supplémentaires ne sont pas affectés à cela, il est nécessaire d'utiliser au maximum des solutions toutes faites.
Je pense que pour beaucoup de gens, l'image du projet est à ce sujet:

Quelque chose est envoyé quelque part, d'une manière ou d'une autre traité et maintenu sur un clou. La tâche consistait à collecter les statistiques de traitement des données de tous les points et à les mettre au même endroit, puis à créer des graphiques et à rédiger des rapports.
Grâce à l' article, le choix s'est porté sur un tas de Telegraf-Elasticsearch-Grafana. Telegraf s'intègre parfaitement dans le projet d'organisation de la surveillance de l'état du fer et des logiciels tiers accessibles au public, mais je discuterai séparément de la question de la mesure de la charge sur mes propres services. Dans ce cas, nous parlons de services .NET fonctionnant dans des conteneurs Docker sous Linux. Tous les services forment plusieurs étapes du traitement des informations entrantes, et j'avais besoin de mesurer le nombre de paquets traités et rejetés avec succès avec des étiquettes supplémentaires pour l'étape de traitement, la source, etc. pour la possibilité d'un traitement statistique ultérieur.
Je vais omettre le processus d'installation et procéder immédiatement à la configuration. Ainsi, Telegraf peut recevoir des messages avec des mesures sur les canaux TCP, UDP, ainsi que via 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"]
Les services enverront des messages chaque fois que le prochain paquet est traité, nous allons donc configurer en plus l'agrégation. Un intervalle de 10 secondes suffit, selon la charge d'un système particulier.
[[aggregators.basicstats]] period = "10s" drop_original = true stats = ["sum"] namepass = ["query_pass"] fieldpass = ["pass","fail"]
Passons en revue les paramètres: query_pass - le nom de la métrique qui combine les mesures futures, réussite - traitement réussi, échec - non. De plus, les métriques seront étiquetées avec les balises appname et fromip .
Maintenant un petit code. J'aime envoyer des métriques via udp et unixsocket, bien que d'autres options puissent fonctionner pour vous.
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);
Tout cela est parfaitement résumé et ajouté à la base de données, dans mon cas c'est elasticsearch ( capture d'écran ).
[[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
Tous les chats.
PS: voici le projet final d'envoi de métriques sous net.core