引言
zabbix是传统的监控系统,出现比云原生早,使用的是SQL关系型数据库,而Prometheus基于谷歌的borgemon使用的go语言开发,使用TSDB数据库,所以支持云原生,zabbix最新发布的6.0版本,知道自己处于生死存亡时刻,也支持了peometheus使用的TSDS数据库。
Prometheus是一个开源的服务监控系统和时序性数据库,其提供了通用的数据模型和快捷数据采集,存储和查询接口。他的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行数据拉取,当新拉取到的数据大于配置的内存缓存区时,数据就会持久化存储到设备当中。
Prometheus 官网地址:https://prometheus.io
Prometheus github 地址:https://github.com/prometheus
多维数据模型:由度量名称和键值对标识的时间序列数据
时序数据,是在一段时间内通过重复测量(measurement)而获得的观测值的集合;将这些观测值绘制于图形之上,它会有一个数据轴和一个时间轴;
服务器指标数据、应用程序性能监控数据、网络数据等也都是时序数据;
1.数据收集模块
2.数据提取模块(prometheus-TSDB,查询语言是promQL)
3.监控告警模块(布尔值表达式判断是否需要告警,不成立是健康状态)
可细分为六层
第六层:用户展示管理层 同一用户管理、集中监控、集中维护
第五层:告警事件生成层 实时记录告警事件、形成分析图表(趋势分析、可视化)
第四层:告警规则配置层 告警规则设置、告警伐值设置(定义布尔值表达式,筛选异常状态)
第三层:数据提取层 定时采集数据到监控模块
第二层:数据展示层 数据生成曲线图展示(对时序数据的动态展示)
第一层:数据收集层 多渠道监控数据(网络,硬件,应用,数据,物理环境)
CPU、load、memory、swap、disk、i/o、process等
网络监控:网络设备,工作负载,网络延迟,丢包率等
消息中间件:kafka、RockerMQ,等消息代理(redis中间件)
WEB服务器:tomcat、weblogic、apache、php、sring系列
数据库/缓存数据库:mysql、postgresql、mongoDB、es、redis
redis'监控内容
日志--->如果是哨兵模式--->哨兵共享集群信息,产生的日志
--->直接包含的其他节点哨兵信息及redis信息
用于衡量应用程序代码状态和性能
监控的分类:
1,白盒监控:自省指标,等待被下载
2,黑盒监控:基于探针(snmp)的监控方式,不会主动干预,影响数据
用于衡量应用程序的价值。如电商业务的销售量,ops、dau日活、转化等
业务接口:登入数量,注册数、订单量、搜索量和支付量
时间序列数据(TimeSeries Data):按照时间顺序记录系统、设备状态变化的数据被称为时序数据。
应用场景很多,如:
无人驾驶车辆运行中要记录的经度,纬度,速度,方向,旁边物体的距离等等。每时每刻都要将数据记录下来做分析。
某一个地区的各车辆的行驶轨迹数据
传统证券行业实时交易数据
实时运维监控数据等
Prometheus 有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用 3.5byte 左右空间,上百万条时间序列,30 秒间隔,保留 60 天,大概花了 200 多 G(来自官方数据)
Prometheus基于HTTP call (http/https请求),从配置文件中指定的网络端点(endpoint/IP:端口)上周期性获取指标数据。很多环境、被监控对象,本身是没有直接响应/处理http请求的功能,prometheus-exporter则可以在被监控端收集所需的数据,收集过来之后,还会做标准化,把这些数据转化为prometheus可识别,可使用的数据(兼容格式)。
监控概念:白盒监控、黑盒监控
白盒监控:自省方式,被监控端内部,可以生成指标,只要等待监控系统来采集时提供出去即可。
黑盒监控:对于被监控系统没有侵入性,对其没有直接‘影响",这种类似于基于探针机制进行监控(snmp协议)
prometheus支持通过三种类型的途径从目标上抓取/采集(scrape)指标数据(基于白盒监控)
exporter--->工作在被监控端,周期性的抓取数据并 转换为prometheus来收集,自己并不推送
Instrumentation--->指被监控对象内部自身有数据收集、监控的功能,只需要prometheus直接去获取
Pushgateway--->短周期5s-10s的数据收集
Prometheus同其他TSDB相比有一个非常典型的特性:主动从各Target上拉取(pull)数据,非等待被监控端的推送(push)
两个获取方式各有优劣,其中,Pull模型的优势在于:
Prometheus 负责时序型指标数据的采集及存储,但数据的分析、聚合及直观展示以及告警等功能并非由Prometheus Server所负责。
Prometheus组件中的核心部分,收集和存储时间序列数据,提供PromQL查询语言的支持。内置的 Express Browser UI,通过这个 UI 可以直接通过 PromQL 实现数据的查询以及可视化。
Pushgateway:类似一个中转站,Prometheus的server端只会使用pull方式拉取数据,但是某些节点因为某些原因只能使用push方式推送数据,那么它就是用来接收push而来的数据并暴露给Prometheus的server拉取的中转站。可以理解成目标主机可以上报短期任务的数据到Pushgateway,然后Prometheus server 统一从Pushgateway拉取数据。
Exporters:指标暴露器,负责收集不支持内建Instrumentation的应用程序或服务的性能指标数据,并通过HTTP接口供Prometheus Server获取。换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为Prometheus格式的指标向外暴露。
常用的Exporters:
需要注意的是kube-state-metrics 只是简单的提供一个metrics 数据,并不会存储这些指标数据,
所以可以使用prometheus来抓取这些数据然后存储,主要关注的是业务相关的一些元数据,
比如Deployment、Pod、副本状态等;调度了多少个replicas?现在可用的有几个?
多少个Pod是running/stopped/terminated 状态?Pod 重启了多少次?有多少job在运行中。
Service Discovery:服务发现,用于动态发现待监控的Target,Prometheus支持多种服务发现机制:文件、DNS、Consul、Kubernetes等等。
服务发现可通过第三方提供的接口,Prometheus查询到需要监控的Target列表,然后轮询这些Target 获取监控数据。该组件目前由Prometheus Server内建支持
Alertmanager:是一个独立的告警模块,从Prometheus server端接收到“告警通知”后,会进行去重、分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件、钉钉、企业微信等。
client Library:客户端库,目的在于为那些期望原生提供Instrumentation功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。
Grafana:是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。
Prometheus数据流向
基于:
1,数据采集
2,数据提取
3,数据告警
4,其他
通过指标暴露器和push网关来采集数据
1,exporters:可以把例如 mysql redis nodes 的指标数据转为pro可以识别的格式(http)
2,pushgetwary:(push模型)短周期、云数据http/https方式输出的数据,一次性任务
3,instrumtation:cadvisor,mysql内建的监控模块,nginx-vts
2,存储
默认存储在自身的TSDB中(本地存储)
也可以存储在分布式存储中
其他的TSDB中,例如inflxdb,openTSDB等
3,展示
默认使用表达式浏览器(ui)来展示
可以借用其他的展示工具、服务、差距、来帮助实现可视化,例如kibana,grafana,告警平台
4,prometheus -server端 (server discover)被监控端
static-config 配置什么就监视什么
fd-config:基于文件形式的数据发现
注册中心:例如consul,nacos
基于k8s方式的自动发现,通过与api-server集成,采集metrics-server 和cadvisor来自动发现pod的状态
基于DNS-SRV记录,来实现服务发现
5,pro-server (告警逻辑)
通过布尔值表达式来产生告警信息,和告警逻辑
6,alertmanager、garfana (告警通知)
通过路由分组+告警通知功能,实现触发式的监控告警给receivers(接受“人”)