最近一直在思考如何对线上服务做深度监控。基础的服务可用性监控很简单,定期Ping即可。但是怎样才能监控服务器的一些更加关键的数据呢?比如,每一个API Point的请求次数(QPS),最大响应时间,平均响应时间等。最终我希望实现的效果是有一个Dashboard,我可以清楚地看到各种参数曲线,对服务器的运行情况了然于胸。

绘制Dashboard不难,目前提供数据可视化的工具很多,随便选一个都能满足需要。关键问题是,怎样将整个流程打通?

服务器该以怎样的形式暴露出数据?

数据怎样被收集和存储起来?

存储起来的数据怎样提供给数据可视化工具?

怎样做到足够灵活,可以可视化自己感兴趣的任意数据?

Prometheus

像QPS和响应时间这些数据,外部工具是没办法直接拿到的,必须要服务器以某种方式将数据暴露出来。最常见的做法是写日志。比如Nginx,每一条请求对应一个日志,日志中有响应时间这个字段。通过对日志分析,我们就可以得到QPS,最大响应时间,平均响应时间等,再通过可视化工具即可绘制我们想要的Dashboard。

日志这个方法固然是可行的,但是还有更好的方法。这个方法就是时序数据库(Time Series Database)。时序数据库简单来说就是存储随时间变化的数据的数据库。什么是随时间变化的数据呢?举个简单的例子,比如,CPU使用率,典型的随时间变化的量,这一秒是50%,下一秒也许就是80%了。或者是温度,今天是20度,明天可能就是18度了。

Prometheus就是一个用Go编写的时序数据库,官网对其的优点介绍的很清楚,这里就不再赘述了。总之,使用简单,功能强大。

安装

安装直接去官网下载对应的安装包即可。当然,如果你是Mac用户的话,brew永远不会让你失望brew install prometheus。

格式

Prometheus获取数据的策略是Pull而不是Push,也就是说,它会自己去抓取,而不用你来推送。抓取使用的是HTTP协议,在配置文件中指定目标程序的端口,路径及间隔时间即可。这也就意味着任何程序想要使用Prometheus存储数据都很简单,定义一个HTTP接口即可。

Prometheus的数据格式是简单的文本格式,可以直接阅读。其中,#号开头的是注释,除此之外,每一行一个数据项,数据名在前,值在后。{}中是标签,一条数据可以有多个标签。

配置

Prometheus使用YAML进行配置。global配置一些全局信息,scrape_configs配置具体想要抓取的目标。这段配置的含义是:启动一个叫做go-test的任务,每隔五秒钟,访问localhost:8888/metrics获取数据。

测试程序

我们来写一个程序测试一下Prometheus的功能。虽然可以手动返回Prometheus需要的数据,但是使用开发好的客户端会更加方便。

这里我们使用Go语言,编写一个简单的服务器和客户端。客户端会以一个稳定的速度请求服务器的/test路径,但是每两分钟会加大流量,持续30秒再回到之前的水平。服务器95%的情况下会花费50ms进行响应,还有5%的情况下会花费100ms。

这里我们定义了两个指标,httpRequestCount记录HTTP的请求数,httpRequestDuration记录响应时间,他们都有一个endpoint标签用于记录请求路径。这两个指标分别是Counter类型和Summary类型,Prometheus定义了四种指标类型,基本涵盖了各种用例场景,具体可以去看相关文档。简单来说,Counter类型的数据表示一个只会向上增加的数据,比如请求数。而Summary类型的数据表示一个按区间分布的数据,比如响应时间或者请求体大小。

