Prometheus学习整理-Prometheus-operator

news2025/1/17 14:03:58

Prometheus中的promQL语句:

Prometheus提供的一种promQL语法,用来处理接口数据,然后方便用户对数据进行处理加工,它是Prometheus专门提供的一个函数表达式语言,可以实时的查询和聚合时间序列的数据,通过HTTPApi的方式提供给外部使用,

PromQL主要分为下面的几种类型数据:

这里面的类型对应前面提到的metrics类型:

Counter: 只增不减的计数器:

像在Prometheus中统计一些cpu,http_reques_total的数据,都是一直在增加的数据,

Gauge: 可增可减的仪表盘:

这种方式更侧重于表示当前系统的一个状态,通过获取实时数据进行展示, 常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是Gauge类型的监控指标。

Histogram和Summary: 都是用来分析数据的分布情况

Histogram与Summary类型的指标相似之处在于Histogram类型的样本同样会反应当前指标的记录的总数(以_count作为后缀)以及其值的总量(以_sum作为后缀)。不同在于Histogram指标直接反应了在不同区间内样本的个数,区间通过标签len进行定义。

同时对于Histogram的指标,我们还可以通过histogram_quantile()函数计算出其值的分位数.

不同在于Histogram是在服务器端进行计算的分位数,而Summary的则是在客户端进行的计算,.

简单的几个示例:

过去5分钟的平均增长速率:

rate(http_requests_total[5m])

计算某个指标数据和.

Sum(my_metric_name)

Sum(http_requests_total[5m])

计算load5分钟,负载在两个小时内的差异:

delta(node_load5{instance="localhost:9100",job="node"}[2h])

当然,其中的数据来源,都是通过Prometheus中有的监控项目和采集到的数据,也可以加上不同标签进行过滤标识.

还有很多的语法和使用情况:

参考: Prometheus-基础系列-(四)-PromQL语句实践-1 - 知乎 (zhihu.com)

Prometheus的时序数据库

在使用Prometheus的时候,一般都没有安装其他专门用来存储采集数据的数据库.因为Prometheus自带有一种数据库.它是将采集到的样本以时间为序列的方式进行保存到本地内存中,然后定时通过分块的方式存储到磁盘中,但本地存储一般会保存15天,之后就会删除,那么需要永久保存就需要修改参数:” “storage.tsdb.retention.time=10000d”;延长时间.

时序数据库

首先看看什么是时序数据库. PrometheusTSDB、InfluxDB都是时序数据库.

因为Prometheus采集数据都是通过以时间节点来进行数据采集和标识,那么就需要将时间和当前时间的数据对应起来,一般都是通过(key,value)的形式记性存储.

每个数据点也就是由时间戳和值构成的元组.

identifier->(t0,v0),(t1,v1),(t2,v2)...

Prometheus TSDB的数据模型:

<metric name>{<labelname>=<label value>, ...}

例如Prometheus中的具体示例:

requests_total{method="POST",handler="/messages"}

其中一个时间序列是一组时间上严格单调递增的数据点序列,它可以通过metric来寻址,

Prometheus TSDB的存储原理

这个图就是存储的大致流程,其中t,v,就是采集的键值对数据,Head块是TSDB的内存块,所以数据进入后先放入到内存中,这里为了防止主机异常后数据丢失,所以还有一个预写机制,先做了一次预写日志(WAL)存储,并将这个数据在内存中保存一段时间,方便查询.

然后刷新到磁盘中并进行内存的一个映射(M-map),当这些内存映射的块或内存中的块到达某个时间后,就会进行持久化存储到磁盘block中去.

在head中还存在着数据截断:

Head中样本的一个声明周期的流程:

首先采集到数据后,来到head中存在active chunk中,这是唯一可以主动写入数据的地方,同时进行一次预写日志.

一旦active的空间被填满之后就需要进行数据截断,

那么就将截断数据进行内存映射后,写入到磁盘中,继续循环这个过程,

当数据变多,其中内存映射也只会去加载最新的,最被频繁使用的数据,此时TSDB就会将不常用数据刷新到磁盘bolck中,.

Block的持久化存储

Block的目录结构:

├── 01BKGTZQ1SYQJTR4PB43C8PD98 #block ID

│ ├── chunks # Block中的chunk文件

│ │ └── 000001

│ ├── tombstones # 数据删除记录文件

│ ├── index # 索引

