Prometheus简介

Prometheus是一个开源的监控报警系统,它最初由SoundCloud开发。

2016年,Prometheus被纳入了由谷歌发起的Linux基金会旗下的云原生基金会( Cloud Native Computing Foundation),并成为仅次于Kubernetes的第二大开源项目。自此,它成为了一个独立的开源项目,独立于任何公司进行维护。

Prometheus拥有非常活跃的开发人员和用户社区,目前在GitHub上已拥有三万多的Star。

Prometheus特点

  • 提供多维度数据模型,使用指标名称和键值对标识的时间序列数据
  • 提供灵活的PromQL查询方式,还提供了HTTP查询接口,可以很方便地结合Grafana等组件展示数据。
  • 不依赖外部存储,支持单节点的本地存储。通过Prometheus自带的时序数据库,可以完成每秒百万及的数据存储,如果需要存储大量历史数据,还可以对接第三方的时序数据库。
  • 时间序列收集通过HTTP的拉取方式进行,并提供了开放的指标数据标准。
  • 支持向中间网关推送时序数据,可以更加灵活地适用于多种监控场景。
  • 支持通过动态服务发现和静态文件配置获取监控对象,目前已支持Kubernetes、Etcd、Consul等多种服务发现机制。
  • 支持多种模式的图形展示和仪表盘。
  • 大多数Prometheus的组件都是使用Go语言编写的,这使得它们很容易以二进制文件的形式构建和部署。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

Prometheus架构

Prometheus生态圈由多个组件构成,其中许多组件是可选的:

  • Prometheus Server:用于收集、存储和查询时间序列数据。通过静态配置文件管理监控目标,也可以配合使用动态服务发现的方式动态管理监控目标,并从这些监控目标中获取数据。它将采集到的数据按照时间序列的方式存储在本地磁盘当中或者外部的时序数据库中,可通过PromQL语言对数据的查询以及分析。
  • Client Library:为被监控的应用生成相应的指标(Metric)数据并暴露给Prometheus Server。当Prometheus Server 来拉取时,直接返回实时状态的指标数据。
  • Push Gateway:主要用于短期存在的Jobs。由于这类Jobs存在时间较短,可能在Prometheus Server来拉取数据之前就消失了。所以,Jobs可以直接向Push Gateway推送它们的指标数据,然后Prometheus Server再从Push Gateway拉取。
  • Exporters:用于暴露已有的第三方服务的指标数据通过HTTP服务的形式暴露给Prometheus Server,比如HAProxy、StatsD、Graphite等等。Prometheus Server通过访问该Exporter提供的Endpoint,即可获取到需要采集的监控数据。
  • Alertmanager:从Prometheus Server接收到告警后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。Alertmanager的告警方式非常灵活,支持通过邮件、slack或钉钉等多种途径发出告警。
  • 一些其他的组件。

下面这张图展示了Prometheus的架构和各个组件是如何交互和协作的:

其大概的工作流程是:

  1. Prometheus Server直接从HTTP接口或者Push Gateway拉取指标(Metric)数据。
  2. Prometheus Server在本地存储所有采集的指标(Metric)数据,并在这些数据上运行规则,从现有数据中聚合和记录新的时间序列,或者生成告警。
  3. Alertmanager根据配置文件,对接收到的告警进行处理,发出报警。
  4. 在Grafana或其他API客户端中,可视化收集的数据。

Prometheus数据模型

Prometheus会将所有采集到的监控数据以时间序列的方式保存在内存数据库中,并且定时保存到硬盘上。每一条数据由以下三部分组成:

  • 指标(Metric):由指标名称和描述当前数据特征的标签组成。
  • 时间戳(Timestamp):一个精确到毫秒的时间戳。
  • 数据值(Value):一个float64的浮点型数据表示当前数据的值。

其中,指标(Metric)通过如下格式标识:

<指标名称>{<标签名称>=<标签值>, ...}

指标名称(Metric Name)可以反映被监控数据的含义。指标名称只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*

标签(Label)反映了当前数据的特征维度,通过这些维度Prometheus可以对数据进行过滤,聚合等操作。标签的名称只能由ASCII字符、数字以及下划线组成并满足正则表达式[a-zA-Z_][a-zA-Z0-9_]*

比如:

prometheus_http_requests_total{code="200",handler="/metrics"}

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

