【prometheus】学习第一篇——prometheus
前言:
说到监控方案,市面上开源的有很多,最常用的zabbix,深入使用zabbix以后,才知道zabbix设计团队有多厉害,简直是一个完美的监控告警方案。但是在针对docker的监控上还差点,需要自己写监控脚本实现。为此从去年开始调研针对docker的监控方案,如下:
1,cadvisor+influxdb+grafana
优点:部署方便,cadvisor监控docker主机和docker信息,influxdb记录数据,grafana展示
缺点:1,无法获取cpu使用率,cadvisor采集到的是cpu使用时间,得到cpu使用率需要计算,grafana没有办法做复杂的运算。
2,告警体系几乎没有,grafana有基本的告警功能,仅限于图表类型数据可以告警,并且没有告警收敛、告警分析的功能,存在告警风暴的风险。
3,influxdb开源版本不支持集群,商业版才支持集群。这个对后续扩展是个问题。
2,Weave Scope
优点:简直完美的监控,界面漂亮,操作方便,自带终端堡垒机功能。
缺点:1,他的优点也是他的缺点,权限这么大的终端(root用户),居然没有认证体系,任何人拿到ip就能对服务器做任何操作了
2,总体感觉这个方案是给人看的,不太适合做监控系统,界面花哨,但是实际使用并不方便。
3,influxdb+telegraf+kapacitor+chronograf
优点:influxdb提供的全套方案,看着很完美
缺点:我尝试了十几次,没有一次能够把全流程跑通,主要是卡在kapacitor上,这个是实时处理模块,可惜一直无法告警,不知道是不是产品的bug。
4,自己开发的docker监控方案
https://github.com/zhenglisai/docker-monitor
优点:完全自己控制,什么都能够拿到,想拿什么数据拿什么数据
缺点:agent的cpu占用率巨高。。。实际跑起来,单单监控程序就占用了45%的cpu,这个肯定不能接受,个人水平有限,python程序优化以后,也是这样,不清楚是python本身效率低的问题,还是我采集数据的方式不合理,暂时放弃了。
5,最后prometheus方案
优点:全套的监控,丰富的插件
缺点:没有认证!!!prometheus官方文档也是写的,他们专注于监控,不提供用户认证体系。需要的话,需要自己在最外层包一层nginx实现反向代理认证。
背景说明
docker监控方案来来回回折腾了半年,各个方案都试过了,没有一个特别完美的,prometheuse+grafana这个方案,也是用了放弃,放弃以后没有更好的,又拿回来用,来来回回了四五次。后来在开发trigger-action系统的时候,再一次深入调研了prometheus,才发现,原来prometheus这么强大,不愧是谷歌推荐的监控方案(在《SRE google运维解密》这本书中,多次提到prometheus,说是谷歌监控体系的开源版)。
举一个例子来说明一下:
比如统计和监控一个api接口的平均响应时长有没有意义?我们之前的监控系统就是监控这个指标,来判断api是不是健康。后来发现这个指标基本没什么用,有用的是响应时长分布,比如90%的请求响应时长小于30ms,1%的请求响应时长大于1s,那么这个api可以认证基本正常。但是从平均响应时长来看,可能平均100ms,这个平均值不能真实反映api的请求情况。这一点,prometheus可以做到。
正式开始:
【安装篇】
什么都不如官方文档详细,如果你的英语够好,建议直接去看官方文档就行了:https://prometheus.io/docs/introduction/overview/
1,prometheus是go语言写的,多个平台有很好的移植性,并且基本不依赖其他环境,官网下载下来直接运行就行了,不详细说了
https://prometheus.io/download/
【配置篇】
重点说明配置,Prometheus与zabbix最大的不同,是什么都需要通过配置文件来实现,上手难度比zabbix大。
主配置文件:prometheus.yml
让我们看看这个文件有什么:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s). # Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['127.0.0.1:9093'] # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "test.yml"
# - "second_rules.yml" # 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: 'prometheus' # metrics_path defaults to '/metrics'
# scheme defaults to 'http'. static_configs:
- targets: ['0.0.0.0:9090']
- job_name: 'node'
file_sd_configs:
- files: ['/root/prometheus/prometheus/discovery.json']
咱们这一篇主要讲一下scrape_configs这一部分,这一部分实现添加监控主机功能。
prometheus采用pull的模式,server端从agent拉取指标,所以agent什么都不需要配置,等待server来拉取数据就行了。
Prometheus添加监控主机有两大类方式:1,写死在配置文件里,每次添加主机,都编写Prometheus.yml文件,然后kill -1 prometheus的pid重新加载配置文件,这种方案用起来很不方便,尤其是主机多了以后。2,自动发现,支持多种发现规则。这里我们采用基于file的自动发现。
static_configs:这一部分就是写死在配置文件里的主机,每次添加主机都可以添加在这里,job_name的意思其实是一个可以筛选的标签,可以认为是分组。
file_sd_configs是基于文件的自动发现,Prometheus会从/root/prometheus/prometheus/discovery.json这个文件中读取主机信息,官方文档说只要更新这个文件就行了,Prometheus会监控这个文件的变化来自动更新,但是在实际使用中,感觉不太好用,还是手动给server进程发送Kill -1信号吧。
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['0.0.0.0:9090']
- job_name: 'node'
file_sd_configs:
- files: ['/root/prometheus/prometheus/discovery.json']
/root/prometheus/prometheus/discovery.json文件内容如下:
[
{
"targets": ["192.168.1.118:9100"],
"labels": {"server_name":"promethues-agent","region":"cn-north-1"}
},
{
"targets": ["192.168.1.118:8080"],
"labels": {"server_name":"docker-agent","region":"cn-north-1"}
}
]
可以自己写一个api程序,比如写一个python的api,调用这个api,程序会自动更新这个文件,并重启Prometheus进程,来实现更新监控主机。
在监控主机上运行node_exporter这个程序,也是不需要任何配置,直接运行就行了。
这样访问prometheus服务器的9090端口,就可以看到监控的服务器和监控指标了。
prometheus的查询语法见官方文档吧,写的比较全。
这一篇就到这里,下一篇讲一下告警的配置。
【prometheus】学习第一篇——prometheus的更多相关文章
- LINQ to XML LINQ学习第一篇
LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...
- 从.Net到Java学习第一篇——开篇
以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...
- Java并发包下锁学习第一篇:介绍及学习安排
Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...
- JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇
JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇 作为一个使用Java语言开发的程序员,我们都知道,要想运行Java程序至少需要安装JRE(安装JDK也没问题).我们也知道我们Java程序 ...
- Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署
序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在 ...
- Python学习第一篇
好久没有来博客园了,今天开始写自己学习Python和Hadoop的学习笔记吧.今天写第一篇,Python学习,其他的环境部署都不说了,可以参考其他的博客. 今天根据MachineLearning里面的 ...
- Android基础学习第一篇—Project目录结构
写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...
- ImageJ 学习第一篇
ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Image ...
- Java图像处理最快技术:ImageJ 学习第一篇
ImageJ是世界上最快的纯Java的图像处理程序. 它能够过滤一个2048x2048的图像在0.1秒内(*). 这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Ima ...
随机推荐
- python——父类与子类的一些说明
Python中类的初始化方法是__init__(),因此父类.子类的初始化方法都是这个,如果子类不实现__init__()这个函数,初始化时调用父类的初始化函数, 如果子类实现了这个函数,则要在这个函 ...
- MVVM模式源码分析手写实现
1.demo1.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- STL学习笔记(迭代器配接器)
Reverse(逆向)迭代器 Reverse迭代器是一种配接器. 重新定义递增运算和递减运算.使其行为正好倒置. 如果你使用这类迭代器,算法将以逆向次序处理元素.所有标准容器都允许使用Reverse迭 ...
- 使用transform和transition制作CSS3动画
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 解决zabbix“ZBX_NOTSUPPORTED: Timeout while executing a shell script”报错
如题所示,在zabbix_server使用zabbix_get获取自定义“UserParameter”对应的脚本的数据时,出现了如题所示的报错信息 [root@nmp01 scripts]# /usr ...
- Tomcat Https配置
一.生成KeyStore 打开命令行,输入:keytool -genkey -alias tomcat_server -keyalg RSA -storepass jimmypwd -validity ...
- Javascript属性constructor/prototype的底层原理
在Javascript语言中,constructor属性是专门为function而设计的,它存在于每个function的prototype属性中. 这个constructor保存了指向function ...
- java中volatile关键字的含义(转)
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
- php匿名函数和闭包函数及use关键字传参及Closure匿名函数类
php闭包函数用use传参有什么意义?答:use引用外层变量,比如全局变量 Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名 ...
- MySQL:习题(单表多条件查询二)
Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...