│ └── meta.json # bolck元信息

磁盘上的block是固定时间范围内的chunk的集合,由他们自己的索引组成,其中包含 多个文件目录,对于每一个block上都有一个唯一的uid,id是可以进行排序的,当我们需要更新,修改bolck中的一些样本时,Prometheus TSDB只能重写整个block,生成新的id,如果要删除的情况下,Prometheus TSDB通过tombstones 实现了在不触及原始样本的情况下进行清理.

Tombstones 可以认为是一个删除标记,是block中唯一在写入数据后用于存储删除请求所创建的和修改的文件

Block合并:

在间隔多个定时时间后呢,就会产生大量的block块出现,那么就需要对这个多个block进行维护,

那么它进行合并的工作主要是将一个或多个现有块,写入一个新块,最后删除源块,并使用新的合并块后的block代替这些源块.

为什么需要对Block进行合并?

  1. 上面对tombstones介绍我们知道Prometheus在对数据的删除操作会记录在单独文件stombstone中,而数据仍保留在磁盘上。因此,当stombstone序列超过某些百分比时,需要从磁盘中删除该数据。

  1. 如果样本值波动较小,有大量重复的数据,那么对block合并,减少和节省磁盘空间,

  1. 当查询命中大于1个block时,必须合并每个块的结果,

  1. 如果有时间上重叠的block,查询他们还有对block之间的样本进行重复数据删除,合并后就不需要重复删除.

服务发现

Prometheus的自动发现是Prometheus自动对节点进行监控,与zabbix的自动发现和注册类似,,但Prometheus的自动发现方式较多,比如file_sd_confis基于文件自动发现,基于K8S自动发现,基于OpenStack的自动发现,基于consul自动发现等等.主要是用来解决云上资源的动态伸缩,

基于文件的自动发现配置:

File_sd_configs实现了文件级别的自动发现,使用文件自动发现功能后,Prometheus会定期检查配置文件是否有更新,如果有更新的话,就将新加入节点加入监控,服务端不同重启.

global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
 
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093
 
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
#自动发现配置
scrape_configs:
  - job_name: 'prometheus'
    file_sd_configs:  #不再是static_configs了
      - files: ['/usr/local/prometheus/sd_config/*.yml']
        refresh_interval: 120s  #加载文件的间隔时长

基于consul的自动发现配置:

Consul是一个服务器注册中心,主要用于容器化场景的自动发现,consul支持集群化配置,由多个代理节点组成的集群方式,代理节点分为server和client,所有的服务都可以进行注册,

区别:

在client是客户端模式,该模式下所有的注册到当前节点的服务会被转发到server,而且不会持久化这部分的服务信息,.

而server模式,则是会持久化这些数据,到本地,

对于Prometheus来说,他就是会自动获取到consul里的数据进行监控,而这些数据就是其他注册到consul中的.

global:  #这里的配置项可以单独配置在某个job中
  scrape_interval: 15s  #采集数据间隔,默认15秒
  evaluation_interval: 15s  告警规则监测频率,比如已经设置了内存使用大于70%就告警的规则,这里就会每15秒执行一次告警规则
  scrape_timeout:10s   #采集超时时间
 
scrape_configs:
  - job_name: 'prometheus-server'
    metrics_path defaults to '/metrics'
    scheme defaults to 'http' 
    static_configs:
      - targets: ['localhost:9090']  
 
  - job_name: 'consul-redis'
    metrics_path defaults to '/metrics'
    scheme defaults to 'http' 
    consul_sd_configs:
      - server: '192.168.1.100:8500'  #指定consul服务的地址,会从这个地址拉取数据
        tags:
        - "redis"  #拉取数据时根据不同的标签进行分组
        refresh_interval: 1m
 
  - job_name: 'consul-mysql'
    metrics_path defaults to '/metrics'
    scheme defaults to 'http' 
    consul_sd_configs:
      - server: '192.168.1.100:8500' 
        tags:
        - "mysql"  #拉取数据时根据不同的标签进行分组
        refresh_interval: 1m

Prometheus-operator

介绍Prometheus-operator

在前面我们介绍了Prometheus监控,,但如果是在K8S集群中部署Prometheus,那么当我们使用configmap方式注入Prometheus.yaml文件.然后在配置文件中进行这个targets的修改,来管理监控的实例.. 无论我们是使用挂载targets方式还是直接修改,,都需要在修改好配置之后将Prometheus的pod进行删除重建,才能读取到最新的一个配置,进行加载.

