星途物语 星途物语
首页
  • 随手记录
  • 故障处理
  • Nginx
  • MySQL
  • Ansible
  • Nexus
  • Tomcat
  • Docker
  • Zabbix
  • Prometheus
  • Git
  • GitLab
  • Jenkins
  • Kubernetes
  • Shell
  • Python
  • 圈圈空间
  • 做饭这件事
收藏站点
留言板
归档
GitHub (opens new window)

星途物语

尚记时,记之
首页
  • 随手记录
  • 故障处理
  • Nginx
  • MySQL
  • Ansible
  • Nexus
  • Tomcat
  • Docker
  • Zabbix
  • Prometheus
  • Git
  • GitLab
  • Jenkins
  • Kubernetes
  • Shell
  • Python
  • 圈圈空间
  • 做饭这件事
收藏站点
留言板
归档
GitHub (opens new window)
  • 随手记录

    • QPS优化记录
    • 阿里云SLB演示
    • DDOS预防
    • Linux内核优化
    • rsync同步守护进程
    • NFS文件同步
    • Tomcat升级
    • 编译安装mysql后添加到systemd管理
    • 防火墙笔记
    • python自动化巡检服务器
  • 故障处理

    • 处理防MIME攻击后出现的问题解决
  • MySQL学习笔记

    • MySQL5.7安装
    • MySQL常用操作语句
    • MySQL主从架构实施
    • MySQL主主架构实施
    • MySQL MHA高可用实施
    • MyCat读写分离
    • MySQL创建用户时的授权
    • MySQL备份
    • MySQL通配符
  • Nginx学习笔记

    • 状态码含义
    • 匹配优先级
    • Nginx常用操作
    • 添加第三方模块
    • 关于路径匹配
    • 转发和重写
    • 内置变量
    • Nginx配置文件结构
  • Tomcat学习笔记

    • 部署Tomcat
    • 修改发布目录
    • Tomcat调优
  • Redis学习笔记

    • 通过 tar.gz 包安装部署 redis
    • redis 配置文件
    • 哨兵集群
    • redis常用命令
    • 虚拟机安装 redis.tar.gz 遇到的问题
  • Ansible学习笔记

    • 部署和使用 ansible
    • ansible 自带的密码认证参数
    • 批量免密操作:批量分发公钥
    • 配置主机清单
    • ansible 小知识
    • 模块介绍
    • 剧本
    • 一键部署 rsync 环境
    • 批量安装一个tomcat
    • 批量安装一个nginx
    • 批量安装 zabbix-agent
  • Zabbix学习笔记

    • 部署 zabbix 服务端、客户端
    • 自定义监控
    • 触发器
    • 监控项类型
    • 简单检查模式
    • zabbix web 界面结构信息
    • 邮件报警
    • 微信报警
    • snmp 监控网络设备
    • 部署 zabbix 服务端、客户端
    • jmx 监控 java 应用
    • ipmi 监控硬件
    • 自动化注册
    • 监控项的主要项和相关项
    • percona 监控 mysql
  • Git学习笔记

    • 配置 git
    • 常用命令
  • GitLab学习笔记

    • 环境准备
    • 安装 gitlab
    • gitlab 忘记 root 管理员密码的处理办法
  • Jenkins学习笔记

    • 安装部署
    • jenkins 使用脚本完成项目构建
    • jenkins 自动构建最新项目
    • 将 jenkins 自动部署的结果返回给 gitlab
    • jenkins 上线 java 项目
    • jenkins pipeline
  • Docker学习笔记

    • 安装 docker
    • 配置 docker 源
    • docker 中的常见名词
    • 镜像管理命令
    • 容器管理命令
    • 创建容器
    • 数据卷
    • docker network
    • 搭建 LNMP
    • Dockerfile
    • Dockerfile 搭建 tomcat
    • docker 镜像磁盘扩容
    • docker composer
    • Harbor 私有镜像仓库
    • docker 面试题
    • docker desktop 运行时与虚拟机冲突
    • docker离线安装
  • Nexus学习笔记
  • Prometheus学习笔记

    • 核心组件
    • 工作原理
    • 安装和配置
    • 启动 Prometheus
    • PromQL 使用
      • 数据模型
      • Exporter
      • 演示服务
      • Grafana 数据可视化
      • Prometheus 告警
    • Kubernetes学习笔记

      • K8S的介绍
      • K8S集群环境的搭建
      • K8S资源管理
      • K8S的实战入门
    • 运维
    • Prometheus学习笔记
    星途物语
    2025-01-01
    目录

    PromQL 使用

    对一段指标的时间序列进行分析的语言(Prometheus 内置),它的核心是对指标的时间序列进行分析、计算和聚合,帮助用户从监控数据中提取有价值的信息

    PromQL 是 Prometheus 监控系统内置的一种查询语言,PromQL 允许你以灵活的方式选择,聚合等其他方式转换和计算时间序列数据,该语言仅用于读取数据,可以说 PromQL 是我们学习 Prometheus 最困难也是最重要的部分,接下来我们将进入 PromQL 的基础知识,理论基础,然后深入了解更加高级的 PromQL 查询模式

    当 Prometheus 从系统和服务收集指标数据时,它会把数据存储在内置的时序数据库中,要对收集到的数据进行任何处理,我们都可以使用 PromQL 从 TSDB 中读取数据,同时可以对所选的数据进行过滤,聚合以及其他转换操作

    PromQL 执行可通过两种方式触发:

    1. 在 Prometheus 服务器中,记录规则和报警规则会定时执行,并执行查询操作来计算规则结果(例如:触发报警)。该执行在 Prometheus 的内部进行,并在配置规则时自动发生
    2. 外部用户和 UI 界面可以使用 Prometheus 服务器提供的 HTTP API 来执行 PromQL 查询,这就是仪表盘软件(例如:Grafana,PromLens以及Prometheus内置的WebUI)访问PromQL的方式

    PromQL可以应用于许多监控场景,比如临时查询,我们可以用PromQL来对收集到的数据进行实时查询,这有助于我们去调试和诊断遇到的一些问题,我们一般也是直接使用内置的表达式查询界面来执行这类查询

    Prometheus可以直接使用基于PromQL对收集的数据进行的查询结果来生成报警,一个完整的报警规则如下

    groups:
      - name: demo-service-alerts
        rules:
          - alert: Many5xxErrors
            expr: |
              (
                sum by(path, instance, job) (
                  rate(demo_api_request_duration_seconds_count{status=~"5..",job="demo"}[1m])
                )
              /
                sum by(path, instance, job) (
                  rate(demo_api_request_duration_seconds_count{job="demo"}[1m])
                ) * 100 > 0.5
              )
            for: 30s
            labels:
              severity: critical
            annotations:
              title: "{{$labels.instance}} high 5xx rate on {{$labels.path}}"
              description: "The 5xx error rate for path {{$labels.path}} on {{$labels.instance}} is {{$value}}%."
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    除了构成报警规则核心的PromQL表达式(上面的yaml中的"expr"属性),报警规则还包含一切其他的元数据字段

    这样配置完成之后,Prometheus会通过一个名为 AlertManager 的组件来发送报警通知,可以配置一些接收器来接收这些报警,比如钉钉、企业微信、WebHook等

    # 结果类型

    1. 抓取目标报告的指标类型:Counter,Guage,Histogram,Summary
    2. PromQL 表达式的结果数据类型:字符串,标量,瞬时向量或区间向量

    PromQL实际上没有直接的指标类型的概念,只关注表达式的结果类型,每个PromQL表达式都有一个类型,每个函数,运算符或其他类型的操作都要求其参数是某种表达式类型,例如:rate()函数要求它的参数是一个区间向量,但是rate()本身评估为一个瞬时向量输出,所以rate()的结果只能用在期望是瞬时向量的地方

    也许这样说有点抽象,详细的说一下这 4 种结果类型

    1. string(字符串):字符串只会作为某些函数(如:label_join()和label_replaca())的参数出现

    2. scalar(标量):一个单一的数学值,如1.234,这些数字可以作为某些函数的参数,(如:histogram_quantile(0.9,...)或topk(3,...)),也会出现在算术运算

    3. instant vector(瞬时向量):一组标记的时间序列,每个序列有一个样本,都在同一个时间戳,瞬时向量可以由TSDB时间序列选择器直接产生,如node_cpu_seconds_total,也可以由任何函数或其他转换来获取

      node_cpu_seconds_total{cpu="0", mode="idle"} 19165708.75 @ timestamp_1 node_cpu_seconds_total{cpu="0", mode="system"} 381598.72 @ timestamp_1 node_cpu_seconds_total{cpu="0", mode="user"} 23211638.97 @ timestamp_1

    4. range vector(区间向量):一组标记的时间序列,每个序列都有一个随时变化的样本范围,在PromQL中只有两种方法可以生成区间向量,在查询中使用字面区间向量选择器(如:node_cpu_seconds_total[5m]),或使用子查询表达式(如:<expression>[5m:10s]),想要在指定的窗口内聚合一个序列的行为时,区间向量非常有用。像rate(node_cpu_seconds_total[5m]),计算每秒增加率一样,在node_cpu_seconds_total指标的最后5分钟内求平均值

      node_cpu_seconds_total{cpu="0", mode="idle"} 19165708.75 @ timestamp_119165136.3 @timestamp_2,19165167.72 @ tinestamp_3 node_cpu_seconds_total{cpu="0", mode="system"} 381598.72 @ timestamp_1381599.98 @ timestamp_2, 381600.58 @ timestamp_3 node_cpu_seconds_total{cpu="0", mode="user"} 23211638.97 @ timestamp_1 23211711.34 @timestamp_2,23211748.64 @ tinestamp_3

    # 瞬时查询

    瞬时查询用于表格的视图,你想在一个时间点上显示PromQL查询的结果,一个瞬时查询有以下参数:

    1.PromQL表达式、2.一个评估的时间戳

    在查询的时候可以选择过滤过去的数据,比如(foo[1h])表示查询foo序列近一小时的数据,访问过去的数据。

    瞬时查询可以返回任何有效的PromQL表达式类型(字符串,标量,即时和范围向量)

    下面来看一个瞬时查询的示例,看看它是如何工作的,比如http_requests_total在指定的时间戳来评估表达式,http_requests_total是一个瞬时向量选择器,它可以选择该时间序列的最新样本,最新意味着查询最近5分钟的样本数据

    如果我们在一个有最近样本的时间戳上运行此查询,结果将包含两个序列,每个序列都有一个样本

    prometheus_http_requests_total{code="200",job="prometheus",handler="/metrics"}
    prometheus_http_requests_total{code="200",job="prometheus",handler="/targets"}
    
    prometheus_http_requests_total{code="200",job="prometheus",handler="/targets"} or prometheus_http_requests_total{code="200",job="prometheus",handler="/metrics"}
    
    1
    2
    3
    4
    image-20241223164410627 image-20241223164509002 image-20241223164701494

    我们可以看到每隔5分钟都会有一个新的数据,但是这个数据也可能是不变的

    # 区域查询

    区域查询主要用于图形,想在一个指定的时间范围内显示一个 PromQL 表达式,范围查询的工作方式与即时查询完全相同,这些查询在指定时间范围的评估步中进行评估,当然,这些后台是高度优化的,在这种情况下 Prometheus 实际上并没有运行许多的独立即时查询

    区间查询包括以下参数:PromQL表达式、开始时间、结束时间、评估步长

    # 选择时间序列

    学习如何用不同的的方式来选择数据,如何在单个时间戳或一段时间范围内基于标签过滤数据,以及如何使用移动时间的方式来选择数据

    最简单的PromQL查询就是直接选择具有指定标签名称的序列

    例如:以下查询将返回所有具有指标名称 demo_api_request_duration_seconds_count 的序列

    image-20241223170628210

    由于数据是 demo 产生的,所以数据很多,该查询语句会返回许多相同指标名称的序列,但有不同的标签组合 instance,job,method,path 和 status 等,输出结果如上所示

    image-20241223171115338

    此结果为区间向量

    image-20241223171558287

    当我们访问 Graph 的时候 API 会发生变化,因为是一个区间,所以要有始有终的

    image-20241223172453523

    这里就是区间查询了

    过滤全部 method为 GET的数据

    PromQL:demo_api_request_duration_seconds_count{method="GET"} PromQL:{name="demo_api_request_duration_seconds_count",method="GET"}

    image-20241223173707512

    过滤多个标签,使用","来分割多个条件

    PromQL:demo_api_request_duration_seconds_count{method="GET",instance="localhost:10000"} PromQL:{_name_="demo_api_request_duration_seconds_count",method="GET",instance="localhost:10000"}

    注意:组合使用多条件匹配的时候需要所有的条件都必须满足的时间序列

    除了相等之外的,Prometheus还支持其他的几种匹配器类型

    • = :等于
    • !=:不等于
    • =~:正则表达式匹配
    • !~:正则表达式不匹配

    甚至我们可以完全省略指标名称,比如查询所有path标签的以/api开头的所有序列,但是该查询会查询到具有不同指标名的序列

    PromQL:{path=~"/api.*"}

    image-20241224085907384

    使用不等于来过滤想要的数据 PromQL:demo_api_request_duration_seconds_count{method!="GET"} PromQL:{name="demo_api_request_duration_seconds_count",method != "GET"}

    因为部分函数可能要求的是你需要传递一个区间向量,所以你需要添加一个时间,# 无法取Graph PromQL:demo_api_request_duration_seconds_count{method != "GET"}[1m] PromQL:{name="demo_api_request_duration_seconds_count",method != "GET"}[1m]

    使用offset <time>来查询过去一小时之前的数据,# 可获取Graph PromQL:demo_memory_usage_bytes{type="free"} offset 1h PromQL:{name="demo_memory_usage_bytes",type="free"} offset 1h

    #Prometheus
    启动 Prometheus
    数据模型

    ← 启动 Prometheus 数据模型→

    Theme by Vdoing | Copyright © 2025-2025 | 鄂ICP备2024086820号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式