赞
踩
目录
七、使用 Prometheus + Grafana 实现可视化界面
zabbix是传统的监控系统,出现比云原生早,使用的是SQL关系型数据库;而Prometheus基于谷歌的borgemon使用go语言开发,使用TSDB数据库,所以支持云原生。zabbix最新发布的6.0版本,知道自己处于生死存亡时刻,也支持了Prometheus使用的TSDB数据库。
Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,由 SoundCloud 公司开发,广泛用于云原生环境和容器化应用的监控和性能分析。其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据,当新拉取到的数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。
Prometheus 基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供 HTTP 接口就可以接入监控系统,不需要任何 SDK 或者其他的集成过程。这样做非常适合虚拟化环境比如 VM 或者 Docker 。
Prometheus 应该是为数不多的适合 Docker、Mesos、Kubernetes 环境的监控系统之一。
每个被监控的主机都可以通过专用的 exporter 程序提供输出监控数据的接口,它会在目标处收集监控数据,并暴露出一个HTTP接口供Prometheus server查询,Prometheus通过基于HTTP的pull的方式来周期性的采集数据。
如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到Alertmanager完成告警的汇总和分发
当被监控的目标有主动推送数据的需求时,可以以Pushgateway组件进行接收并临时存储数据,然后等待Prometheus Server完成数据的采集。
任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让Prometheus通过服务发现的机制进行动态管理。
Prometheus 能够直接把API Server作为服务发现系统使用,进而动态发现和监控集群中的所有可被监控的对象。
Prometheus官网地址:https://prometherus.io
Prometheus GitHub地址:https://github.com/prometheus
Prometheus为系统监控提供了强大的工具和功能,支持多维数据分析、动态警报、自动服务发现等特性。
Prometheus使用多维数据模型来表示时间序列数据,每个时间序列都由一个唯一的标识符,包括:指标名称和一组标签标识。由度量名称和键值对标识的时间序列数据。
时间序列数据:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本;服务器指标数据、应用程序性能监控数据、网络数据等都是时序数据
Prometheus支持从各种数据源中采集指标数据,包括应用程序、操作系统、容器、服务发现和云平台等。
Prometheus支持多种指标类型,包括计数器(Counter)、仪表(Gauge)、直方图(Histogram)和摘要(Summary)等数据。
Prometheus提供了PromQL(Prometheus Query Language)查询语言,允许用户灵活地查询和聚合数据。
Prometheus可以设置警报规则,当指标数据达到预设的阈值时,可以触发警报通知。
Prometheus在云原生环境中得到广泛应用,与Kubernetes等容器编排平台集成紧密,能够自动发现和监控容器化应用。
TSDB作为Prometheus的存储引擎完美契合了监控数据的应用场景
- 存储的数据量级十分庞大
- 大部分时间都是写入操作
- 写入操作几乎是顺序添加,大多数时候都以时间排序
- 很少更新数据,大多数情况再数据被采集到数秒或者数分钟后就会被写入数据库
- 删除操作一般为区块删除,选定开始的历史时间并指定后续的区块。很少单独删除某个时间或者分开的随机时间的数据
- 基本数据大,一般超过内存大小。一般选择的知识其一小部分且没有规律,缓存几乎不起任何作用
- 读操作是十分典型的升序或者降序的顺序读
- 高并发的读操作十分常见
对于监控系统而言,大量的监控任务必然导致有大量的数据产生。而 Prometheus 可以高效的处理这些数据。
目前官网提供了多种语言的客户端 SDK,基于这些 SDK 可以快速让应用程序纳入到监控系统中,同时还支持与其它的监控系统集成。
Prometheus 生态系统包含了几个关键的组件:Prometheus server、Pushgateway、Alertmanager、Web UI 等。
收集和储存时间序列数据
服务核心组件,采用pull方式收集监控数据,通过http协议传输。并存储时间序列数据,基于“告警规则”生成告警通知。Prometheus server 由三个部分组成:Retrival,Storage,PromQL
客户端库,目的在于为那些期望原生提供 Instrumentation 功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。
类似一个中转站,Prometheus的server端只会使用pull方式拉取数据,但是某些节点因为某些原因只能使用push方式推送数据,那么它就是用来接收push而来的数据并暴露给Prometheus的server拉取的中转站。可以理解成目标主机可以上报短期任务的数据到Pushgateway,然后Prometheus server 统一从Pushgateway拉取数据。
指标暴露器,负责收集不支持内建Instrumentation的应用程序或服务的性能指标数据,并通过HTTP接口供Prometheus Server获取。用于暴露现有应用程序或服务(不支持Instrumentation)的指标给Prometheus Server。Exporters负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为Prometheus格式的指标向外暴露。
而pro内建了数据样本采集器,可以通过配置文件定义,告诉prometheus到那个监控对象中采集指标数据,prometheus 采集过后,会存储在自己内建的TSDB数据库中,提供了promQL 支持查询和过滤操作,同时支持自定义规则来作为告警规则,持续分析一场指标,一旦发生,通知给alerter来发送告警信息,还支持对接外置的UI工具(grafana)来展示数据
采集、抓取数据是其自身的功能,但一般被抓去的数据一般来自于:
export/instrumentation (指标数据暴露器) 来完成的,或者是应用程序自身内建的测量系统(汽车仪表盘之类的,测量、展示)来完成
常用的 Exporters:
- Node-Exporter:用于收集服务器节点的物理指标状态数据,如平均负载、CPU、内存、磁盘、网络等资源信息的指标数据,需要部署到所有运算节点。
- 指标详细介绍:https://github.com/prometheus/node_exporter
- mysqld-exporter/nginx-exporter
- Kube-State-Metrics:为 Prometheus 采集 K8S 资源数据的 exporter,通过监听 APIServer 收集 kubernetes 集群内资源对象的状态指标数据,例如 pod、deployment、service 等等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计。
- 需要注意的是 kube-state-metrics 只是简单的提供一个 metrics 数据,并不会存储这些指标数据,所以可以使用 Prometheus 来抓取这些数据然后存储, 主要关注的是业务相关的一些元数据,比如 Deployment、Pod、副本状态等;调度了多少个 replicas ?现在可用的有几个?多少个 Pod 是 running/stopped/terminated 状态?Pod 重启了多少次?有多少 job 在运行中。
- cAdvisor:用来监控容器内部使用资源的信息,比如 CPU、内存、网络I/O、磁盘I/O 。
- blackbox-exporter:监控业务容器存活性。
Alertmanager:是一个独立的告警模块,从Prometheus server端接收到“告警通知”后,会进行去重、分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件、钉钉、企业微信等。
Service Discovery:服务发现,用于动态发现待监控的Target,Prometheus支持多种服务发现机制:文件、DNS、Consul、Kubernetes等等。
服务发现可通过第三方提供的接口,Prometheus查询到需要监控的Target列表,然后轮询这些Target 获取监控数据。该组件目前由Prometheus Server内建支持
Grafana:是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。
ps:告警数据采集、告警信息提取、告警通知
可以细化为6层
日志--->如果是哨兵模式--->哨兵共享集群信息,产生的日志--->直接包含的其他节点哨兵信息及mysql信息
用于衡量应用程序代码状态和性能
用于衡量应用程序的价值,如电商业务的销售量,ops、dau日活、转化率等,
业务接口:登入数量,注册数、订单量、搜索量和支付量
时序数据,是在一段时间内通过重复测量(measurement)而获得的观测值的集合将这些观测值绘制于图形之上,它会有一个数据轴和一个时间轴,服务器指标数据、应用程序性能监控数据、网络数据等也都是时序数据
prometheus基于HTTP call (http/https请求),从配置文件中指定的网络端点(endpoint/IP:端口)上周期性获取指标数据。
很多环境、被监控对象,本身是没有直接响应/处理http请求的功能,prometheus-exporter则可以在被监控端收集所需的数据,收集过来之后,还会做标准化,把这些数据转化为prometheus可识别,可使用的数据(兼容格式)
监控概念:白盒监控、黑盒监控
Prometheus支持通过三种类型的途径从目标上"抓取(Scrape)"指标数据(基于白盒监控);
Exporters ——>工作在被监控端,周期性的抓取数据并转换为pro兼容格式等待prometheus来收集,自己并不推送
Instrumentation ——>指被监控对象内部自身有数据收集、监控的功能,只需要prometheus直接去获取
Pushgateway ——>短周期5s—10s的数据收集
Prometheus同其它TSDB相比有一个非常典型的特性:它主动从各Target上拉取(pull)数据,而非等待被监控端的推送(push)
两个获取方式各有优劣,其中,Pull模型的优势在于:
集中控制:有利于将配置集在Prometheus server上完成,包括指标及采取速率等;
Prometheus的根本目标在于收集在rarget上预先完成聚合的聚合型数据,而非一款由事件驱动的存储系统
通过targets(标识的是具体的被监控端)
比如配置文件中的 targets:['localhost:9090']
主机名 | 主机IP |
---|---|
Prometheus | 192.168.241.25 |
Client | 192.168.241.26 |
Granfana | 192.168.241.27 |
- #在所有节点上安装 ntpdate 工具,并进行时间同步(因为 Prometheus 对时间要求非常严格)
-
- yum -y install ntpdate
- /usr/sbin/ntpdate ntp.aliyun.com
-
- #如果是时区不同,导致时间不同步可以修改时区timedatectl set-timezone Asia/Shanghai
普罗米修斯下载链接地址:https://prometheus.io/download/
此次我们安装 prometheus-2.16.0.linux-amd64.tar.gz 的版本
- #在Prometheus节点进行操作
- cd /opt
-
- wget https://github.com/prometheus/prometheus/releases/download/v2.16.0/prometheus-2.16.0.linux-amd64.tar.gz
-
- tar xf prometheus-2.16.0.linux-amd64.tar.gz
-
- mv prometheus-2.16.0.linux-amd64 /usr/local/prometheus
- useradd -s /sbin/nologin prometheus
- chown -R prometheus:prometheus /usr/local/prometheus/
- vim /usr/lib/systemd/system/prometheus.service
-
- [Unit]
- Description=prometheus
- After=network.target
-
- [Service]
- User=prometheus
- Group=prometheus
- WorkingDirectory=/usr/local/prometheus
- ExecStart=/usr/local/prometheus/prometheus
- [Install]
- WantedBy=multi-user.target
-
- systemctl daemon-reload
- systemctl enable --now prometheus