那么这种方式的更新维护效率很低下,使用监控的体验感也不好.

所以为了简化这些步骤, CoreOS率先引入了Operator的概念,并且首先推出了针对在Kubernetes下运行和管理Etcd的Etcd Operator。并随后推出了Prometheus Operator。

Prometheus Operator的工作原理

从概念上来讲operator就是针对管理特定应用程序的,在K8S接班的resource和controller的概念上,通过扩展K8Sapi的方式,帮助用户创建,配置管理这些有状态的应用程序.

架构图:

从这个图中可以很好的看出,它所拥有的几种资源类型,以及和SVC的之间的关系.

Prometheus的本职就是一组用户自定义的CRD资源以及controller的实现,Prometheusoperator负责监听到这些自定义资源的变化,并且根据这些资源的定义自动化的完成在Prometheus server自身以及配置的自动化管理工作.

Prometheus operator资源类型:

目前提供了4种资源类型:

Prometheus:声明创建和管理PrometheusServer的实例,通过statefulset方式创建server pod

ServiceMonitor: 负责声明式的管理监控配置,后端关联svc

PrometheusRule: 负责声明式的管理告警配置

Alertmanager:声明式的创建和管理Alertmanager实例。

就是在K8S集群中通过声明和使用这四种资源类型创建,相互关联来实现Prometheus的监控服务,同时可以很好的进行维护.

K8S集群中使用Prometheus-operator搭建监控服务

参考链接: 什么是Prometheus Operator · Prometheus中文技术文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;接上次的“2022年牛人之星”&#xff08; https://developer.huawei.com/consumer/cn/forum/topic/0203109930647268095&#xff09;&#xff0c;今天咱们来开箱另外一件特殊的奖品&#xff0c;来自华为…

MySQL内外连接

文章目录MySQL内外连接内连接外连接左外连接右外连接简单案例MySQL内外连接 表的连接分为内连接和外连接。 内连接 内连接 内连接的SQL如下&#xff1a; SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;说明一下&#xff1a; …

零基础学JavaWeb开发(二十三)之 springmvc入门到精通(3)