指标类型

Prometheus定义了4种不同的指标类型(Metric Type):

  • Counter(计数器)
  • Gauge(仪表盘)
  • Histogram(直方图)
  • Summary(摘要)

Counter(计数器)

Counter类型和计数器一样,只增不减(除非系统发生重置),一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

比如,Prometheus Server中prometheus_http_requests_total, 表示Prometheus处理的HTTP请求总数:

# HELP prometheus_http_requests_total Counter of HTTP requests.
# TYPE prometheus_http_requests_total counter
prometheus_http_requests_total{code="200",handler="/api/v1/label/:name/values"} 3
prometheus_http_requests_total{code="200",handler="/api/v1/query"} 5
prometheus_http_requests_total{code="200",handler="/api/v1/query_range"} 15
prometheus_http_requests_total{code="200",handler="/graph"} 3
prometheus_http_requests_total{code="200",handler="/metrics"} 23
prometheus_http_requests_total{code="200",handler="/static/*filepath"} 18
prometheus_http_requests_total{code="302",handler="/"} 1

Gauge(仪表盘)

Gauge类型侧重于反应系统的某一个瞬时的值,这类指标的数据可增可减。

比如,Prometheus Server中go_threads, 表示Prometheus当前go线程的数量:

# HELP go_threads Number of OS threads created.
# TYPE go_threads gauge
go_threads 13

Histogram(直方图)

Histogram类型由_bucket{le=""},_bucket{le="+Inf"}, _sum,_count 组成,主要用于表示一段时间范围内对数据进行采样,并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图。

比如,Prometheus Server中prometheus_http_response_size_bytes:

# HELP prometheus_http_response_size_bytes Histogram of response size for HTTP requests.
# TYPE prometheus_http_response_size_bytes histogram
prometheus_http_response_size_bytes_bucket{handler="/",le="100"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="10000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="100000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+06"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+07"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+08"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+09"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="+Inf"} 1
prometheus_http_response_size_bytes_sum{handler="/"} 29
prometheus_http_response_size_bytes_count{handler="/"} 1

Summary(摘要)

Summary类型由 {quantile="<φ>"},_sum,_count 组成,主要用于表示一段时间内数据采样结果,它直接存储了分位数据,而不是根据统计区间计算出来的。

比如,Prometheus Server中prometheus_target_interval_length_seconds:

# HELP prometheus_target_interval_length_seconds Actual intervals between scrapes.
# TYPE prometheus_target_interval_length_seconds summary
prometheus_target_interval_length_seconds{interval="15s",quantile="0.01"} 14.9986249
prometheus_target_interval_length_seconds{interval="15s",quantile="0.05"} 14.998999
prometheus_target_interval_length_seconds{interval="15s",quantile="0.5"} 15.0000428
prometheus_target_interval_length_seconds{interval="15s",quantile="0.9"} 15.0012009
prometheus_target_interval_length_seconds{interval="15s",quantile="0.99"} 15.0016468
prometheus_target_interval_length_seconds_sum{interval="15s"} 315.0013755
prometheus_target_interval_length_seconds_count{interval="15s"} 21

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

安装Prometheus Server

