背景介绍

希望能够对业务指标监控,通过业务指标监控反应业务系统的稳定性,原因是通过对基础资源,应用服务状态,性能监控,不能够反应业务系统的稳定性,举个栗子:服务程序一切正常,下单接口因参数校验,导致很多下单不成功,状态码正常返回,对于服务端来说一切正常,但是从业务角度,已经出问题了,可能是传参或某个环节导致的,这种问题就没有办法通过常规手段进行监控,不管是那个环节出问题,对我们的业务都是有影响的。

例如:单位时间段内的下单数、成单数,基于同环比进行监控和预警,先于用户发现问题并止损。

利用Grafana漂亮UI对业务监控,资源监控,绘制个性化大盘,基于Statsd+Graphite+Grafana 实现自定义监控指标Metirc

工具介绍

  • Statsd 是一个使用Node开发网络守护进程,它的特点是通过UDP(性能好,及时挂了也不影响主服务)或者TCP来监听各种数据信息,然后发送聚合数据到后端服务进行处理。常见支持的「Graphite」, 「ElasticaSearch」,「InfluxDB」 等等 ,它故宫了各种语言的客户端API,这里我们使用了jsocol/pystatsd: A Python client for statsd进行数据收集
  • Graphite 是一套Python写的开源编程接口,主要是用来收集服务器的及时状态,在这里主要作为statsd的数据后端。分为了三个子项目
    • carbon 守护进程,接收StatsD发送过来的原始统计数据。
    • whisper 用来存储统计数据的时间序列数据库。
    • graphite webapp 用来图形化展示统计数据的web项目。
  • Grafana 使用Go开发,可以在界面上设计调整自己的统计图表,支持多重报警,可定制化。

利用镜像安装Graphite&Statsd

docker run -d\--name graphite\--restart=always\-p 80:80\-p 2003-2004:2003-2004\-p 2023-2024:2023-2024\-p 8125:8125/udp\-p 8126:8126\graphiteapp/graphite-statsd

Includes the following components

  • Nginx - reverse proxies the graphite dashboard
  • Graphite - front-end dashboard
  • Carbon - back-end
  • Statsd - UDP based back-end proxy

Mapped Ports

Host Container Service
80 80 nginx
2003 2003 carbon receiver - plaintext
2004 2004 carbon receiver - pickle
2023 2023 carbon aggregator - plaintext
2024 2024 carbon aggregator - pickle
8080 8080 Graphite internal gunicorn port (without Nginx proxying).
8125 8125 statsd
8126 8126 statsd admin

发送指标数据

while true; do echo -n "example:$((RANDOM % 100))|c" | nc -w 1 -u 127.0.0.1 8125; done

UDP发送

Message格式:

example:1|c

当然还支持更多格式了,例如:counter、timer、gauge和set

Java简单UDP投送实例:

