使用Prometheus监控服务器性能
http://cjting.me/linux/use-prometheus-to-monitor-server/
最近一直在思考如何对线上服务做深度监控。基础的服务可用性监控很简单,定期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的数据格式是简单的文本格式,可以直接阅读。其中,#
号开头的是注释,除此之外,每一行一个数据项,数据名在前,值在后。{}
中是标签,一条数据可以有多个标签。
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
http_request_count{endpoint="/a"} 10
http_request_count{endpoint="/b"} 200
http_request_count(endpoint="/c") 3
copy
配置
Prometheus使用YAML进行配置。global
配置一些全局信息,scrape_configs
配置具体想要抓取的目标。这段配置的含义是:启动一个叫做go-test
的任务,每隔五秒钟,访问localhost:8888/metrics
获取数据。
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.# Attach these labels to any time series or alerts when communicating with# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'go-test'
metrics_path: "/metrics"# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s static_configs:
- targets: ['localhost:8888']
copy
测试程序
我们来写一个程序测试一下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*/package mainimport ("log""math/rand""net/http""time""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp"
)var httpRequestCount = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "http_request_count",Help: "http request count",},[]string{"endpoint"},
)var httpRequestDuration = prometheus.NewSummaryVec(prometheus.SummaryOpts{Name: "http_request_duration",Help: "http request duration",},[]string{"endpoint"},
)func init() {prometheus.MustRegister(httpRequestCount)prometheus.MustRegister(httpRequestDuration)
}func main() {http.Handle("/metrics", promhttp.Handler())http.HandleFunc("/test", handler)go func() {http.ListenAndServe(":8888", nil)}()startClient()doneChan := make(chan struct{})<-doneChan
}func handler(w http.ResponseWriter, r *http.Request) {start := time.Now()path := r.URL.PathhttpRequestCount.WithLabelValues(path).Inc()n := rand.Intn(100)if n >= 95 {time.Sleep(100 * time.Millisecond)} else {time.Sleep(50 * time.Millisecond)}elapsed := (float64)(time.Since(start) / time.Millisecond)httpRequestDuration.WithLabelValues(path).Observe(elapsed)
}func startClient() {sleepTime := 1000go func() {ticker := time.NewTicker(2 * time.Minute)for {<-ticker.CsleepTime = 200<-time.After(30 * time.Second)sleepTime = 1000}}()for i := 0; i < 100; i++ {go func() {for {sendRequest()time.Sleep((time.Duration)(sleepTime) * time.Millisecond)}}()}
}func sendRequest() {resp, err := http.Get("http://localhost:8888/test")if err != nil {log.Println(err)return}resp.Body.Close()
}
copy
启动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-server --config=/usr/local/etc/grafana/grafana.ini --homepath /usr/local/share/grafana cfg:default.paths.logs=/usr/local/var/log/grafana cfg:default.paths.data=/usr/local/var/lib/grafana cfg:default.paths.plugins=/usr/local/var/lib/grafana/plugins
copy
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中绘制这些数据。一个完整的监控方案就诞生了。
当然,在实际系统中,还缺少了一个环节,那就是报警。监控发现问题以后,需要马上报警通知相关的维护人员。这是另外一个话题了,以后再介绍。
使用Prometheus监控服务器性能相关推荐
- 性能测试篇 :Jmeter监控服务器性能
jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: http ...
- Prometheus监控服务器
部署prometheus监控服务器 安装监控服务器 修改配置文件 编写service文件,管理服务 查看监控数据 所有主机系统均为CentOS7,提前配置IP.主机名.系统YUM源 安装监控软件(19 ...
- 性能测试怎么监控服务器,性能测试篇 :Jmeter监控服务器性能
转载:http://www.cnblogs.com/chengtch/p/6079262.html jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 ...
- Windows Server 2008 监控服务器性能
下面学习Windows Server2008监控服务器性能包括 日志管理,归档日志,日志排错,怎么配置计算机以转发和收集事件,使用任务管理监控内存和CPU的使用,查看程序内存使用,查看程序CPU使用, ...
- Jmeter监控插件:监控服务器性能
jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: Down ...
- 使用Prometheus+Grafana实时监控服务器性能
一.Prometheus.Grafana 架构 Prometheus 是一套开源的系统监控报警框架.Prometheus 所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中 ...
- Jmeter监控服务器性能
这篇文章主要讲的是jmeter通过插件去监控服务器的性能参数,来帮助我们分析系统性能. 也可以通过prometheus去监控:docker+jmeter+prometheus+grafana入门实战, ...
- Jmeter+Prometheus+Grafana性能监控平台:将JMeter压测数据输出到Prometheus
前言 1.小编之前写过一篇文章详细讲解了如何搭建一个HTTP接口性能实时监控测试平台,是用Grafana+Influxdb+Jmeter组合实现的,可以参考我写的这篇博客https://editor. ...
- cacti监控服务器性能,监控三剑客之Cacti监控服务器
博文目录 一.Cacti 1.Cacti简介 2.cacti的作用和特点 3.cacti监控的数据类型 二.安装配置Cacti监控服务器 1.配置LAMP环境 2.安装SNMP和RRDtooll工具 ...
最新文章
- 设置VSCode Git签出分支快捷键Alt+G
- linux setup 进步了网卡,linux 网卡修改小结
- python软件代码示例-python 示例代码1
- 社交电商风潮起,中小卖家何处去
- 怎么用mysql存储系统数据库_mysql数据库之基本操作和存储引擎
- jpa 根据主键生成策略获取id_JPA主键生成策略
- 方钢管弹性模量计算方式_弹性模量的物理学本质
- 入网许可证_入网许可证怎么办理,申请流程
- 基于VMware Workstation创建虚拟机,以Ubuntu16.04为例
- 三、Springmvc之Controller层方法返回值
- configure: error: MySQL library not found ,Not found mysqlclient library
- Linux Exploit系列之七 绕过 ASLR -- 第二部分
- HDOJ 1720 A+B Coming
- 从一个MFC工程移植对话框类到另一个MFC工程
- New Adventure----GUI Design Studio
- 牛腩购物网25:购物车的实现
- python whl文件安装_python whl文件怎么安装
- Springboot整合邮件发送(163邮箱为例)
- vue.js的快速入门使用
- excel操作技巧:“自定义名称”应用基础篇
热门文章
- 【研究生本科】怎样轻松搞定开题报告?
- 这两部剧,至少99.9%的人都看过,KOOCAN还看了不止3遍
- LayuiAdmin的登录、注册、忘记密码、退出模块(源码实例)
- 支持向量机:PRML:SparseKernelMachine
- 《COC部落战争》新手速成攻略
- dxdiag - 检测windows10设备的Bios版本,显卡,声卡信息_拔剑-浆糊的传说_新浪博客...
- 普中科技开发板使用说明书_普中科技单片机实验板使用操作说明.pdf
- AudioRecord判断是否有音频输入
- 亚马逊云计算AWS介绍
- 试题汇编2011年修订版计算机,图形图像处理(Photoshop平台)Photoshop CS3试题汇编: 2011版. 图像制作员级...