/usr/local/prometheus/data
目录,存储数据的大小受限和扩展不便;influxdb
作为后端的数据库来存储数据。- wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.8.x86_64.rpm
-
- yum -y localinstall influxdb-1.7.8.x86_64.rpm
-
- cp /etc/influxdb/influxdb.conf /etc/influxdb/influxdb.conf.default
-
- systemctl enable --now influxdb
- influx
- Connected to http://localhost:8086 version 1.7.8
- InfluxDB shell version: 1.7.8
- > create database prometheus;
- #创建Prometheus数据库,用于存储监控数据
- > exit
- vim /usr/local/prometheus/prometheus.yml
-
- 在最后面添加:
- remote_write:
- - url: "http://localhost:8086/api/v1/prom/write?db=prometheus"
- remote_read:
- - url: "http://localhost:8086/api/v1/prom/read?db=prometheus"
-
-
- systemctl restart prometheus
- wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
-
- tar xf node_exporter-0.18.1.linux-amd64.tar.gz
-
- mv node_exporter-0.18.1.linux-amd64 /usr/local/exporter/
- useradd prometheus -M -s /sbin/nologin
- chown prometheus:prometheus /usr/local/exporter
-
-
- vim /usr/lib/systemd/system/node_exporter.service
-
- [Unit]
- Description=Prometheus node_exporter
- [Service]
- User=nobody
- ExecStart=/usr/local/exporter/node_exporter --log.level=error
- [Install]
- WantedBy=default.target
-
- systemctl daemon-reload
- systemctl enable --now node_exporter

