一:前言

一个服务上线了后,你想知道这个服务是否可用,需要监控。假如线上出故障了,你要先于顾客感知错误,你需要监控。还有对数据库,服务器的监控,等等各层面的监控。

近年来,微服务架构的流行,服务数越来越多,监控指标变得越来越多,所以监控也变得越来越复杂,需要新的监控系统适应这种变化。

以前我们用zabbix,StatsD监控,但是随着容器化,微服务的流行,我们需要新的监控系统来适应这种变化。于是监控项目Prometheus就应运而生。

二:Prometheus介绍

介绍

Prometheus是一款基于时序数据库的开源监控告警系统,它是SoundCloud公司开源的,SoundCloud的服务架构是微服务架构,他们开发了很多微服务,由于服务太多,传统的监控已经无法满足它的监控需求,于是他们在2012就着手开发新的监控系统。Prometheus的原作者Matt T. Proud在2012年加入SoundCloud公司,他之前服务于Google公司,他从google的监控系统Borgmon中获取灵感,与另外一名工程师Julius Volz合作开发了开源监控系统Prometheus。(总之感觉是因为有了这个前google工程师到来,才有能力开发了Prometheus)。后来其他开发人员陆续加入了这个项目,并在 SoundCloud 内部继续开发,最终于 2015 年 1 月将其发布。后来在2016年,SoundCloud把它捐献给了云原生基金会(Cloud Native Computing Foundation),在它下面继续孵化。

Prometheus是用go语言开发。它的很多理念跟google的SRE不谋而合。所以有时间,可以去看看google SRE那本书,可以更好的理解Prometheus。

