Prometheus监控数据格式学习
本文大纲:
• prometheus metrics的概念
• k/v的数据形式
• prometheus exporter的使⽤(pull形式采集数据)
• prometheus pushgateway的⼊门介绍(push形式采集数据)
1)prometheus metrics的概念
promethes监控中对于采集过来的数据统⼀称为metrics数据
当我们需要为某个系统某个服务做监控、做统计,就需要⽤到Metrics。
metrics是⼀种对采样数据的总称(metrics 并不代表某⼀种具体的数据格式 是⼀种对于度量计算单位的抽象 )
咱们来介绍⼀下 metrics 的⼏种主要的类型
Gauges
最简单的度量指标,只有⼀个简单的返回值,或者叫瞬时状态,例如,我们想衡量⼀个待处理队列中任务的个数、
⽤更简单的⽅式举个例⼦
例如 : 如果我要监控硬盘容量或者内存的使⽤量,那么就应该使⽤Gauges的metrics格式来度量
因为硬盘的容量或者内存的使⽤量是随着时间的推移不断的瞬时没有规则变化的
这种变化没有规律,当前是多少,采集回来的就是多少 5:00 21%。5:01 25% , 5:02 17%
既不能肯定是 ⼀只持续增⻓ 也不能肯定是⼀直降低
是多少 就是多少 这种就是Gauges使⽤类型的代表
如图所示 CPU的上下浮动就是采集使⽤Gauge形式的 metrics数据 没有规律 是多少就得到多少然后显示出来
Counters 类型metris
Counter就是计数器,从数据量0开始累积计算 在理想状态下只能是永远的增⻓不会降低
Counter => 数字 +++ 2:00 => 0 prometheus
举个例⼦来说
⽐如对⽤户访问量的采样数据
我们的产品被⽤户访问⼀次就是1 过了10分钟后 积累到 100
过⼀天后 积累到 20000
⼀周后 积累到 100000-150000
如下图展示的Counter数据 是从0开始⼀直不断的积累,累加下去的 所以理想状态下 不可能出现任何降低的状况
最多只可能是 ⼀直保持不变(例如 ⽤户不再访问了,那么当前累积的总访问量 会以⼀条水平线的状态保持下去 直到 再被访问)
如下图展示的 就是⼀个counter类型的metrics数据采集。 采集的是 ⽤户的访问累积量
Histograms
Histogram统计数据的分布情况。⽐如最⼩值,最⼤值,中间值,还有中位数,75百分位, 90百分位, 95百分位, 98百分位, 99百分位, 和 99.9百分位的值(percentiles)。
这是⼀种特殊的 metrics数据类型 , 代表的是⼀种近似的百分⽐估算数值
⽐如我们在企业⼯作中 经常接触这种数据
Http_response_time HTTP响应时间
代表的是 ⼀次⽤户HTTP请求 在系统传输和执⾏过程中 总共花费的时间
nginx中的 也会记录这⼀项数值 在⽇志中
那么问题来了
我们做⼀个假设
如果我们想通过监控的⽅式 抓取当天的nginx access_log ,并且想监控⽤户的访问时间
我们应该怎么做呢?
把⽇志每⾏的 http_response_time 数值统统采集下来啊 然后计算⼀下总的平均值即可
那么⼤⽶要问⼤家⼀句了 假如我们采集到 今天⼀天的访问量 是100万次
然后把这100万次的 http_response_time 全都加⼀起 然后 除以100万 最后得出来⼀个avg值
0.05秒 = 50毫秒
这个数据的意义⼤么?
假如 今天中午1:00的时候 发⽣了⼀次线上故障 系统整体的访问变得⾮常缓慢 ⼤部分的⽤户
请求时间都达到了 0.5~1秒作⽤
但是这⼀段时间 只持续了5分钟, 总的⼀天的平均值并不能表现得出来 我们如何在1:00-
1:05的时候 实现报警呢?
在举个例⼦:
就算我们⼀天下来 线上没有发⽣故障 ⼤部分⽤户的响应时间 都在 0.05秒(通过 总时间/总
次数得出)
但是我们不要忘了 任何系统中 都⼀定存在 慢请求 就是有⼀少部分的⽤户 请求时间会⽐总
的平均值⼤很多 甚⾄接近 5秒 10秒的也有
(这种情况很普遍 因为各种因素 可能是软件本⾝的bug 也可能是系统的原因 更有可能是少
部分⽤户的使⽤途径中出现了问题)
那么我们的监控需要 发现和报警 这种少部分的特殊状况,⽤总平均能获得吗?
如果采⽤总平均的⽅式,那不管发⽣什么特殊情况,因为⼤部分的⽤户响应都是正常的 你
永远也发现不了少部分的问题
所以 Histogram的metrics类型 在这种时候就派上⽤场了
通过histogram类型(prometheus中 其实提供了⼀个 基于histogram算法的 函数 可以直接使
⽤)
可以分别统计出 全部⽤户的响应时间中
~=0.05秒的 量有多少 0 ~ 0.05秒的有多少, > 2秒的有多少 >10秒的有多少 => 1%
我们就可以很清晰的看到 当前我们的系统中 处于基本正常状态的有多少百分⽐的⽤户(或
者是请求)
多少处于速度极快的⽤户, 多少处于慢请求或者有问题的请求
metrics的类型其实还有另外的类型
但是在我们⼤⽶运维的课程中 我们最主要使⽤的 就是 counter ganga 和 histogram
2) k/v的数据形式
prometheus 的数据类型就是依赖于这种 metris的类型来计算的
⽽对于采集回来的数据类型再往细了说必须要以⼀种具体的数据格式供我们查看和使⽤
那么我们来看⼀下⼀个exporter 给我们采集来的 服务器上的k/v形式 metrics数据
当⼀个exporter(node_exporter) 被安装和运⾏在 被监控的服务器上后
使⽤简单的 curl命令 就可以看到 exporer帮我们采集到 metrics数据的样⼦ , 以 k / v 的形式展现和保存
curl localhost:9100/metrics
如上图所⽰ curl之后的结果输出
prometheus_server
带# 的⾏ 是注释⾏ ⽤来解释下⾯这⼀项 k / v 数值 是什么东东的采样数据
⽽ 我们真正关⼼的 是这样的 数据
看到了没有 就是⽤空格分开的 KEY / Value 数据
第⼀个代表的是 当前采集的 最⼤⽂件句柄数 是 65535
第⼆个代表的是 当前采集的 被打开的⽂件句柄数是: 10
这样就⾮常好理解了
另外 我们在看下这⾥
第⼆⾏的 # 告诉我们了 这⼀项数据的metrics类型 属于gauge
因为很简单, ⽂件句柄数的使⽤ 是没有规律的瞬时采样数据 当前是多少就是多少
3) exporter的使⽤
官⽹提供了丰富的 成型 exportrs插件可以使⽤
举⼏个例⼦
下载⾸页 其实就已经提供了 很多 很常⽤的 exporters
这些exporters 分别使⽤不同的开发语⾔开发,有 go 有 Java 有python 有ruby 等等
我们不关⼼社区组织 ⽤什么语⾔做的开发
我们只要关⼼ 如何下载和正确安装使⽤ 即可
⼤多数exporters 下载之后,就提供了启动的命令 ⼀般直接运⾏ 带上⼀定的参数就可以了
⽐如 最常⽤的 node_exporter =》 这个exporter⾮常强⼤,⼏乎可以把 Linux系统中 和系统⾃
⾝相关的监控数据 全抓出来了(很多参数 说真的 都没听说过 ⽐你想象的 学过的 多的多)
这⾥只给⼤家⼀个截图 展⽰node_exporter⼀部分的 ⽀持的监控数据采集
每⼀项 其实还有N多的⼦项, 该有的数据都有了,不该有的 不重要的 基本也有了 应有尽有
咱们还需要 ⾃⼰开发采集exporter吗? 其实不怎么需要了 直接⽤就好了
4) pushgateway 的概念介绍
之前说的 exporter 是⾸先安装在被监控服务器上运⾏在后台
然后⾃动采集系统数据 , 本⾝又是⼀个 HTTP_server 可以被prometheus服务器定时去HTTP GET取得数据
属于pull的形式
如果把这个过程反过来
push的形式是把pushgateway安装在客户端或者服务端(其实装哪⾥都⽆俗谓)
pushgateway本⾝也是⼀个http服务器
运维通过写⾃⼰的脚本程序抓⾃⼰想要的监控数据然后推送到 pushgateway(HTTP) 再由pushgateway推送到 prometheus服务端
是⼀个反过来的被动模式
为什么已经有了那么强⼤的 pull 形式的node_exporter采集还需要⼀个pushgateway的形式呢?
其实对这个问题的回答是:
• exporter虽然采集类型已经很丰富了,但是我们依然需要很多⾃制的监控数据⾮规则化的⾃定制的
• exporter 由于数据类型采集量⼤,其实很多数据或者说⼤部分数据其实我们监控中真的⽤不到,⽤pushgateway是定义⼀项数据就采集着⼀种节省资源
• ⼀个新的⾃定义的pushgateway脚本开发远远⽐开发⼀个全新的exporter 简单快速的多的多的多! (exporter的开发需要使⽤真正的编程语⾔ ,shell这种快速脚本是不
⾏的⽽且需要了解很多 prometheus⾃定的编程格式才能开始制作⼯作量很⼤)
• exporter虽然已经很丰富了,但是依然有很多的我们需要的采集形式, exporter⽆法提供,或者说 现有的expoter还不⽀持,但是如果使⽤pushgateway的形式 就可以任意灵活,想做什么都可以做到⽽且极快
最后 ⽤⼀张图 来⽴刻这两种不同的 采集形式
Prometheus监控数据格式学习的更多相关文章
- 使用docker方式构建prometheus监控的学习
一.背景:近期学习部署prometheus监控系统,经研究发现prometheus提供docker运行模式.根据我的经验,能够使用docker模式构建系统一定多快好省. 二.环境: 1.centos7 ...
- Prometheus 监控领域最锋利的“瑞士军刀”
原文:https://mp.weixin.qq.com/s/Cujn6_4w8ZcXCOWpoAStvQ 一.Kubernetes 容器监控的标配—Prometheus 1.简介 Prometheus ...
- Prometheus监控学习笔记之教程推荐
最近学习K8S和基于容器的监控,发现了如下的教程质量不错,记录下来以备参考 1. K8S最佳实战(包括了K8S的Prometheus监控和EFK日志搜集) https://jimmysong.io/k ...
- Prometheus监控学习记录
官方文档 Prometheus基础文档 从零开始:Prometheus 进阶之路:Prometheus —— 技巧篇 进阶之路:Prometheus —— 理解篇 prometheus的数据类型介绍 ...
- Prometheus监控学习笔记之prometheus的federation机制
0x00 概述 有时候对于一个公司,k8s集群或是所谓的caas只是整个技术体系的一部分,往往这个时候监控系统不仅仅要k8s集群以及k8s中部署的应用,而且要监控传统部署的项目.也就是说整个监控系统不 ...
- Prometheus监控学习笔记之Prometheus不完全避坑指南
0x00 概述 Prometheus 是一个开源监控系统,它本身已经成为了云原生中指标监控的事实标准,几乎所有 k8s 的核心组件以及其它云原生系统都以 Prometheus 的指标格式输出自己的运行 ...
- Prometheus监控学习笔记之Prometheus监控简介
0x00 Prometheus容器监控解决方案 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.它是一个独立的开放源码项目,并且独立于任何公司.不同 ...
- Prometheus监控学习笔记之Prometheus查询无数据或者Grafana不显示数据的诡异问题
0x00 概述 Prometheus和Grafana部署完成后,网络正常,配置文件正常,抓取agent运行正常,使用curl命令获取监控端口数据正常,甚至Prometheus内的targets列表内都 ...
- Prometheus监控学习笔记之容器监控Grafana模块
0x00 概述 Grafana 是一个开源的,可以用于大规模指标数据的可视化项目,甚至还能对指标进行报警.基于友好的 Apache License 2.0 开源协议,目前是prometheus监控展示 ...
随机推荐
- 存储引擎-Buffered tree
Buffered-tree 也称为COLA,即cache-oblivious,可以不需要知道具体内存大小和一个块的大小,使用一套逻辑进行处理,因此内存大小可知,内存可能被临时占用去做其它事情. Buf ...
- Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能
博客描述:后台返回地点的经纬度在地图上进行描点,点击导航弹出PopupWindow进行选择地图操作,如果手机中没有安装地图,提示没有,否则传值调起地图进行导航操作 看一下实现的效果,没图说再多都白搭 ...
- Getting Real内容浓缩
今天看完,想整理一下,可能会更好,也给别人提供一个快速学习的途径第一章 什么是 Getting Real?表达形式省略.精炼.精益.敏捷.用户体验.迭代改进.产品简化.第二章 建构从简做得比竟争对手少 ...
- sqlite db数据的导出
sqlite的db数据一般是filename.db的格式,用普通文本编辑器打开是乱码,用sqlite名令操作比较麻烦,有时版本格式问题还会起阻扰,有一个GUI工具可以对sqlite db格式数据进行管 ...
- Android Studio 插件开发详解二:工具类
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...
- FileReader读取本地文件
FileReader是一种异步读取文件机制,结合input:file可以很方便的读取本地文件. 一.input:type[file] file类型的input会渲染为一个按钮和一段文字.点击按钮可打开 ...
- Scala编程入门---数组操作之Array.ArrayBuffer以及遍历数组
在Scala中,Array代表的含义与Java类似,也是长度不可改变的数组.此外,由于Scala与java都是运行在JVM中,双方可以互相调用,因此Scala数组底层实际上是java数组.列如字符串数 ...
- C# 获取当前年份的周期,周期所在日期范围
最近有一个项目要用到年份周期,用于数据统计图表展示使用,当中用到年份周期,以及年份周期所在的日期范围.当初设想通过已知数据来换算年份周期,经过搜索资料发现通过数据库SQL语句来做,反而更加复杂.现在改 ...
- python 整理数据中的图片
import shutil import time import pymysql conn=pymysql.connect(host="222",user="root&q ...
- python 面向对象进阶之元类metaclass
一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为local ...