一:前言

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

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

以前我们用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. kvm的命令简单使用

    virsh命令常用参数总结   参数 参数说明 基础操作 list 查看虚拟机列表,列出域 start 启动虚拟机,开始一个(以前定义的)非活跃的域 shutdown 关闭虚拟机,关闭一个域 dest ...

  2. INSERT INTO语句的基本用法

    原文链接:https://www.cnblogs.com/mingmingming/p/11295200.html 一.INSERT INTO语句的基本用法 INSERT INTO 语句用于往表中插入 ...

  3. docker-mcr 助您全速下载 dotnet 镜像

    2018 年五月之后,微软将后续发布的所有 docker image 都推送到了 MCR (Miscrosoft Container Registry),但在中国大陆,它的速度实在是令人发指,本文将介 ...

  4. MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字

    MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字 stdafx.h文件中添加:#include "afxsock.h" BOOL CMFC_TCP_Client_c ...

  5. C/C++以及Linux文件操作备忘录

    目录 C文件操作 文件开关 文件读写 C++文件操作 Linux文件操作 打开 C文件操作 #include<stdio.h> stdin, stdout, stderr 文件开关 /* ...

  6. 网络框架OKHTTP使用场景全解析

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 一.引言 说句实 ...

  7. CCNA-Part1:网络基础概念

    由于身处一家网络公司,日常项目中设计到的网络概念较多,恰逢之后公司组织相关培训.借此机会,打算写下一系列文章用于之后梳理并回顾.文章主要涉及 NA,NP 中所覆盖的知识.由于网络分为较多方向,如路由交 ...

  8. Docker(一)Docker概述

    Docker概述 概述 Docker是供开发人员和系统管理员 使用容器构建,运行和共享应用程序的平台.使用容器来部署应用程序称为容器化.容器不是新的,但用于轻松部署应用程序的容器却是新的. 容器化越来 ...

  9. -手写Spring注解版本&事务传播行为

    视频参考C:\Users\Administrator\Desktop\蚂蚁3期\[www.zxit8.com] 0018-(每特教育&每特学院&蚂蚁课堂)-3期-源码分析-手写Spri ...

  10. Mongodb 批量更新

    >db.col.update({查询条件},{修改条件},{multi:true})