主要特性(功能)

  • 多维数据模型(时序由 metric 名字和 k/v 的labels构成)
  • 灵活的查询语言(PromQL
  • 无依赖的分布式存储;单节点服务器都是自治的
  • 采用 http 协议,使用pull模式拉取数据,简单易懂
  • 监控目标,可以采用服务发现和静态配置方式
  • 支持多种统计数据模型和界面展示。可以和Grafana结合展示。

三:Prometheus架构原理

架构

来自官方的一张架构图

图片来自: https://prometheus.io/docs/introduction/overview/

主要模块

  • the main Prometheus Server,主要用于抓取数据和存储时序数据,另外还提供查询和 Alert Rule 配置管理。就是数据的采集和存储,用PromQL查询,报警配置。
  • client libraries,用于对接Prometheus Server,用于对接Prometheus Server,可以查询和上报数据。
  • a push gateway,用于批量,短期的监控数据的汇报总节点,主要用于业务数据汇报等。
  • 各种汇报数据的 exporters,例如汇报机器数据的node_exporter,汇报MondogDB信息的 MongoDB_exporter 等等。
  • 用于高级通知管理的 alertmanager
  • 各种各样的支持工具

怎么采集监控数据

要采集目标的监控数据,首先就要在被采集目标地方安装采集组件,这种采集组件被称为Exporter。prometheus.io官网上有很多这种exporter,官方 exporter列表

采集完了怎么传输到Prometheus?

采集了数据,要传输给prometheus。怎么做?

Exporter 会暴露一个HTTP接口,prometheus通过Pull模式的方式来拉取数据,会通过HTTP协议周期性抓取被监控的组件数据。

不过prometheus也提供了一种方式来支持Push模式,你可以将数据推送到Push Gateway,prometheus通过pull的方式从Push Gateway获取数据。

主要流程

  1. Prometheus server定期从静态配置的 targets 或者服务发现的 targets 拉取数据(zookeeper,consul,DNS SRV Lookup等方式)
  2. 当新拉取的数据大于配置内存缓存区的时候,Prometheus会将数据持久化到磁盘,也可以远程持久化到云端。
  3. Prometheus通过PromQL、API、Console和其他可视化组件展示数据。Prometheus支持很多方式图表可视化,比如Grafana,自带的Promdash。它还提供HTTP API的查询方式,自定义输出。
  4. Prometheus 可以配置rules,然后定时查询数据,当条件触发的时候,会将alert推送到配置的Alertmanager。
  5. Alertmanager收到告警的时候,会根据配置,聚合,去重,降噪,最后发出警告。

四:安装Prometheus

要整好prometheus监控系统,还是有很多软件需要安装。

安装的主要组件如下:

  • Prometheus Server
  • 被监控对象exporter组件
  • 数据可视化工具 Grafana
  • 数据上报网关 push gateway
  • 告警系统 Alertmanager

第1种:直接安装

到官网下载最新版的Prometheus,下载地址

因为它是用go开发的,可以做到开箱即用。

wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz

解压:

tar xvfz prometheus-2.19.2.linux-amd64.tar.gz

运行启动:

cd ./prometheus-2.19.2.linux-amd64

./prometheus --version

./prometheus --config.file=prometheus.yml

第2种:docker镜像安装

  1. 先在本机 /etc/docker/prometheus/ 下创建一个配置文件 vim prometheus.yml
global:
scrape_interval: 15s
external_labels:
monitor: 'first-monitor'
scrape_configs:
- job_name: prometheus
scrape_interval: 5s
static_configs:
- targets: ['127.0.0.1:9090']

官方有一个模板:documentation/examples/prometheus.yml

配置参数可以参考这里: configuration,选择你安装版本所对应的配置信息。

  1. 执行下面docker命令:
提示:请提前安装好docker。

docker run --name=prometheus -d -p 9090:9090 -v /etc/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

上面的命令看起来有点不容易理解,重新排列格式后:

docker run --name=prometheus -d -p 9090:9090 \

-v /etc/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \

prom/prometheus

说明:

  • -p 9090:9090,用这个接口可以查看promethdus的web界面
  • -v /etc/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

    ,将服务器本地的prometheus配置文件挂载到docker目录 /etc/prometheus/ 下,这个就是prometheus在容器中默认加载配置文件位置。 -v 参数就是将本地的配置文件挂载到docker里面。

用上面的命令安装完后,会出来一个很长的id信息:

# docker run --name=prometheus -d -p 9090:9090 -v /etc/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

cddca15bad0eea0c249cb4a5dfe1a148d7779a00b0dd514c654c5cddce4e951d

可以用 docker inspect + id 前面部分信息 这样的命令来查看容器运行时默认配置参数有哪些,这个信息内容很长,截取需要的部分来看:

# docker inspect cddc

[

{

"Id": "cddca15bad0eea0c249cb4a5dfe1a148d7779a00b0dd514c654c5cddce4e951d",

"Created": "2020-07-04T10:10:33.792265269Z",

"Path": "/bin/prometheus",

"Args": [

"--config.file=/etc/prometheus/prometheus.yml",

"--storage.tsdb.path=/prometheus",

"--web.console.libraries=/usr/share/prometheus/console_libraries",

"--web.console.templates=/usr/share/prometheus/consoles"

],

"State": {

"Status": "running",

"Running": true,

"Paused": false,

"Restarting": false,

"OOMKilled": false,

"Dead": false,

"Pid": 18313,

"ExitCode": 0,

"Error": "",

"StartedAt": "2020-07-04T10:10:34.13215448Z",

"FinishedAt": "0001-01-01T00:00:00Z"

},

"Image": "sha256:9f345bfa8fefdd9580d5bd951a99e105af38d6047878c4bfb7c5c0250f77998e",

"ResolvConfPath": "/var/lib/docker/containers/cddca15bad0eea0c249cb4a5dfe1a148d7779a00b0dd514c654c5cddce4e951d/resolv.conf",

"HostnamePath": "/var/lib/docker/containers/cddca15bad0eea0c249cb4a5dfe1a148d7779a00b0dd514c654c5cddce4e951d/hostname",

"HostsPath": "/var/lib/docker/containers/cddca15bad0eea0c249cb4a5dfe1a148d7779a00b0dd514c654c5cddce4e951d/hosts",

可以看到上面的Args就是默认配置文件位置

配置文件

prometheus主要涉及2个配置文件

  • prometheus.yml , 主配置文件,四大块:global,alerting,rule_files,scrape_config
  • rules.yml , 告警规则配置文件

你可能会问,上面没有看到rules.yml这个文件?是的上面没有加。可以用这个命令加上:

-v /etc/docker/prometheus/rules.yml:/etc/prometheus/rules.yml

其实跟加上promethdus.yml命令是一样的。

配置参数项以及说明可以参考这里: configuration,选择你安装版本所对应的配置信息。

配置说明:

global:
scrape_interval: 15s #默认采集监控数据时间间隔
external_labels:
monitor: 'first-monitor' scrape_configs: #监控对象设置
- job_name: prometheus #任务名称
scrape_interval: 5s #每隔5s获取一次监控数据
static_configs: #监控对象地址
- targets: ['127.0.0.1:9090'] - job_name: server-redis # 还可以加其他监控对象
static_configs:
- targets: ['192.168.10.20:9100']
labels: # 标签
instance: server-redis

查看web界面

在浏览器上输入 http://127.0.0.1:9090/ , 如果显示下面的web界面,说明promethdus启动成功:

五:Exporter采集监控信息

前面已经讲过,如果要监控服务器或者应用程序的各种信息,比如cpu、内存、网卡流量等等。就要在监控目标上安装指标收集程序,并暴露HTTP接口供Prometheus拉取数据,这个指标收集程序就是Exporter。不同的指标需要不同的Exporter收集。

这种Exporter需要自己写吗?

一般不需要,官网上已经有大量的Exporter,上面我们已经列出过官网的Exporter清单 地址。

而且有的软件已经集成了Prometheus的Exporter,也就是说软件本身就提供了Prometheus需要的各种指标数据。最典型的就是k8s,他们是云原生基金会的第一和第二个项目。

如果需要特殊的监控,可能就要你自己写Exporter了。

实例: node-exporter监控服务器

上面prometheus已经安装好了,现在来安装一个Exporter监控实例。

来安装一个监控服务器主机cpu、内存和磁盘等信息的exporter,直接用node-exporter。它主要用于收集类 UNIX 系统的信息。

步骤:

1.先修改prometheus.yml信息,

global:
scrape_interval: 15s
external_labels:
monitor: 'first-monitor'
scrape_configs:
- job_name: prometheus
scrape_interval: 5s
static_configs:
- targets: ['127.0.0.1:9090']
- targets: ['127.0.0.1:9100'] # 这里开始增加的监控信息
labels:
group: 'local-node-exporter'

2.用docker安装并启动node-exporter:

docker run -d --name=node-exporter -p 9100:9100 prom/node-exporter

3.然后重启docker prometheus,让刚才修改的配置生效:

docker restart prometheus

4.在浏览器上直接输入: http://127.0.0.1:9090/targets。或者,你在界面上点击 Status 菜单 -> Targets 菜单,来浏览metrics信息。

如果你是在服务器上安装,那么这里的 127.0.0.1 就是服务器IP地址,或者域名。

浏览器输出的web界面如下:(我用的远程服务器测试,所以用了ip)

可以看到里面有一个 9100 端口的 metrics 连接,点进去后,就可以看到一些采集信息。

说明刚才配置的node-exporter已经加入到prometheus的targets中了。如下图:

查看监控信息

点击web界面最上面的菜单 Graph

选择下面的 Graph,然后我们选择一个 node_memory_Active_bytes 来看一看,

然后点击 Execute 按钮 , 就会出来如下图所示图形:

六:可视化系统:Grafana

上面我们通过Prometheus自带的UI,查看不同指标视图,但是它的功能很简单。如果需要强大的展示系统,能定制不同指标的面板,支持不同类型的展示方式,如曲线图、热点图,TopN等,那么grafana比较合适。它可以对promethdus数据进行可视化的展示。

grafana是一个大型可视化系统,功能强大,可以创建自己的自定义面板,支持多种数据来源,

比如:OpenTSDB、Elasticsearch、Prometheus 等,可以到官网去查看支持的数据源种类,而且它插件也很多。

安装

官网安装文档,它有不同平台安装的Doc。

我选择最简单的一种,直接用docker安装,命令如下:

docker run -d -p 3000:3000 --name=grafana grafana/grafana

Docker安装完后,最后会出来一些提示信息:

... ...

Digest:sha256:0e8b556a7fc9b95c03669509ec50be19c16b82b9e9078f79fa35a71f484bc047

Status: Downloaded newer image for docker.io/grafana/grafana:latest 97d1c768ce6c541fa58790ec97fd06783633833cd9e74b12c16266dd264f8d0f

说明安装成功了。我们在浏览器上看看界面,输入下面地址:

http://127.0.0.1:3000/login

然后输入初始密码 admin/admin 登录进入。

我安装的版本是:Grafana v7.0.5

grafana设置

增加prometheus数据源并展示

1.点击如下图的Data Source:

2.点击 Add data source 按钮后,出来下面界面:

3.鼠标移到 Prometheus 上,点击 Select 按钮:

4.prometheus相关设置:

最主要设置获取数据的HTTP URL。

5.点击 save&test 按钮,它会提示你是否设置成功。

6.设置Dashboards

7.回到home

8:点击 prometheus

9:出来很多图表展示

其他dashboard模板设置

grafana不仅有我们上面设置的那些图表模板,它还有其他很多模板,我们也可以设置。

官方模板dashboard 地址

比如我们查找node exportet的模板,https://grafana.com/grafana/dashboards?search=node%20exporter,有一个模板 downloads 比较多,

它的地址为:

https://grafana.com/grafana/dashboards/8919

我们在grafana上来设置这个dashboard,import进来:

可以填写id和url,我们填写id,为 8919:

点击 load 出来下面界面:

然后选择prometheus-1,点击 import, 出来如下图的界面:

七、告警通知

我们已经能够对收集的数据,通过grafana展示出来了,能查看数据。想一想,系统还缺失什么功能?

监控最重要的目的是什么?

  • 第一:监控系统是否正常
  • 第二:系统不正常时,可以告知相关人员及时的排查和解除问题,这就是告警通知

所以,还缺一个告警通知的模块。

prometheus的告警机制由2部分组成:

  1. 告警规则

    prometheus会根据告警规则rule_files,将告警发送给Alertmanager
  2. 管理告警和通知

    模块是Alertmanager。它负责管理告警,去除重复的数据,告警通知。通知方式有很多如Email、HipChat、Slack、WebHook等等。

配置

1.告警规则配置

告警文档地址:告警规则官方文档

我们新创建一个规则文件:alert_rules.yml,把它和prometheus.yml放在一起,官方有一个模板 Templating,直接copy过来:

groups:
- name: example
rules: # Alert for any instance that is unreachable for >5 minutes.
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes." # Alert for any instance that has a median request latency >1s.
- alert: APIHighRequestLatency
expr: api_http_request_latencies_second{quantile="0.5"} > 1
for: 10m
annotations:
summary: "High request latency on {{ $labels.instance }}"
description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

上面规则文件大意:就是创建了2条alert规则 alert: InstanceDownalert: APIHighRequestLatency

  • InstanceDown 就是实例宕机(up==0)触发告警,5分钟后告警(for: 5m);
  • APIHighRequestLatency 表示有一半的 API 请求延迟大于 1s 时(api_http_request_latencies_second{quantile="0.5"} > 1)触发告警

更多rules规则说明,请看这里 recording_rules

然后把alrt_rules.yml添加到prometheus.yml 里:

我们要把alert_rules.yml规则映射到docker里:

先用docker ps查看prometheus容器ID, CONTAINER ID: ac99a89d2db6, 停掉容器 docker stop ac99,然后删掉这个容器 docker rm ac99

重新启动容器:

docker run --name=prometheus -d -p 9090:9090 -v /etc/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/docker/prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml prom/prometheus

启动时主要添加这个参数:-v /etc/docker/prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml

然后在浏览器上查看,rules是否添加成功,在浏览器上输入地址 http://127.0.0.1:9090/rules

也可以查看alers情况,点击菜单 Alerts:

告警通知配置

alertmanager配置:

官方配置文档,官方配置例子

在上面我们可以看到alerts页面的告警信息,但是怎么通知到研发和业务相关人员呢?这个就是由Alertmanager完成,先配置alertmanager文件 alertmanager.yml,:

global:
resolve_timeout: 5m
route:
group_by: ['example'] #与prometheus配置文件alert_rules.yml中配置规则名对应
group_wait: 10s #报警等待时间
group_interval: 10s #报警间隔时间
repeat_interval: 1m #重复报警间隔时间
receiver: 'web.hook' #告警处理方式,我们这里通过web.hook方式,也可以配置成邮件等方式
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:8080/example/test' #告警web.hook地址,告警信息会post到该地址,需要编写服务接收该告警数据
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning' #目标告警状态
equal: ['alertname', 'dev', 'instance']

启动alertmanager服务:

docker run -d -p 9093:9093 --name alertmanager -v /etc/docker/prometheus/alertmanager.yml:/etc/prometheus/alertmanager.yml prom/alertmanager

在浏览器上输入 : http://127.0.0.1:9093,出现下面界面:

prometheus配置:

在promethdus加上下面的配置,

alerting:
alertmanagers:
- static_configs:
- targets: ['127.0.0.1:9093']

配置说明:告诉prometheus,放生告警时,将告警信息发送到Alertmanager,Alertmanager地址为 http://127.0.0.1:9093

先docker rm 删除掉原来容器,在运行:

docker run --name=prometheus -d -p 9090:9090 -v /etc/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/docker/prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml prom/prometheus

再次运行http://127.0.0.1:9093,正常说明配置成功

八:参考链接

[完]

图文详解Prometheus监控+Grafana+Alertmanager告警安装使用的更多相关文章

  1. 图文详解压力测试工具JMeter的安装与使用

    压力测试是目前大型网站系统的设计和开发中不可或缺的环节,通常会和容量预估等工作结合在一起,穿插在系统开发的不同方案.压力测试可以帮助我们及时发现系统的性能短板和瓶颈问题,在这个基础在上再进行针对性的性 ...

  2. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-7主节点CM安装子节点Agent配置

    主节点安装cloudera manager 准备工作:下载CM和mysql连接驱动包: CM各版本下载地址:http://archive.cloudera.com/cm5/cm/5/ 从里面选择:ht ...

  3. 基于CentOS6.5下snort+barnyard2+base的入侵检测系统的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...

  4. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-总目录

    CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-总目录: 0.Windows 10本机下载Xshell,以方便往Linux主机上上传大文件 1.CentOS7+CDH5.14.0安 ...

  5. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

  6. 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cm ...

  7. 全网最详细的Windows系统里Oracle 11g R2 Database服务器端(64bit)的下载与安装(图文详解)

    不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...

  8. Windows环境下执行hadoop命令出现Error: JAVA_HOME is incorrectly set Please update D:\SoftWare\hadoop-2.6.0\conf\hadoop-env.cmd错误的解决办法(图文详解)

    不多说,直接上干货! 导读   win下安装hadoop 大家,别小看win下的安装大数据组件和使用  玩过dubbo和disconf的朋友们,都知道,在win下安装zookeeper是经常的事   ...

  9. Elasticsearch-2.4.3的单节点安装(多种方式图文详解)

    前提: Elasticsearch-2.4.3的下载(图文详解) 1.新建es安装目录 [root@djt002 local]# mkdir elasticsearch [root@djt002 lo ...

随机推荐

  1. 运行npm run start 提示primordials is not defined

    下载https://github.com/ant-motion/editor-list 执行 npm install npm start gulp构建时报错. 原因:安装gulp版本与node版本不兼 ...

  2. 温故知新-多线程-深入刨析synchronized

    Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章目录 摘要 synchroniz ...

  3. 面试官:换人!他连 TCP 这几个参数都不懂

    每日一句英语学习,每天进步一点点: 前言 TCP 性能的提升不仅考察 TCP 的理论知识,还考察了对于操心系统提供的内核参数的理解与应用. TCP 协议是由操作系统实现,所以操作系统提供了不少调节 T ...

  4. js数组的常见操作( push、pop、unshift、shift、splice、concat、 join)的用法

    1.数组添加删除 头部或尾部( push().pop().unshift().shift() ) 例2.数组尾部添加 push()方法可向数组的末尾添加一个或多个元素,并返回新的长度 语法:array ...

  5. layui 通过laytpl模板,以及laypage分页实现

    一.引用js依赖 jquery-1.11.3.min.js , layui.all.js, json2.js 二.js分页方法封装(分页使用模板laytpl) 1.模板渲染 /**  * 分页模板的渲 ...

  6. Jmeter使用beanshell对数据进行加密传输

    首先,来看一下接口签名加密规则 1.需要参于签名的参数: a. 在请求参数列表中,除去 cliSign 参数外,其他需要使用到的参数皆是要签名的参数. 2.生成签名字符串 a. 没有值的参数无需传递, ...

  7. maven项目快速搭建SSM框架(一)创建maven项目,SSM框架整合,Spring+Springmvc+Mybatis

    首先了解服务器开发的三层架构,分配相应的任务,这样就能明确目标,根据相应的需求去编写相应的操作. 服务器开发,大致分为三层,分别是: 表现层 业务层 持久层 我们用到的框架分别是Spring+Spri ...

  8. charles 破解方法

    1.https://www.charlesproxy.com/latest-release/download.do 官网下载charles 2.傻瓜式安装完成(路径可以默认c盘) 3.安装完成后去c盘 ...

  9. 【JMeter_16】JMeter逻辑控制器__随机控制器<Random Controller>

    随机控制器<Random Controller> 业务逻辑: 当每次执行到该逻辑控制器时,随机挑选控制器下的任意一个子节点<取样器.逻辑控制器> Ignore sub-cont ...

  10. cb52a_c++_STL_堆排序算法make_push_pop_sort_heap

    cb52a_c++_STL_堆排序算法make_push_pop_sort_heapheapsort堆排序算法make_heap()-特殊的二叉树,每一个节点都比根小,根就是最大的数.大根堆,也可以做 ...