5、springspringmvcmybatis整合 5.1、项目技术需求分析 1.使用ssmlayui技术开发 对用户表数据实现增删改查 采用前后端分离架构模式 5.2、SSM环境的整合之提供增删改查 整合数据库表结构 CREATE TABLE mayikt_users (id int NOT NULL AUTO_INCREMENT,name varchar(255) CH…

Mysql入门技能树-使用数据库

创建和删除数据库 Joe 在开发机上创建了一个名为 goods 的数据库&#xff0c;做了一些练习&#xff0c;现在他需要删除这个数据库&#xff0c;重建一个 goods。那么他需要的步骤是&#xff1a; 答案是&#xff1a;A 创建数据库的语法格式如下&#xff1a; CREATE DATABASE d…

client-go实战之九:手写一个kubernetes的controller

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一&#xff1a;准备工作client-go实战之二:RESTClientclient-go实战之三&#xff1a;Clientsetclient-go实战之四&#xff1a;…

Java IO流之字符集总结

ASCII字符集、GBK字符集、Unicode字符集 这里我直接上总结了&#xff0c;关于这三种字符集的基本介绍大家可以百度一下。 在计算机中&#xff0c;任意数据都是以二进制的形式来存储的计算机中最小的存储单元是一个字节ASCII字符集中&#xff0c;一个英文占一个字节简体中文版Wi…

CQF量化金融职业指南

✏️写作&#xff1a;个人博客&#xff0c;InfoQ&#xff0c;掘金&#xff0c;知乎&#xff0c;CSDN &#x1f4e7;公众号&#xff1a;进击的Matrix &#x1f6ab;特别声明&#xff1a;原创不易&#xff0c;未经授权不得转载或抄袭&#xff0c;如需转载可联系小编授权。 概述 …

二分查找算法的实现以及解决整数溢出问题

前言 从今天起我会开启一个专栏&#xff1a;Java面试八股文,记录一下我在网上学到的Java面试常考的一些内容&#xff0c;注意:本人暂无面试经验&#xff0c;只是在网上找视频学习到的❗❗❗ 二分查找 我们首先要学习的是二分查找&#xff0c;我相信很多人跟我一样&#xff0c;在…

MySQL - text字段

一、text属性 MySQL下的TEXT属性一种特殊的字符串&#xff0c;存储单位为字节&#xff0c;有四种类型 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT 不同的是可以存储的字符串的长度以及空间占用大小 TINYTEXT最大存放长度为255个字符的字符串 TEXT最大存放长度为65535个字符的…

XlsReadWriteII EXCEL Cell 单元数据读写

XlsReadWriteII EXCEL Cell 单元数据读写 下面从编程的眼光&#xff0c;从XlsReadWriteII的角度&#xff0c;谈谈EXCEL的理解。回顾一下EXCEL发展史&#xff1a; 1982年&#xff1a;微软推出了它的第一款电子表格软件&#xff1a;Multiplan。 1985年&#xff1a;推出了…

Day06 C++STL入门基础知识三——String容器(下)比较-存取-插入-删除-子串获取【全面深度剖析+例题代码展示】

永远相信&#xff0c;美好的事情即将发生&#xff01; 文章目录1. 比较操作1.1 比较方式1.2 函数原型1.3 代码展示2. 字符读写2.1 字符读入/访问2.1.1 方式2.1.2 代码展示2.2 修改字符2.2.1 方式2.2.2 代码展示3. 插入和删除3.1 函数原型3.2 代码展示4. 截取子串(比较实用!!!)4…

蓝桥杯STM32G431RBT6学习——定时器输入捕获

蓝桥杯STM32G431RBT6学习——定时器输入捕获 前言 从省赛的题目来看&#xff0c;对于定时器输入捕获这块几乎不考&#xff0c;但是为了知识的完整性及避免万一&#xff0c;依旧有了解的必要。国信长天开发板上的定时器捕获主要针对于NE555波形发生器的方波进行频率、脉宽等测…

恶意代码分析实战 3 IDA Pro

利用IDA PRO分析Lab05-01.dll 实验目的 利用IDA Pro分析Lab05-01.dll中发现的恶意代码&#xff0c;回答以下问题&#xff1a; DLLMain的地址是什么&#xff1f; 可以空格转入反汇编查看DLLMain地址&#xff0c;或者 DLLMain的地址是.text:0x1000D02E。 使用Imports窗口并浏…

这几个步骤,让你的电脑避免卡顿~

C盘主要是系统运行的存储空间&#xff0c;如果C盘装满了东西&#xff0c;那就意味着电脑的存储空间小&#xff0c;电脑运行就会更慢。&#x1f62f; 另外&#xff0c;桌面上的文件也属于C盘&#xff0c;所以桌面也不要放太多东西。除装机时候的一些必要软件&#xff0c;后期装的…

SpringBoot切换数据源

基本使用添加依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.3.0</version> </dependency>数据源配置spring:datasource:dynamic:primary: fir…

【多元统计分析】Python实现对应分析

&#xff08;一&#xff09;题目要求 数据集包含地区生产总值的四个相关指标&#xff1a;x1劳动者报酬&#xff0c;x2生产税净额&#xff0c;x3固定资产折旧&#xff0c;x4营业盈余。对各个地区生产总值进行对应分析&#xff0c;揭示不同地区的生产总值构成特征。要求&#xf…

对多线程中线程池的理解

一.概念理解何为线程池&#xff1f;线程池的释义正如它的命名&#xff1a;专门用来存放线程的池子&#xff08;集合类&#xff09;&#xff0c;也就是将线程存储于集合类&#xff0c;使用时从线程池中直接获取&#xff0c;使用结束后将线程放回集合类即可&#xff0c;这样就避免…

macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像

本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。 2023 年 1 月 23 日&#xff08;北京时间 24 日凌晨&#xff09;&#xff0c;m…

基于电流型磁链观测器的异步电机矢量控制学习

导读&#xff1a;本期主要介绍电流型磁链观测器&#xff08;current flux observer&#xff09;在不同坐标系下的表现形式&#xff0c;应用在异步电机矢量控制系统中。如需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。一、引言磁链估…

JavaEE day4 初识HTML+总结3

FORM表单的常见type属性 FORM表单的tpye属性非常多&#xff0c;这里只介绍常见的几个&#xff1a; text &#xff1a; 输入普通文本&#xff0c;例如登录注册下的用户名 password &#xff1a; 输入密码文本&#xff0c;例如登录注册下的密码&#xff0c;隐藏用户的输入 ra…