从官方网站(https://prometheus.io/download/)上找到最新版本的Prometheus Sevrer软件包,如下图:

根据自己的系统下载对应的压缩包,这里以Windows为例,下载prometheus-2.19.0.windows-amd64.tar.gz。

解压后当前目录会包含默认的Prometheus配置文件promethes.yml:

# my global config
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.
# scrape_timeout is set to the global default (10s). # Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus' # metrics_path defaults to '/metrics'
# scheme defaults to 'http'. static_configs:
- targets: ['localhost:9090']

暂且不做修改,双击prometheus.exe即可启动,如下图:

访问http://localhost:9090/graph,就可以看到Prometheus自身的监控数据:

尾声

Prometheus的大致介绍已经告一段落了,但是只是万里长征的第一步,Prometheus的更多强大功能和使用方法还等待我们去挖掘。

微信公众号:万猫学社

微信扫描二维码

获得更多Java技术干货

从零开始学习Prometheus监控报警系统的更多相关文章

  1. Prometheus 监控报警系统 AlertManager 之邮件告警

    转载自:https://cloud.tencent.com/developer/article/1486483 文章目录1.Prometheus & AlertManager 介绍2.环境.软 ...

  2. 从零搭建Prometheus监控报警系统

    什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统 ...

  3. 从零开始搭建Prometheus自动监控报警系统

    从零搭建Prometheus监控报警系统 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开 ...

  4. Prometheus监控学习记录

    官方文档 Prometheus基础文档 从零开始:Prometheus 进阶之路:Prometheus —— 技巧篇 进阶之路:Prometheus —— 理解篇 prometheus的数据类型介绍 ...

  5. Spring Boot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能

    转载自:https://cloud.tencent.com/developer/article/1508319 文章目录1.Micrometer 介绍2.环境.软件准备3.Spring Boot 工程 ...

  6. Prometheus监控学习笔记之教程推荐

    最近学习K8S和基于容器的监控,发现了如下的教程质量不错,记录下来以备参考 1. K8S最佳实战(包括了K8S的Prometheus监控和EFK日志搜集) https://jimmysong.io/k ...

  7. 使用docker方式构建prometheus监控的学习

    一.背景:近期学习部署prometheus监控系统,经研究发现prometheus提供docker运行模式.根据我的经验,能够使用docker模式构建系统一定多快好省. 二.环境: 1.centos7 ...

  8. Prometheus监控学习笔记之prometheus的federation机制

    0x00 概述 有时候对于一个公司,k8s集群或是所谓的caas只是整个技术体系的一部分,往往这个时候监控系统不仅仅要k8s集群以及k8s中部署的应用,而且要监控传统部署的项目.也就是说整个监控系统不 ...

  9. Prometheus监控学习笔记之Prometheus不完全避坑指南

    0x00 概述 Prometheus 是一个开源监控系统,它本身已经成为了云原生中指标监控的事实标准,几乎所有 k8s 的核心组件以及其它云原生系统都以 Prometheus 的指标格式输出自己的运行 ...

随机推荐

  1. 9.快照持久化和AOF持久化

    持久化功能redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会把硬盘中的数据恢复到内存(redis)的里边. 数据保存到硬盘的过程就称为“持久化”效果. re ...

  2. eclipse中生成文档注释--javadoc的使用

    1.针对于单一的JAVA文件,在终端窗口中,使用 javadoc 文件名.java 即可生成文档注释: 2.在eclipse中生成文档注释: ①单击eclipse菜单栏中的[Project]菜单,该菜 ...

  3. 是时候扔掉cmder, 换上Windows Terminal

    作为一个Windows的长期用户,一直没有给款好用的终端,知道遇到了 cmder,它拯救一个习惯用Windows敲shell命令的人. 不用跟我安利macOS真香!公司上班一直用macOS,一方面确实 ...

  4. harbor越权漏洞(CVE-2019-16097)

    漏洞介绍 这个漏洞可以在注册发送post包时,加入has_admin_role:true就可以直接注册成为管理员,下图可以看看user的结构: 有很多属性,此处我们关注的是"HasAdmin ...

  5. XXE漏洞学习1

    1.test.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <! ...

  6. Rocket - debug - Example: Read Memory

    https://mp.weixin.qq.com/s/ChXNTbx94WDC72GvmE9bGA 介绍riscv-debug的使用实例:使用三种方法读取内存. 1. Using System Bus ...

  7. JavaScript 引用数据类型

    目录 1. 问题描述 2. 原因分析 3. React 中的引用数据类型 4. 业务场景 5. 参考资料 1. 问题描述 今天在写一个代码题时候, 有一个BUG 导致自己停滞好久, 该BUG 可以描述 ...

  8. 【Checkpoint】HA模式下结合zookeeper说一下checkpoint流程

    checkpoint过程 配置了HA的HDFS中,有active和standby namenode两个namenode节点.他们的内存中保存了一样的集群元数据信息,这个后续我会详细用一篇文章介绍HA, ...

  9. Java实现 蓝桥杯 算法训练 Anagrams问题

    算法训练 Anagrams问题 时间限制:1.0s 内存限制:512.0MB 问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相 ...

  10. Java实现 蓝桥杯VIP 算法训练 判定数字

    算法训练 判定数字 时间限制:1.0s 内存限制:512.0MB 编写函数,判断某个给定字符是否为数字. 样例输入 9 样例输出 yes import java.util.Scanner; publi ...