Uma das tarefas mais importantes no design de sistemas é a organização do monitoramento do status de todos os nós, incluindo um grande número de serviços. Em condições em que forças e fundos adicionais não são alocados para isso, é necessário usar soluções prontas ao máximo.
Eu acho que para muitas pessoas a imagem no projeto é algo como isto:

Algo está sendo enviado para algum lugar, de alguma forma processado e mantido em uma unha. A tarefa era coletar estatísticas de processamento de dados de todos os pontos e colocá-las em um só lugar, depois construir gráficos e escrever relatórios.
Graças ao artigo, a escolha recaiu sobre um monte de Telegraf-Elasticsearch-Grafana. O Telegraf se encaixou perfeitamente no projeto de organização do monitoramento do estado dos softwares de ferro e de terceiros disponíveis publicamente, mas discutirei separadamente a questão de medir a carga em meus próprios serviços. Nesse caso, estamos falando de serviços .NET em execução em contêineres de docker no Linux. Todos os serviços formam vários estágios de processamento de informações recebidas, e eu precisava medir o número de pacotes processados e rejeitados com sucesso com rótulos adicionais para o estágio de processamento, origem, etc., para a possibilidade de processamento estatístico subsequente.
Omitirei o processo de instalação e prosseguirei imediatamente para a configuração. Assim, o Telegraf pode receber mensagens com métricas nos canais tcp, udp e também através do 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"]
Os serviços enviarão mensagens sempre que o próximo pacote for processado, portanto, configuraremos adicionalmente a agregação. Um intervalo de 10 segundos é suficiente, dependendo da carga de um sistema específico.
[[aggregators.basicstats]] period = "10s" drop_original = true stats = ["sum"] namepass = ["query_pass"] fieldpass = ["pass","fail"]
Vamos analisar os parâmetros: query_pass - o nome da métrica que combina medições futuras, aprovação - processamento bem-sucedido, falha - não. Além disso, as métricas serão marcadas com as tags appname e fromip .
Agora um pequeno código. Gosto de enviar métricas via udp e unixsocket, embora outras opções possam funcionar para você.
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);
Tudo isso é perfeitamente resumido e adicionado ao banco de dados; no meu caso, é elasticsearch ( captura de tela ).
[[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 os gatos
PS: aqui está o projeto final para o envio de métricas sob net.core