public static void send(String message) {LogUtil.getInstance().info("UDPClient send:" + message);byte[] data = message.getBytes();DatagramSocket client =null;try{//3.打包(发送的地点及端口)//1.创建客户端+端口client = new DatagramSocket(5555);//3.打包(发送的地点及端口)DatagramPacket packet = new DatagramPacket(data, data.length,new InetSocketAddress("127.0.0.1",8125));//4.发送client.send(packet);}catch (Exception e){LogUtil.getInstance().error(e,"UDPClient send:" + message);}finally {if(client==null){//5.释放client.close();}}}

使用架构模式

异步直连式

说明:应用程序中、植入全局异步投送监控指标Metirc的异步线程或协程,每次使用异步调用异步线程进行投送即可,每个应用程序都需要建议UDP连接。

好处:简单,直接、复杂低

缺点:占用应用性能、对应用侵入性比较大

注意:因异步投送,故需要控制线程池控制异步线程数量,防止对业务产生比较大的影响。

应用场景:中小型项目,对性能和稳定性要求不高。

集中式消费

说明:应用程序中,约定Metirc指标数据格式,借助kafka,投送到kafka,中间加一层集中式消费kafka,然后到stats集群中

好处:应用程序和Stats是解耦的,提升应用程序的稳定性和性能。

缺点:复杂度较高。

注意:因异步投送,故需要控制线程池控制异步线程数量,防止对业务产生比较大的影响。

应用场景:较大型项目,对性能和稳定性有一定的要求。

可插拔Backends:

StatsD支持可插拔backends,安装包中默认带有graphite后端。可以将其他后端作为简单的npm软件包进行分发和安装:

  • amqp-backend
  • ganglia-backend
  • librato-backend
  • socket.io-backend
  • statsd-backend
  • mongo-backend
  • mysql-backend
  • datadog-backend
  • monitis backend
  • instrumental backend
  • hosted graphite backend
  • statsd aggregation backend
  • zabbix-backend
  • opentsdb backend
  • influxdb backend
  • stackdriver backend
  • couchdb-backend
  • elasticsearch backend
  • Google BigQuery backend

2、服务端实现:

StatsD最初由Etsy的Erik Kastner编写,它基于Flickr的想法以及Cal Henderson的这篇文章:Counting and Timing。2011年该服务器用Nodejs编写重写,但是从那时起已经有其他语言的实现:

  • brubeck - Server in C
  • clj-statsd-svr — Clojure server
  • gographite — Server in Go
  • gostatsd — Server in Go
  • netdata - Embedded statsd server in the netdata server, in C, with visualization
  • Net::Statsd::Server — Perl server, also available on CPAN
  • Py-Statsd — Server and Client
  • Ruby-Statsdserver — Ruby server
  • statsd-c — Server in C
  • statsdaemon (bitly) — Server in Go
  • statsdaemon (vimeo) — Server in Go
  • statsdcc - Server in C++
  • statsdpy — Python/eventlet Server
  • Statsify - Server in C#
  • statsite — Server in C
  • bioyino — High performance multithreaded server written in Rust

3、客户端实现:

客户端主要是根据statsd协议,通过UDP/TCP向守护进程通信。常见的实现有:

Node

  • lynx — Node.js client used by Mozilla, Nodejitsu, etc.
  • Node-Statsd — Node.js client
  • node-statsd-client — Node.js client
  • node-statsd-instrument — Node.js client
  • statistik - Node.js client with timers & CLI
  • statsy - clean idiomatic statsd client

Java

  • java-statsd-client — Lightweight (zero deps) Java client
  • Statsd over SLF4J — Java client with SLF4J logging tie-in
  • play-statsd — Play Framework 2.0 client for Java and Scala
  • statsd-netty — Netty-based Java 8 client

Python

  • Py-Statsd — Server and Client
  • Python-Statsd — Python client
  • pystatsd — Python client
  • Django-Statsd — Django client

Ruby

  • statsd-instrument — Ruby client
  • statsd — Ruby client (needs new maintainer)
  • Statsd-Client — Ruby client (not maintained)

Perl

  • Net::Statsd — Perl client, also available on CPAN
  • Net::StatsD::Client — Perl client, not available on CPAN
  • Etsy::StatsD - Perl client, also available on [CPAN] (https://metacpan.org/module/Etsy::StatsD)

PHP

  • Metrics
  • PHP client
  • php-statsd and Spark
  • php-statsd-client - supports SplClassLoader
  • statsd-php-client - Minimalist performant client
  • phpLeague-statsd-client - Php League StatsD client
  • statsd-php-client - optimized client with monolog and symfony2 integrations available
  • statsd-php - PSR-4 compatible client

Clojure

  • Clojure client

Io

  • io-statsd — StatsD Client for Io

C

  • C client — A trivial C client

CPP

  • statsd-client-cpp — StatsD Client in CPP
  • cpp-statsd-client — A header-only StatsD client implemented in C++

.NET

  • NStatsD.Client — .NET 4.0 client
  • C# client — C# client
  • graphite-client — .NET client library for StatsD and Graphite
  • StatsC — An asynchronous client with built-in support for batching
  • JustEat.StatsD — A .NET library for publishing metrics to statsd. Targets both .NET full framework and .NET Standard 2.0.
  • Statsify - .NET client

Go

  • go-statsd - Go statsd client library with zero allocation overhead, great performance and reconnects
  • GoE — Minimal & Performant
  • go-statsd-client — Simple Go client
  • g2s
  • StatsD
  • statsd — A simple and very fast StatsD client

Apache

  • mod_statsd - StatsD client to send stats straight from Apache

Varnish

  • libvmod-statsd - StatsD client to send stats straight from Varnish

PowerShell

  • powershell-statsd - PowerShell client

Browser

  • StatsC - Push stats to StatsD from the browser!
  • StatsD HTTP Proxy - HTTP proxy to StatsD with REST interface for using in browsers
  • StatsD HTTP Client - StatsD client over http for using in browsers

Objective-C

  • MCStatsd - Cocoa client

ActionScript

  • flash-statsd - Flash client

WordPress

  • wordpress-statsd - WordPress Plugin

Drupal

  • StatsD - Drupal module

Haskell

  • statsd-client

R

  • rstatsd

Lua

  • lua-statsd

Nim

  • statsd_client
  • nim-metrics - supports StatsD, Carbon and Prometheus

参考:

https://github.com/statsd/statsd/wiki

https://hub.docker.com/r/graphiteapp/graphite-statsd

业务监控系统如何做,一起来看看如何使用Statsd+Graphite+Grafana搭建业务监控系统相关推荐

  1. 技术实践丨Prometheus+Grafana搭建HBase监控仪表盘

    摘要:Grafana+Prometheus是目前非常流行的监控方案,图形化展示非常强大. 本文分享自华为云社区<Prometheus+Grafana搭建HBase监控仪表盘>,原文作者:L ...

  2. Telegraf+InfluxDB+Grafana搭建服务器监控平台

    Telegraf+InfluxDB+Grafana搭建服务器监控平台 tags:网站 个人网站:https://wanghualong.cn/ 效果展示 本站服务器状态监控:https://statu ...

  3. 使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)

    文章来源:zhuanlan.zhihu.com/p/26981364?- 上一篇主要讲了 StatsD + InfluxDB + Grafana 的搭建并用 Grafana 创建了两种图表(Graph ...

  4. 技术分享 | 使用 Zabbix + Grafana 搭建服务器监控系统

    搭建 Linux 服务器监控的目的是防止以下现象:自己有一台阿里云服务器内存是 2g 的 , 多开一些软件就会把内存和 CPU 使用率弄的很高,最终导致服务器卡死. 所以基于这个痛点,想知道当前的 C ...

  5. CentOS7下Telegraf+InfluxDB+Grafana 搭建服务器监控平台

    转载来源 : 作者:DevOps海洋的渔夫 链接:https://www.jianshu.com/p/0a8192751dce 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. 基于Grafana的Web监控报警

    点击蓝色字关注我! 我曾经在7月份给公司研发团队分享过「web性能监控介绍及应用」.这里面我们阐述了这样几个话题: 为什么做监控 其中,「从零搭建一个web监控系统」这一小节里面,我主要使用了Stat ...

  7. 服务端监控要怎么做?

    文章出自:阿里巴巴十亿级并发系统设计(2021版) 链接:https://pan.baidu.com/s/1lbqQhDWjdZe1CBU-6U4jhA 提取码:8888 目录 监控指标如何选择 如何 ...

  8. 转载:做了5年运维,靠着这份监控知识体系,我从3K变成了40K

    从来没讲过运维,因为我觉得运维这种东西不需要太多的知识面,然后我一个做了运维朋友告诉我大错特错,他就是从3K的运维一步步到40K的,甚至笑着说:我现在感觉自己什么都能做. 既然讲,就讲最重要的吧. 监 ...

  9. 做了 5 年运维,靠着这份监控知识体系,我从 3K 变成了40K | 原力计划

    作者 | CSDN博主 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 从来没讲过运维,因为我觉得运维这种东西不需要太多的知识面,然后我一个做了运维朋友告诉我大错特错,他就是从3K的运维 ...

最新文章

  1. lightgbm保存模型参数
  2. 使用元组输入进行计算和归约
  3. 数据在java中加时间,如何在Or.jFr.DATA时间中设置RealTimeMead时期的Java数据
  4. 【floyd存字典序路径】【HDU1385】【Minimum Transport Cost】
  5. 怎么把excel文件转成dta_Word怎么转成PDF文件?首选就是这个转换方法!
  6. mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了
  7. template 模板是怎样通过 Compile 编译的
  8. iphone openssh
  9. C语言课后习题(32)
  10. matplotlib调整子图尺寸,消除大图白边框
  11. ubuntu20 卸载显卡驱动失败_Ubuntu20.04显卡驱动安装
  12. 十万火急的数据采集项目,爬虫代理测试对比
  13. VBA--类模块学习
  14. 腾讯云副总裁王龙:云+AI是产业升级的最佳搭档
  15. C++20协程初探!
  16. 刘昊威新作—东田造型三里屯VILLAGE概念店
  17. OpenGL实验2.3 三维模型的平移、缩放和旋转
  18. 微信jssdk录音功能开发记录
  19. 规格模式 Specification Pattern
  20. java开发抖音短视频无水印下载工具

热门文章

  1. 生活:小孩的世界很简单
  2. 2017.9.26 货币兑换 失败总结
  3. 2017.3.5 yveh测试
  4. 组件启动顺序_风扇组件的检测代换
  5. 【英语学习】【医学】有机化学 - 烷的命名
  6. Android Navigation 组件(基础篇)
  7. struts2漏洞_Apache Struts2057远程代码执行漏洞复现
  8. python定时杀进程
  9. 判断用户 小程序_【重要声明】小程序维护中,iphone用户手机暂时用不了小程序...
  10. Ubuntu 16.04安装MySQL(5.7.18)