使用Telegraf从.NET应用程序收集指标

系统设计中最重要的任务之一是组织监视所有节点(包括大量服务)的状态。 在没有为此分配额外力量和资金的情况下,有必要最大程度地使用现成的解决方案。


我认为对于许多人来说,项目中的图片是这样的:


图片


东西被送到某个地方,以某种方式处理并固定在一个钉子上。 任务是收集所有点的数据处理统计数据并将它们放在一个位置,然后构建图形并编写报告。


多亏了这篇文章,选择才落在了Telegraf-Elasticsearch-Grafana上。 Telegraf非常适合该项目,用于组织对铁和公共可用的第三方软件的状态进行监视,但是我将分别讨论测量我自己的服务负载的问题。 在这种情况下,我们正在谈论在Linux下在Docker容器中运行的.NET服务。 所有服务都构成了处理传入信息的几个阶段,我需要使用处理阶段,源等的附加标签来衡量成功处理和拒绝的数据包的数量,以便进行后续统计处理。


我将省略安装过程,并立即进行配置。 因此,Telegraf可以通过tcp,udp通道以及通过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"] 

服务将在每次处理下一个数据包时发送消息,因此我们将另外配置聚合。 10秒的间隔就足够了,具体取决于特定系统的负载。


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

让我们看一下参数: query_pass-结合将来测量的度量的名称, pass-成功处理, fail-否。 此外,指标还将使用appnamefromip标签进行标记


现在一点代码。 我喜欢通过udp和unixsocket发送指标,尽管其他选项可能对您有用。


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

所有这些都被完美地总结并添加到数据库中,在我的例子中,它是elasticsearch( 屏幕截图 )。


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

所有的猫。


PS:这是在net.core下发送指标的最终项目

Source: https://habr.com/ru/post/zh-CN458310/


All Articles