1. 简介

Prometheus: (简称Prom)是由SoundCloud开发的开源监控报警系统。是大名鼎鼎的CNCF云原生基金会下的第二大开源项目。具有如下特点:

  • 使用Go语言开发
  • 内置时序数据库
  • 性能足够支撑上万台规模的集群
  • 多维度数据模型,灵活的查询语言
  • 通过HTTP的pull方式采集时序数据
  • 可以通过中间网关进行时序列数据推送
  • 服务发现或者静态配置来发现被监控对象
  • 支持多种多样的图表和界面展示,比如Grafana等

架构图

工作流程

  1. Prometheus Server通过http协议周期性的pull被监控对象的metrics,然后保存在本地的TSDB(时序数据库)中。
  2. Prometheus Server判断监控数据是否触发告警,如果触发,将告警发送给Alertmanager。
  3. Alertmanager处理告警,并通过邮件等方式进行通知。
  4. Prometheus监控数据也可以通过Grafana等可视化工具进行展示。

2. Prometheus环境搭建

注:本文测试环境为单机环境,IP需要修改为自己对应的地址

涉及到的主要组件(括号内表示搭建环境使用的docker镜像),如下:

  • Prometheus Server( prom/prometheus:v2.7.2)
  • 被监控对象exporter(prom/node-exporter,输出被监控对象信息的http接口,我们叫做exporter)
  • 数据上报网关pushgateway (prom/pushgateway)
  • Alertmanager(prom/alertmanager,告警系统)
  • Grafana (grafana/grafana, 数据可视化工具)

2.1 安装Prometheus Server

主要涉及到两个配置文件和一个服务:

  • prometheus.yml #主配置文件
  • rules.yml #告警规则配置文件
  • prom/prometheus #包含Prometheus Server可执行程序的docker镜像

2.1.1 主配置文件prometheus.yml

global:
scrape_interval: 15s #默认采集监控数据时间间隔
external_labels:
monitor: 'my-monitor'
scrape_configs: #监控对象设置
- job_name: prometheus #任务名称
scrape_interval: 5s #每隔5s获取一次监控数据
static_configs: #监控对象地址
- targets: ['127.0.0.1:9090'] # 将自己加入到监控对象中

2.1.2 告警规则配置文件rules.yml

    # 此处暂时不设置,后面Alertmanager章节具体介绍

2.1.3 启动prometheus服务

docker run --name=prometheus -d \ #设置容器启动名称
-p 9090:9090 \ #暴露prometheus服务端口
-v 本地绝对路径/prometheus.yml:/etc/prometheus/prometheus.yml \ #挂载本地prometheus.yaml
-v 本地绝对路径/rules.yml:/etc/prometheus/rules.yml \ #挂载本地rules.yml
prom/prometheus:v2.7.2 \ #prometheus容器镜像
--config.file=/etc/prometheus/prometheus.yml \ #设置prometheus服务使用的配置文件
--web.enable-lifecycle #启动prometheus远程热加载配置文件,方式:curl -X POST http://localhost:9090/-/reload

打开浏览器,访问http://127.0.0.1:9090/, 如果显示如下界面,说明prometheus启动成功

访问http://127.0.0.1:9090/metrics,可以查看采集的metrics指标

2.2 通过node exporter提供metrics

2.2.1 启动node exporter

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

2.2.2 修改prometheus.yml文件

将监控对象加入到监控任务中,如下

global:
scrape_interval: 15s
external_labels:
monitor: 'my-monitor'
scrape_configs:
- job_name: prometheus
scrape_interval: 5s
static_configs:
- targets: ['127.0.0.1:9090']
- targets: ['127.0.0.1:9100'] # 配置node-exporter,用于监控主机cpu、内存使用和磁盘等
labels:
group: 'client-node-exporter'

2.2.3 查看监控信息

首先,重新加载prometheus配置文件,使用如下方式

curl -X POST http://localhost:9090/-/reload #启动prometheus的时候,必须带web.enable-lifecycle参数

打开浏览器,访问http://127.0.0.1:9090/targets

可以看到,刚才配置的node-exporter已经成功加入到prometheus的targets中。点击该targert(红线链接),可以看到主机cpu监控数据已经可以正常采集:

2.2 安装pushgateway

Prometheus采集数据是用的pull方式,prometheus配置文件设置的5秒就是采集数据的频率。但是有些数据并不适合采用这样的方式,对这样的数据可以使用Push Gateway服务。PushGateway比较适合临时作业和批处理作业,由于这些作业是short-lived的,如果采用pull的模式,可能在prometheus采集之前,作业已经执行结束。pushgateway相当于一个暂存器,这些临时作业将metrics数据缓存到pushgateway中,然后等待Prometheus来pull数据。

2.2.1 启动pushgateway

pushgateway是一个单独的服务,启动如下:

docker run -d -p 9091:9091 --name pushgateway prom/pushgateway

访问浏览器http://localhost:9091/#, 可以看到pushgateway已经成功启动