/** @Author: CJ Ting* @Date: 2017-03-12 17:27:23* @Last Modified by: CJ Ting* @Last Modified time: 2017-03-12 23:49:55 */packagemainimport("log""math/rand""net/http""time""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp")varhttpRequestCount=prometheus.NewCounterVec(prometheus.CounterOpts{Name:"http_request_count",Help:"http request count",},[]string{"endpoint"},)varhttpRequestDuration=prometheus.NewSummaryVec(prometheus.SummaryOpts{Name:"http_request_duration",Help:"http request duration",},[]string{"endpoint"},)funcinit(){prometheus.MustRegister(httpRequestCount)prometheus.MustRegister(httpRequestDuration)}funcmain(){http.Handle("/metrics",promhttp.Handler())http.HandleFunc("/test",handler)gofunc(){http.ListenAndServe(":8888",nil)}()startClient()doneChan:=make(chanstruct{})=95{time.Sleep(100*time.Millisecond)}else{time.Sleep(50*time.Millisecond)}elapsed:=(float64)(time.Since(start)/time.Millisecond)httpRequestDuration.WithLabelValues(path).Observe(elapsed)}funcstartClient(){sleepTime:=1000gofunc(){ticker:=time.NewTicker(2*time.Minute)for{

启动Prometheusprometheus -config.file config.yml以后,再启动我们的测试程序go run test.go。打开Prometheus控制台localhost:9090/targets就可以看到Prometheus正在抓取数据,一切正常。

控制台

Prometheus的一个强大之处在于可以使用各种函数和操作符来查询数据。在上面的测试程序中,每个数据都带有endpoint这个标签,表示请求的路径。

打开Prometheus的控制台http://localhost:9090/graph,点击console标签页,输入http_request_count{endpoint="/a"}就可以查询路径为/a的API Point到目前为止的总请求数。

如果想看QPS的话,可以使用自带的函数rate,rate(http_request_count[10s])表示以10s作为时间单元来统计QPS。

Prometheus的控制台自带一个简单的绘图系统,点击graph标签页,输入表达式就可以看到图表。

例如输入rate(http_request_count{endpoint="/test"}[10s])就可以看到我们测试程序中/test路径的QPS,从图中可以明显发现,每隔一段时间就会有一个波峰流量。

httpRequestDuration是一个Summary类型的指标,比简单的Counter要复杂,会生成三个数据项。分别是http_request_duration_sum,表示响应时间加在一起的总和。

http_request_duration_count,表示响应时间的总个数以及http_request_duration,表示响应时间的分布情况,这个数据项会使用quantile标签对响应时间进行分组。

如下图所示,quantile=0.5值为50,表示50%的请求响应时间都在50ms以下。quantile=0.9的值为54,表示90%的请求响应时间都在54ms以下。但是,quantile=0.99的值为103,表示99%的请求响应时间在103ms以下。这就说明了一个问题,那就是极个别的请求耗费了大量时间。

通过使用表达式http_request_duration_sum / http_request_duration_count,我们可以得到平均响应时间,如下图。

当然,这个图的作用不大(平均数往往反映不了什么问题),不像上图那样,我们无法看出有部分请求花费了大量时间。

以上只是对数据项的最简单利用,Prometheus自带了很多函数和操作符,可以方便地对数据进行处理,具体可以参考官方文档。

Grafana

Prometheus自带的图表是非常基础的,只能用来临时查看一下数据。如果要构建强大的Dashboard,还是需要更加专业的工具才行。这个工具就是Grafana。

安装

同样是去官网下载相应的安装包。Mac用户可以再次感受到brew的优越性。brew install grafana。

启动

直接用默认配置就挺好的。在Mac上,启动指令如下。

Grafana默认监听在3000端口上,默认用户名和密码都是admin。

设置

输入用户名和密码以后,进入Grafana页面。第一件事是要设置数据源(Data Source),即Grafana从什么地方获取数据,选择Prometheus即可。

数据源设置好以后,接下来就是创建Dashboard了。Dashboard里面可以放置很多“组件”。比如图表,状态值,表格,文字等。

这里我们选择Graph图表,Grafana会创建一个默认的空图表。

点击图表标题,选择Edit来编辑图表参数。最重要的参数就是Metrics标签里的Query字段,这个字段定义了我们的图表到底要展示什么数据。

输入rate(http_request_count{endpoint="/test"}[10s]),就可以看到/test路径的QPS曲线了。

同理,在Query中输入http_request_duration就可以得到响应时间曲线。通过使用Prometheus提供的操作符和函数,我们可以对数据进行我们想要的任意可视化,十分灵活。

在这两个工具的配合使用下,对服务器信息的监控变得非常简单。首先,服务器定义一个HTTP接口,暴露出想要监控的数据,然后使用Prometheus收集并存储这些数据,最后在Grafana中绘制这些数据。一个完整的监控方案就诞生了。

当然,在实际系统中,还缺少了一个环节,那就是报警。监控发现问题以后,需要马上报警通知相关的维护人员。这是另外一个话题了,以后再介绍。

【编辑推荐】

【责任编辑:刘晶晶 TEL:(010)68476606】

c 实现服务器性能监控,Prometheus——进行服务器性能监控的一件法宝相关推荐

  1. 监控——Prometheus+ Grafana+Mysql主从复制监控

    目录 一.基础概念 二.grafana部署(端口3000) 三.打标签,主要用于k8s 重打标签 四.prometheus告警功能 五.实验部署 主服务器时间同步 从服务器时间同步 主服务器的mysq ...

  2. 服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志

    一 Prometheus 入门 1.1 入门介绍 运维体系~指标监控 先来一张图,说明一下Prometheus监控相关的软件和知识点. 1: 首先要安装:Prometheus, 负责收集各种监控指标, ...

  3. Prometheus和Grafana的监控Linux服务器和MYSQL数据库

    [使用root用户执行以下操作] 目录 一.安装Prometheus和Grafana 1.安装 Prometheus 1)下载 Prometheus 2)解压安装包 3)启动prometheus 4) ...

  4. prometheus 配置服务器监控、服务监控、容器中服务监控与告警

    最近公司有几个服务遇到了瓶颈,也就是数据量增加了,没有人发现,这不是缺少一个监控服务和告警的系统吗? 主要需求是监控每个服务,顺带监控一下服务器和一些中间件,这里采集的2种,zabbix和promet ...

  5. 服务器集群可视化监控-Prometheus+Grafana

    监控软件 Prometheus 官网:https://prometheus.io/ 监控:monitor 监视我们的服务器或者服务,一旦出现问题,要告诉我们(告警),运维人员及时去处理,将公司的损失减 ...

  6. 服务器监控-prometheus使用(4):收集器搭建篇

    文章目录 0.系列目录 1.前言 2.Telegraf 2.1 安装 2.2配置 2.2.1 inputs.system.conf 2.2.2 inputs.activemq.conf 2.2.3 i ...

  7. 怎么监控多台服务器资源占用率,常用的4个服务器性能监控命令

    一.top -实时监控命令 1.能够实时监控系统的运行状态,并且可以按照cpu及内存等进行排序: -h:帮助 -p:监控指定的进程,当监控多个进程是,进程ID以逗号隔开 2.top任务区命令: M:按 ...

  8. 监控视频分发转发服务器性能,基于视频监控的分发服务器的研究与实现

    摘要: 随着宽带网络,数字压缩技术和大容量存储技术的高速发展,基于实时多媒体通信的网络服务也达到了前所未有的增长速度.视频监控业务利用现有的因特网基础设施传输网络视频,是目前网络实时多媒体通信中最受关 ...

  9. node获取服务器cpu信息,听说你不知道如何监控Node服务的内存?

    刚开始,先抛出一个问题: 你知道你们生产环境的 Node 服务平时占用内存多少吗?或者说是多少量级? 山月在面试 Node 候选人时,这个问题足够筛掉一半的自称Node精通者,不过没有回答上来,我往往 ...

  10. 监控操作系统和服务器,监控操作系统和服务器

    监控操作系统和服务器 内容精选 换一换 监控是保持云耀云服务器可靠性.可用性和性能的重要部分,通过监控,用户可以观察云耀云服务器资源.为使用户更好地掌握自己的云耀云服务器运行状态,公有云平台提供了云监 ...