当启动
node_exporter
服务后,便可以通过20001
端口来访问 Client 的监控指标
- vim /usr/local/prometheus/prometheus.yml
- - job_name: "Client"
- static_configs:
- - targets: ['192.168.241.26:20001']
-
-
- systemctl restart prometheus
- wget https://dl.grafana.com/oss/release/grafana-6.1.4-1.x86_64.rpm
- yum -y localinstall grafana-6.1.4-1.x86_64.rpm
- systemctl enable --now grafana-server
- netstat -anpt | grep 3000
alertmanagr: prometheus可以生成告警信息,但是不能直接提供告警,需要使用一个外置的组件alertmanager来进行告警,emailetctif优势在于,收敛、支持静默、去重、可以防止告警信息的轰炸
把这条告警规则中的支持静默开启,让它必须,配置文件里直接改alertmanager改一个单词
级别 | 监控对象 | Exporter |
---|---|---|
网络 | 网络协议:http、dns、tcp、icmp; 网路硬件:路由器、交换机等 | BlockBox Exporter;SNMP Exporter |
主机 | 资源用量 | node exporter |
容器 | 资源用量 | cadvisor |
应用(包括Library) | 延迟、错误,QPS,内部状态 | 代码集中集成Prometheus Client |
中间件状态 | 资源用量,以及服务状态 | 代码集中集成Prometheus Client |
编排工具 | 集群资源用量,调度等 | Kubernetes Components |
TSDB项目 | 官网 |
---|---|
influxDB | InfluxDB: Open Source Time Series Database | InfluxData |
RRDtool | RRDtool - About RRDtool |
Graphite | Graphite |
OpenTSDB | OpenTSDB - A Distributed, Scalable Monitoring System |
Kdb+ | KX: The Leading Provider of Time-Series Database Technology |
Druid | Druid | Database for modern analytics applications |
KairosDB | KairosDB |
Prometheus | Prometheus - Monitoring system & time series database |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。