2.2.2 pushgateway推送数据

pushgateway支持多种语言的sdk推送数据,下面以shell为例:

  • 推送一个指标
echo "exam_metric 100" | curl --data-binary @- http://127.0.0.1:9091/metrics/job/exam
  • 一次推送多个指标
cat <<EOF | curl --data-binary @- http://127.0.0.1:9091/metrics/job/exam/instance/test
# 语数外考试成绩
chinese 120
math 150
english 140
EOF

打开浏览器,访问http://localhost:9091/#, 可以看到我们刚才已经成功推送数据到pushgateway。

2.2.3 将pushgateway配置到prometheus中

修改prometheus.yml文件,配置pushgateway如下:

global:
scrape_interval: 15s
external_labels:
monitor: 'my-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: 'client-node-exporter'
- targets: ['127.0.0.1:9091'] # 配置pushgateway地址
labels:
group: 'pushgateway'

打开浏览器,访问prometheus,通过搜索框,我们搜索从pushgateway获取的数据,如下:

可以看到成功获取pushgateway数据chinese 120

2.3 告警管理Alertmanager

Prometheus的告警机制由两部分组成:

  • Prometheus根据告警规则,将告警发送给Alertmanager
  • Alertmanager管理告警,包括silencing,inhibition和aggregation;并通过邮件等方式进行外部通知

2.3.1 配置和启动Alertmanager

本地创建Alertmanager配置文件alertmanager.yml,内容如下:

global:
resolve_timeout: 5m
route:
group_by: ['exam'] #与prometheus配置文件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/exam/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 本地绝对路径/alertmanager.yml:/etc/alertmanager/alertmanager.yml \ #挂载本地alertmanager配置文件
prom/alertmanager

打开浏览器,访问http://127.0.0.1:9093, 显示如下:

设置prometheus告警规则

编辑rules.yml配置文件,添加如下信息:

groups:
- name: exam
rules:
- alert: exam告警测试
expr: chinese > 100 #语文成绩大于100告警,注:我们在pushgateway推送数据的时候,设置的是120,因此会触发告警
for: 1m
labels:
status: warning
annotations:
summary: "{{$labels.instance}}:语文成绩优秀! nb了!!!"
description: "{{$labels.instance}}: 语文成绩优秀! nbnbnb!!!"

编辑prometheus.yml配置文件,添加alertmanager配置和rules.yml文件,如下:

global:
scrape_interval: 15s
external_labels:
monitor: 'my-monitor'
rule_files:
- /etc/prometheus/rules.yml #告警规则文件路径,注:此文件在启动prometheus容器时,作为volumes挂载到了/etc/prometheus下
scrape_configs:
- job_name: prometheus
scrape_interval: 5s
static_configs:
- targets: ['127.0.0.1:9090']
- targets: ['127.0.0.1:9100']
labels:
group: 'client-node-exporter'
alerting: #告警管理器设置
alertmanagers:
- static_configs:
- targets: ['127.0.0.1:9093'] #配置Alertmanager地址,告警信息会发送给alertmanager进一步处理

重新加载prometheus配置文件curl -X POST http://localhost:9090/-/reload, 然后打开浏览器,访问http://127.0.0.1:9093/#/alerts,然后点击图中的Info,会弹出具体的告警提示信息,info上面也会提示有1个alert信息。

注:打开页面可能需要等一会才有alert信息推送

告警通知处理

由于我们在alertmanager.yml中配置的告警receiver时web.hook方式,推送地址为http://127.0.0.1:8080/exam/test, 下面我们模拟个web.hook服务,来接收告警信息。

我们使用golang代码来编写web.hook,文件名为main.go, 代码如下:

package main

import (
"fmt"
"io/ioutil"
"github.com/gin-gonic/gin"
) func main() {
r := gin.Default()
r.POST("/exam/test", func(c *gin.Context) {
res, _ := ioutil.ReadAll(c.Request.Body)
fmt.Println(string(res)) //这里我们只简单打印告警信息
c.JSON(200, gin.H{
"message": "alert message",
})
})
r.Run(":8080")
}

启动web服务, 等待接收Alertmanager发送过来的告警信息。控制台会输出类似如下信息:

$ go run main.go

[GIN] 2020/01/20 - 14:01:05 | 200 |     228.075µs |   127.0.0.1 | POST     /exam/test
{"receiver":"web\\.hook","status":"firing","alerts":[{"status":"firing","labels":{"alertname":"exam告警测试","exported_instance":"test","exported_job":"exam","group":"pushgateway","instance":"127.0.0.1:9091","job":"prometheus","monitor":"my-monitor","status":"warning"},"annotations":{"description":"127.0.0.1:9091: 语文成绩优秀! nbnbnb!!!","summary":"127.0.0.1:9091:语文成绩优秀! nb了!!!"},"startsAt":"2020-01-20T05:46:40.339966325Z","endsAt":"0001-01-01T00:00:00Z","generatorURL":"http://caf2be9d9d5d:9090/graph?g0.expr=chinese+%3E+100\u0026g0.tab=1","fingerprint":"00936ad48d797b28"}],"groupLabels":{},"commonLabels":{"alertname":"exam告警测试","exported_instance":"test","exported_job":"exam","group":"pushgateway","instance":"127.0.0.1:9091","job":"prometheus","monitor":"my-monitor","status":"warning"},"commonAnnotations":{"description":"127.0.0.1:9091: 语文成绩优秀! nbnbnb!!!","summary":"127.0.0.1:9091:语文成绩优秀! nb了!!!"},"externalURL":"http://288d9ac3b9d7:9093","version":"4","groupKey":"{}:{}"} [GIN] 2020/01/20 - 14:02:05 | 200 | 190.27µs | 192.168.71.92 | POST /exam/test