最新文章

  1. 使界面里的组件更圆滑
  2. php 生成ai文件,php_Generator php 生成器
  3. 【拔刀吧少年】之sed编辑器
  4. gblfy博客配色模板
  5. 20180925-5 代码规范,结对要求
  6. uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码...
  7. Python相关分析—一个金融场景的案例实操
  8. bulldog2 靶机渗透
  9. INFOR WMS UI重构
  10. python悬浮球窗口_悬浮窗口(智能隐藏和显示)的一种实现方案
  11. WinForm的控件二次开发
  12. 【C++进阶】第二十篇——map和set(map和set的用法+multimap+multiset+map和set代码实现)
  13. C++数组练习题(一)
  14. mysql和asp.net_asp.net core 使用Mysql和Dapper
  15. Zotero的MDPI参考文献标注模板资源,导入直接使用。
  16. 零代码开发AI语音红外遥控
  17. springboot整合支付宝微信支付案例+代码
  18. (二)安全测试基础:安全测试策略
  19. 成功的项目经理,每天、每周、每月应该做的都在这里
  20. 安装elasticsearch及中文IK和近义词配置

热门文章

  1. 基于.net5.0常用开源组件Xman
  2. 聚类分析的基本概念和方法
  3. 泛微OA流程插入JS代码块
  4. 8 款浏览器兼容性测试工具介绍,需要的赶紧收藏吧!
  5. 解决安装MySQL后,Excel打开很慢的问题
  6. 互联网广告的形式表现有哪几种?
  7. 英语 语义分割_语义分割该如何走下去?
  8. Mac下复制粘贴的快捷键是什么?随记
  9. git bash粘贴快捷键
  10. git add所有文件