Prometheus 简介
Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。
1)Prometheus的特点
强大的数据模型,Prometheus采集的监控数据均以metric的形式存放在内置的时序数据库TSDB当中易于管理,因为Prometheus的核心部分只有一个单独的二进制文件,因此不存在任何的第三方依赖强大的查询语言,Prometheus内置了一个强大的数据查询语言PromQL, 通过它可以实现对监控数据的查询与聚合高可用与可扩展,Prometheus的数据不仅可以存储在本地,还可以使用远程存储,同时还可以使用第三方工具加上它的联邦集群来实现高可用``可视化平台,Prometheus自带了一个UI,不过较为简陋,但Grafana天然支持Prometheus,两者完美结合,可以创建更加精美的数据监控图标;
2)Prometheus数据采集方式
pull方式:该方式为拉取形式,首先需要在Client安装exporter,exporters以守护进程的模式运行,然后开始采集数据每个exporters程序为一个单独的http-server,因为它可以对http的请求做出响应,并返回metric(K/V数据)而Prometheus-server则通过pull的形式去访问每个节点上的exporter并采集所需要的数据,默认为该方式;
push方式:该方式为推送形式,如需使用push方式,则需在服务端或者客户端上安装pushgateway插件pushgateway我们可以将其理解为一个代理,它位于客户端与服务端之间pushgateway先接收指标,然后pushgateway再推送给prometheus-server,这里的pushgateway不一定要安装客户端,也可以安装在服务端甚至其它节点;
3)Prometheus的指标类型
指标的英文叫做metrics,metrics就是一组K/V数据,可以理解为metrics是对采集过来的数据的一种统称而非一个具体的数值或者指标,因为指标的类型是多样的,但实际在Prometheus-server当中并不对指标类型进行区分``而是简单地把这些指标统一视为无类型的时间序列,说到这里,我们来看看metrics的指标类型有哪些;
1.Counter(计数器):从0开始累积计算,代表一种样本数据单调递增的指标,也就是它只增不减,除非监控系统发生了重置我们可以用这种类型的指标来表示服务器的请求数量,错误发生的总数量,已经完成的总数量在使用Counter类型时,不要将其应用于样本数据非单调递增的指标,比如说系统当前运行的进程数量,此时应该使用其它类型;
2.Gauge(仪表盘):它收集的数据是瞬时的,与时间没关系,这种类型代表一种样本数据可以任意变化的指标,也就是它不一定会持续增长,但也不一定会持续降低它的变化没有规则,我们可以使用这种类型的指标来采集硬盘容量的使用率与内存使用率,同时也可以表示能随时增加或者减少的总数,比如并发请求数量;
3.Histogram(直方图):直方图用于表示一段时间内的数据采集结果,并能够对指定区间以及总数进行统计,它通常用来计算分位数的直方图,比如说请求的持续时间或者响应的大小;
4.Summary(摘要):它和Histogram类型相似,用于表示一段时间内的数据采集结果,但是它直接存储了分位数而不是通过区间来进行计算
Prometheus 优点
另外Prometheus还存在以下优点:
1.高效:单一Prometheus可以处理数以百万的监控指标;每秒处理数十万的数据点。
2.易于伸缩:通过使用功能分区(sharing)+联邦集群(federation)可以对Prometheus进行扩展,形成一个逻辑集群;Prometheus提供多种语言的客户端SDK,这些SDK可以快速让应用程序纳入到Prometheus的监控当中。
3.良好的可视化:Prometheus除了自带有Prometheus UI,Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。另外最新的Grafana可视化工具也提供了完整的Proetheus支持,基于Prometheus提供的API还可以实现自己的监控可视化UI。
4.监控更多多样性**:prometheus支持多种语言的的客户端,我们通过客户端方便对核心业务进行埋点,比如下单,添加购物车等流程。
而且prometheus已经有非常多的系统集成;
比如:应用层面的监控:nginx,haproxy,mysql,docker等;
系统层面如: SNMP协议监控,主机监控,进程监控;
容器云监控: docker,k8s openstack私有云;
5.非常高效的存储 :平均一个采样数据占 ~3.5 bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。
Prometheus 架构
此图说明了Prometheus的体系结构及其一些生态系统组件:
对照图中的每一部分进行介绍:
-
1.prometheus server: 用于收集和存储时间序列数据。
-
2.Retrieval:采样模块,prometheus的服务器在哪里拉取数据,检索拉取到的数据分发给 TSDB进行存储;
TSDB:存储模块默认本地存储为TSDB;
HTTP server : 提供http接口查询和面板,默认端口为9090; -
3.Service Discovery:
服务发现,prometheus支持多种服务发现机制: 文件,DNS,k8s,openstack,等,基于服务发现的过程,通过第三方接口,prometheus查询到需要监控的target列表,然后轮询这些target获取监控数据; -
4.客户端SDK
官方提供的客户端类库有go,java,python,ruby; -
5.short-lived jobs:
存在时间不足以被删除的短暂或批量业务,无法通过pull的方式拉取,需要使用push的方式,与pushgeteway结合使用; -
6.proDash
使用rails开发的dashboard,用于可视化指标数据; -
7.Exporters:用于暴露已有的第三方服务的 metrics 给 Prometheus。
-
8.Alertmanager:从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
-
9.Push Gateway:主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。
-
10.prometheus_cli:命令行工具;
Prometheus 的工作流程
-
prometheus server 定期从配置好的jobs或者exporters中拉metrics.或者接受来自pushgateway发过来的metrics,或者从其他的prometheus server中拉取metrics
-
prometheus server 在本地存储收集到的metrics,并运行已经定义好的arlt.rules,记录新的时间序列或者向alertmanager推送报警
-
Alertmanager根据配置文件,对接受的警报进行处理,发出告警
-
在图形界面中,可视化采集数据,可以使用别人写好的grafana模板。
Prometheus 安装部署
下载地址:https://github.com/prometheus/prometheus/releases/
[root@ chenc01 ~]# tar xf prometheus-2.16.0.linux-amd64.tar.gz
[root@ chenc01 ~]# mv prometheus-2.16.0.linux-amd64 /usr/local/prometheus
[root@ chenc01 ~]# cd /usr/local/prometheus/
[root@ chenc01 prometheus]# pwd
/usr/local/prometheus
[root@ chenc01 prometheus]# ls
console_libraries consoles LICENSE NOTICE prometheus prometheus.yml promtool tsdb
[root@ chenc01 prometheus]# ./prometheus --version
prometheus, version 2.16.0 (branch: HEAD, revision: b90be6f32a33c03163d700e1452b54454ddce0ec)
build user: root@7ea0ae865f12
build date: 20200213-23:50:02
go version: go1.13.8
# 后台启动普罗米修斯
[root@ chenc01 prometheus]# ./prometheus &
[1] 1920
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Prometheus 使用
1、访问Prometheus
通过后台访问http://ip:9090
2、查看状态
3、查看配置信息
4、查看运行信息
Grafana 简介
Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。目前使用grafana的公司有很多,如paypal、ebay、intel等。
Grafana还支持多种数据源,包括Elasticsearch,InfluxDB,MySQL,OpenTSDB,在部署和使用Grafana之前,我们先来看看Grafana的几个基本术语 ;
1)Grafana的基本术语
1.DataSource(数据源):在上面我们说到了,Grafana支持多种数据源,包括但不限于Prometheus,而数据源通俗来讲就是提供数据的对象,比如Zabbix,比如Prometheus
2.Dashboard(仪表盘):仪表盘就是一个呈现页面,当我们添加好对应的数据源以后,这个时候就需要实现数据的可视化,在Grafana中,可以通过Dashboard来组织和管理数据可视化图表;
3.Row(行):行是Dashboard的组成单元,一个Dashboard可以包含多个行,而一个行当中又可以展示一种或者多种信息的组合,比如负载状态,内存使用率,磁盘使用率;
4.Panel(面板):面板我们可以理解为是Row展示信息的方式,它支持表格(tables),列表(alert list),热图(heatmap),在Grafana当中,所有的面板均以插件的形式进行使用;
5.Query Editor(查询编辑器):查询器的作用是指定获取哪一部分的数据,这个有点类似于SQL语句,但我们如果添加的数据源为Prometheus,那实际上使用的为PromQL;
6.User(用户):用户和我们平常登录系统的用户概念一样,Grafana中包含三种角色,分别为admin,editor,viewer,read only editor在这其中,admin的权限最高,它可以执行如何操作,editor只能创建DashBoard,viewer只能查看DashBoard,read only editor可以修改DashBoard,但不允许保存;
7.Organization(组织):在Grafana当中,DataSource与Dashboard属于一个组织,每个用户可以拥有多个不同的组织,在不同的组织当中,可以为不同的用户赋予不同的权限需要知道的是,不同组织之间的数据源和仪表板都不同,每当在Grafana当中创建一个组织,就相当于开启了一个全新的视图,这时候所有的数据源与仪表盘等内容都要重新去添加和配置
Grafana 安装部署
1)下载软件包并安装Grafana
首先登陆grafana官网,选择需要版本进行下载rpm包,下载链接为:Grafana官网下载路径
`[root@prometheus ~]# wget -c https:``//dl.grafana.com/oss/release/grafana-6.6.2-1.x86_64.rpm``[root@prometheus ~]# yum -y install /root/grafana-6.6.2-1.x86_64.rpm`
2)熟悉Grafana的配置文件
Grafana的默认配置文件为:/etc/grafana/grafana.ini,其配置项有700多行,多数为默认即可,下面来看看几个常用的配置项
[root@ chenc01 ~]# vim /etc/grafana/grafana.ini
[paths]
# 定义数据存储路径,用来存储sqlite3,临时文件
data = /var/lib/grafana
# 在data目录中的临时数据要存储多久,默认为24h,也可以
temp_data_lifetime = 24h
# 定义日志存储路径
logs = /var/log/grafana
# 定义插件存储目录
plugins = /var/lib/grafana/plugins
[server]
# 定义访问的协议,默认为http
protocol = http
# 定义监听的IP地址,默认为所有
http_addr = 10.2.3.11
# 定义监听的端口,默认为3000
http_port = 3000
# 定义在浏览器中访问Grafana的全路径,默认即可,也可以写成http://ip:port
root_url = %(protocol)s://%(domain)s:%(http_port)s/
# 是否记录web请求日志,默认为关闭
router_logging = false
# 前端静态文件的存储路径,默认为/usr/share/grafana/public目录
static_root_path = public
# 选择数据库类型,默认为sqlite3,也可以选择MySQL
[database]
type = sqlite3
# 定义连接地址与端口
host = 127.0.0.1:3306
# 定义数据库名称
name = grafana
# 定义连接用户
user = root
# 定义连接密码
password = 123
# 关闭SSL
ssl_mode = disable
# 这里只是sqlite3需要,定义sqlite3的数据存储路径,默认为/var/lib/grafana目录
path = grafana.db
[users]
# 是否允许普通用户登录,默认为允许
allow_sign_up = true
# 是否允许普通用户创建组织,默认为允许
allow_org_create = true
# 如果为true,则自动把新增的用户增加到id为1的组织中,如果为false,则新建用户的时候会新增一个组织 ,默认为true
auto_assign_org = true
# 默认的背景页面,也可以选择light
default_theme = dark
3)定义Grafana的配置文件
[root@ chenc01 ~]# cp /etc/grafana/grafana.ini /etc/grafana/grafana.ini.bak
[root@ chenc01 ~]# vim /etc/grafana/grafana.ini
[paths]
data = /var/lib/grafana
temp_data_lifetime = 24h
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = conf/provisioning
[server]
protocol = http
http_addr = 10.2.3.11
http_port = 3000
root_url = %(protocol)s://%(domain)s:%(http_port)s/
serve_from_sub_path = false
router_logging = false
static_root_path = public
enable_gzip = true
[users]
allow_sign_up = true
allow_org_create = true
auto_assign_org = true
default_theme = dark
4)启动Grafana并设置为开机自启
[root@ chenc01 ~]# systemctl enable grafana-server
Created symlink from /etc/systemd/system/multi-user.target.wants/grafana-server.service to /usr/lib/systemd/system/grafana-server.service.
[root@ chenc01 ~]# systemctl start grafana-server
level=info ts=2020-03-28T06:28:07.583Z caller=compact.go:496 component=tsdb msg="write block" mint=1585366069255 maxt=1585368000000 ulid=01E4FX6YNHTQPYGTEKNJ9TCH2E duration=3.110826386s
level=info ts=2020-03-28T06:28:07.682Z caller=head.go:661 component=tsdb msg="head GC completed" duration=72.63582ms
[root@ chenc01 ~]# systemctl status grafana-server
● grafana-server.service - Grafana instance
Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-03-28 14:28:09 CST; 4s ago
Docs: http://docs.grafana.org
Main PID: 17041 (grafana-server)
CGroup: /system.slice/grafana-server.service
└─17041 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini --pidfile=/var/...
Mar 28 14:28:08 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:08+0800 lvl=..."
Mar 28 14:28:08 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:08+0800 lvl=..."
Mar 28 14:28:09 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:08+0800 lvl=..."
Mar 28 14:28:09 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:08+0800 lvl=...s
Mar 28 14:28:09 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:09+0800 lvl=...s
Mar 28 14:28:09 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:09+0800 lvl=...e
Mar 28 14:28:09 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:09+0800 lvl=...p
Mar 28 14:28:09 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:09+0800 lvl=..."
Mar 28 14:28:09 localhost.localdomain grafana-server[17041]: t=2020-03-28T14:28:09+0800 lvl=...=
Mar 28 14:28:09 localhost.localdomain systemd[1]: Started Grafana instance.
Hint: Some lines were ellipsized, use -l to show in full.
Grafana 使用
1)访问Grafana
提示:访问的用户名与密码为admin,第一次登录会被要求更改密码
2)Grafana基本配置
1)添加数据源
提示:这里选择Prometheus作为数据源,如果选择的数据源为Zabbix,则需要安装插件
2)查询仪表盘
提示:这里进入官网,直接复制ID即可,当然也可以下载,然后再Grafana中上传JSON文件
3)添加仪表盘
提示:选择添加以后,将刚刚复制的ID粘贴进去即可自动识别