Prometheus监控系统之入门篇(一)的更多相关文章

  1. Prometheus监控系统之入门篇(一)续

    在上篇Prometheus监控系统之入门篇(一)中我们讲解了Prometheus的基本架构和工作流程, 并从0到1搭建了Prometheus服务,pushgateway以及告警系统. 本篇我们主要介绍 ...

  2. 容器编排系统K8s之Prometheus监控系统+Grafana部署

    前文我们聊到了k8s的apiservice资源结合自定义apiserver扩展原生apiserver功能的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/ ...

  3. prometheus监控系统

    关于Prometheus Prometheus是一套开源的监控系统,它将所有信息都存储为时间序列数据:因此实现一种Profiling监控方式,实时分析系统运行的状态.执行时间.调用次数等,以找到系统的 ...

  4. Prometheus监控教程——从入门到放弃

    Prometheus的安装还是比较简单的 下载地址如下 https://prometheus.io/download/ 解压,修改配置,运行.默认监听9090端口 [root@localhost ~] ...

  5. Grafana+Zabbix+Prometheus 监控系统

    环境说明 软件 版本 操作系统 IP地址 Grafana 5.4.3-1 Centos7.5 192.168.18.231 Prometheus 2.6.1 Centos7.5 192.168.18. ...

  6. Prometheus监控神器-服务发现篇(二)

    本章节讲解服务发现与Relabelling的机制与范例. 通过服务发现的方式,我们可以在不重启Prometheus服务的情况下动态的发现需要监控的Target实例信息. 如上图所示,对于线上环境我们可 ...

  7. Prometheus监控神器-Alertmanager篇(1)

    本章节主要涵盖了Alertmanager的工作机制与配置文件的比较详细的知识内容,由浅入深的给大家讲解. 警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的.警 ...

  8. Prometheus监控神器-Rules篇

    本章主要对如何使用Prometheus与Alertmanager组件集成配置,以及对警报规则 Rules 的俩种类型及其模板内容进行讲解. 与Alertmanager集成 Prometheus把产生的 ...

  9. 使用Docker部署监控系统,Prometheus,Grafana,监控服务器信息及Mysql

    使用Docker部署监控系统,Prometheus,Grafana,监控服务器信息及Mysql 一.docker部署prometheus监控系统 1.1 配置安装环境 1.1.1 安装promethe ...

随机推荐

  1. HDFS 中文件操作的错误集锦

    问题1  Java ApI执行追加写入时:无法写入 问题描述: ①当前数据节点无法写入,②追加文件需要再次请求. 问题2  命令行执行追加写入时:无法写入 问题描述: 当前数据节点无法写入 问题3   ...

  2. 面向对象-接口(interface)实战案例

    面向对象-接口(interface)实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口(interface)概述 1>.接口的语法格式 接口时抽象类的一种特殊体 ...

  3. [Mathematics][MIT 18.03] Detailed Explanation of the Frequency Problems in Second-Order Differential Equation of Oscillation System

    Well, to begin with, I'd like to say thank you to MIT open courses twice. It's their generosity that ...

  4. Transaction Managament(事务管理二、Spring事务)

    Transaction Managament(事务管理二.Spring事务) Spring事务框架的优势 ​ Spring事务框架将开放过程中事务管理相关的关注点进行了分离,对这些关注点进行了抽象分离 ...

  5. Django中使用ORM

    一.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数 ...

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习:函数

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Callable、Future、线程池简单使用

    Callable.Future与线程池 在创建新线程的三种方式中,继承Thread和实现Runnable接口两种方式都都没有返回值,因此当我们想要获取子线程计算结果时只能设置共享数据,同时还需要考虑同 ...

  8. Linux-课后练习(第二章命令)20200217-1

  9. kube-controller-manager配置详解

    KUBE_MASTER="--master=http://10.83.52.137:8080" KUBE_CONTROLLER_MANAGER_ARGS=" "

  10. 在VS中编写Qt5涉及到的一点字符串问题

    在VS中开发Qt5程序似乎成了我的一种习惯,因为觉得VS简直不能再溜了,不愧是"宇宙第一IDE". 所以在开发中难免会遇到中文显示乱码的问题,网上找到的很多方法都是类似于下面这样的 ...