Prometheus:开源监控解决方案的力量

前言

在当今高度数字化和云原生应用的时代,监控系统是确保系统稳定性和性能的关键组成部分。而 Prometheus 作为一种开源的监控解决方案,正在成为越来越多企业和开发者的首选。本文将深入探讨 Prometheus 的特性、优势以及如何利用它来构建强大的监控系统。

一、什么是 Prometheus

Prometheus是一种开源的系统监控和警报工具包,最初由 SoundCloud 开发并于 2012 年发布。它已成为 CNCF(Cloud Native Computing Foundation)的一部分,得到了广泛的社区支持和贡献。

Prometheus 核心特性:

  1. 多维数据模型: Prometheus 通过时间序列数据来描述监控数据。每条时间序列由指标名称和一组键值对标签唯一标识。
  2. 灵活的查询语言: PromQL 是 Prometheus 的查询语言,支持强大的多维度数据分析和聚合功能,如查询、过滤、聚合和计算。
  3. 实时警报: Prometheus 支持灵活的警报规则定义和管理,可以及时响应监控数据中的异常情况。
  4. 可扩展性和易部署: Prometheus 具有良好的可扩展性,能够与其他工具和系统集成。它也支持多种部署方式,包括单机、多机和容器化部署。
  5. 数据持久化: Prometheus 使用本地存储以简化部署和运维,并通过分片和压缩来优化存储效率。

二、Prometheus 发展历史

Prometheus 的发展历史可以追溯到 2012 年,以下是其主要发展阶段和关键事件:

  1. 创始和开源发布(2012年)
    • Prometheus 最初由 SoundCloud 的工程师团队开发,作为一种内部监控解决方案。
    • 在 2012 年,SoundCloud 将 Prometheus 开源发布,成为开放社区的一部分。
  2. 成为 CNCF 项目(2016年)
    • 2016 年,Prometheus 被 Cloud Native Computing Foundation(CNCF)接纳为其项目之一。
    • 这一举动加强了 Prometheus 在云原生和容器化技术生态系统中的地位,吸引了更广泛的社区参与和贡献。
  3. 1.0 版本发布(2016年)
    • 2016 年 11 月,Prometheus 发布了 1.0 版本,标志着其稳定性和生产就绪性的确认。
    • 此版本的发布进一步推动了 Prometheus 在企业和开发者社区中的广泛采用。
  4. 生态系统扩展(2017年以后)
    • 随着时间的推移,Prometheus 生态系统迅速扩展,包括各种 Exporter、集成插件、客户端库和可视化工具的增加。
    • 社区贡献者和合作伙伴不断推动 Prometheus 功能和兼容性的增强。
  5. PromQL 和功能增强
    • Prometheus 的查询语言 PromQL 在功能上不断演进,增加了更多复杂的查询和聚合功能,使其更适合于复杂的监控和分析场景。
  6. Cloud Native 推广(2018年以后)
    • 随着云原生技术的兴起,Prometheus 作为一种本地的云原生监控解决方案得到了广泛应用。
    • 它与 Kubernetes 等容器编排平台的集成使其成为云原生应用监控的重要组成部分。
  7. 持续发展和更新
    • Prometheus 继续保持活跃的开发和更新状态,定期发布新版本,以应对新的技术挑战和用户需求。
    • 其在监控、告警、数据存储和可扩展性方面的不断改进,使其保持了领先地位。

三、Prometheus 应用场景

Prometheus 作为一种灵活、强大的开源监控解决方案,适用于多种应用场景。

  1. 微服务架构监控
    • 在微服务架构中,通常有多个服务实例运行并且动态变化。Prometheus 能够轻松地监控每个服务的性能指标,如请求响应时间、吞吐量、错误率等。
    • Prometheus 的多维数据模型和灵活的查询语言(PromQL)使得在高度动态的微服务环境中进行监控成为可能。
  2. 容器化环境监控
    • 在使用容器编排工具如 Kubernetes 管理容器化应用时,Prometheus 可以集成到 Kubernetes 的监控解决方案中。
    • 它能够监控每个容器的资源使用情况(CPU、内存、存储)、容器健康状态以及整个集群的性能指标,帮助运维团队实时了解和管理系统状态。
  3. 云原生监控
    • 作为云原生应用的一部分,Prometheus 支持自动扩展和弹性架构的监控需求。
    • 它能够与云平台(如 AWS、Azure、Google Cloud)集成,并与其他云原生工具(如 Kubernetes、Prometheus Operator)配合使用,为云环境提供完整的监控解决方案。
  4. 基础设施监控
    • Prometheus 不仅可以监控应用程序层面的指标,还可以监控底层的基础设施组件,如服务器、网络设备、数据库等。
    • 通过 Exporter 或者其他集成方式,Prometheus 能够收集和展示关键的基础设施数据,帮助运维人员及时发现和解决问题。
  5. 自定义监控需求
    • Prometheus 提供了丰富的 API 和插件系统,用户可以根据自己的需求扩展和定制监控功能。
    • 可以通过编写自定义的 Exporter 或者使用已有的 Exporter 来监控特定的应用程序或服务。
  6. 大数据监控
    • 对于需要大规模数据处理和分析的场景,Prometheus 的数据模型和查询语言可以处理海量的时间序列数据,并支持高效的数据存储和查询。

四、Prometheus 体系结构

Prometheus 的体系结构主要包括以下几个关键组件:

  1. Prometheus Server
    • Prometheus Server 是整个监控系统的核心组件,负责收集、存储和查询时间序列数据
    • 它定期通过 HTTP 协议从各个目标(如应用程序、服务、服务器)中拉取指标数据,并将数据存储在本地的时间序列数据库中。
    • Prometheus Server 还提供了一个内置的 Web 界面,可以用于查询和可视化监控数据。
  2. Exporter
    • Exporter 是用于将各种应用程序、服务或系统的指标数据暴露给 Prometheus Server 的代理程序
    • Prometheus 生态系统中有许多现成的 Exporter,如 Node Exporter(用于主机监控)、Blackbox Exporter(用于网络监控)等。
    • 用户也可以编写自定义的 Exporter 来暴露特定应用程序或系统的指标数据。
  3. Pushgateway
    • Pushgateway 允许临时作业(如批处理任务、短期作业)向 Prometheus 推送指标数据
    • 通过 Pushgateway,这些作业可以把采集到的数据推送给 Prometheus Server,而不需要直接与Prometheus Server 通信。
  4. Alertmanager
    • Alertmanager 用于处理由 Prometheus Server 生成的警报信息
    • 它能够根据预先定义的规则对警报进行分类、去重、分组,并发送通知到各种不同的接收端,如电子邮件、Slack 等。
  5. PromQL
    • PromQL 是 Prometheus 的查询语言,用于从时间序列数据库中检索和分析数据。
    • 用户可以使用 PromQL 编写灵活的查询来获取所需的监控数据,并进行各种数据操作和计算。
  6. 存储
    • Prometheus 使用本地存储来保存时间序列数据,默认情况下采用 TSDB(Time Series Database)进行存储。
    • 存储层负责有效地管理和压缩数据,以便进行快速查询和检索。

五、Prometheus 快速入门

Prometheus 是一款数据的监控工具,为了可视化这些监控数据,可以搭配使用 Grafana 可视化工具。使用 Docker Compose 快速部署 Prometheus 和 Grafana 是一个高效的方法,我们以此来演示 Prometheus 的使用。

  1. 安装 Docker 和 Docker Compose:首先确保你的系统已经安装了 Docker 和 Docker Compose。如果没有安装,请参考官方文档进行安装。

  2. 创建项目目录:在你的工作目录下创建一个新的目录,例如 prometheus-grafana,然后进入该目录:

    mkdir prometheus-grafana
    cd prometheus-grafana
    
  3. 创建 Docker Compose 配置文件:在目录中创建一个 docker-compose.yml 文件,内容如下:

    version: '3.8'  # 定义 Docker Compose 文件的版本
    
    services:  # 定义要运行的服务
      prometheus:  # Prometheus 服务配置
        image: prom/prometheus:latest  # 使用的 Prometheus 镜像
        container_name: prometheus  # 容器名称
        volumes:
          - ./prometheus:/etc/prometheus  # 将本地目录映射到容器内的 Prometheus 配置目录
        ports:
          - "9090:9090"  # 将容器的 9090 端口映射到宿主机的 9090 端口
    
      grafana:  # Grafana 服务配置
        image: grafana/grafana:latest  # 使用的 Grafana 镜像
        container_name: grafana  # 容器名称
        depends_on:
          - prometheus  # 定义依赖关系,确保 Prometheus 在 Grafana 之前启动
        ports:
          - "3000:3000"  # 将容器的 3000 端口映射到宿主机的 3000 端口
        environment:
          - GF_SECURITY_ADMIN_PASSWORD=admin  # 设置 Grafana 管理员密码为 admin
        volumes:
          - grafana-storage:/var/lib/grafana  # 将 Grafana 的数据目录映射到本地卷
    
    volumes:  # 定义 Docker 数据卷
      grafana-storage:  # Grafana 数据卷
    
  4. 创建 Prometheus 配置文件:在项目目录下创建一个 prometheus 目录,并在其中创建一个 prometheus.yml 文件,内容如下:

    global:
      scrape_interval: 15s # 拉取间隔
    
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
    
  5. 启动服务:在项目目录下运行以下命令来启动 Prometheus 和 Grafana:

    docker-compose up -d
    
  6. 访问 Web 界面: Prometheus Web 界面功能单一,Grafana Web 界面功能比较丰富

    • 通过浏览器地址 http://localhost:9090 访问 Prometheus Web 界面

      image.png

    • 通过浏览器地址 http://localhost:3000 访问 Grafana Web 界面

      默认情况下,Grafana 的管理员用户名为 admin,密码为 admin(可以在 docker-compose.yml 中通过 GF_SECURITY_ADMIN_PASSWORD 环境变量更改)。

      image.png

六、Prometheus 监控指标

Prometheus + Grafana 搭建好之后,我们可以监控想要监控的指标。例如在 Grafana 中进行配置:

image.png

当配置好之后,我们可以看到如下效果:

image.png

我们可以针对同一指标选择不同图形进行展示,例如:

image.png

以上的 CPU 指标,是 Prometheus 中内置的,如果我们想要监控自己开发项目的指标该如何做呢?

以 SpringBoot 项目为例,在 SpringBoot 应用程序中集成 Prometheus 监控,通常需要通过以下步骤进行配置和实现:

  1. 添加 Prometheus 客户端库依赖: 首先,在 Spring Boot 项目中,需要添加 Prometheus 客户端库的依赖。Prometheus 提供了多种语言的客户端库,用于在应用程序中暴露和格式化监控指标,例如在 Java 中使用 prometheus/client_java 库。

    <dependency>
      <groupId>io.prometheus</groupId>
      <artifactId>simpleclient_spring_boot</artifactId>
      <version>0.11.0</version>
    </dependency>
    
  2. 配置 Spring Boot 应用:在 Spring Boot 应用程序的配置中,需要将 Prometheus 的相关配置信息集成进来。通常,这包括将 Prometheus 客户端库配置为自动配置,并设置指标的基本信息。

    @SpringBootApplication
    public class YourApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(YourApplication.class, args);
        }
    
        // 定义一个 Bean,配置 Prometheus 客户端的 Spring Boot 指标收集器
        @Bean
        public SpringBootMetricsCollector springBootMetricsCollector(Collection<PublicMetrics> publicMetrics) {
            // 创建 SpringBootMetricsCollector 对象,传入 PublicMetrics 集合作为参数
            return new SpringBootMetricsCollector(publicMetrics);
        }
    
    }
    
  3. 暴露 Metrics 端点:Spring Boot 应用程序默认提供了 /actuator/metrics 端点,该端点用于公开应用程序的各种指标。为了确保 Prometheus 能够正确抓取这些指标,你需要确保以下操作:

    management:  # 管理端点配置
      endpoints:  # 端点配置
        web:  # web 端点配置
          exposure:  # 暴露配置
            include: prometheus  # 包含 prometheus 端点
    
  4. 配置 Prometheus:最后,需要配置 Prometheus 以从 Spring Boot 应用程序中抓取指标。在 Prometheus 的配置文件 prometheus.yml 中,添加以下内容:

    scrape_configs:
      - job_name: 'spring-boot-app'  # 定义作业名称,用于标识这个抓取作业
        metrics_path: '/actuator/prometheus'  # 指定应用程序暴露指标的路径
    
        static_configs:
          - targets: ['your_spring_boot_app_host:port']  # 指定要抓取数据的目标地址
    

    在上述配置中:

    • job_name 是 Prometheus 用来标识这个任务的名称。
    • metrics_path 是 Spring Boot 应用程序暴露监控指标的路径,默认为 /actuator/prometheus
    • targets 是 Spring Boot 应用程序的主机和端口。

七、小结

Prometheus 作为一款功能强大且灵活的监控系统,在当今快速发展的技术领域中扮演着至关重要的角色。其简单的部署方式、强大的查询语言和多维度数据模型,使得开发人员和运维团队能够更加高效地管理和监控复杂的应用环境。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

圈复杂度.

圈复杂度是衡量代码的重要标准 配置&#xff1a; eslint里面&#xff1a;rules&#xff1a;complexity&#xff1a;[error,10]

第28课 绘制原理图——绘制导线

概述 放置完元器件之后&#xff0c;接着就要用导线将元器件的管脚一个一个连起来了。 绘制导线的方法 点击快速工具条上的“线”命令&#xff0c;进入绘制导线的过程。 点击选择某个管脚或电源端口&#xff0c;作为导线的起始端。 再点击选择另一个管脚或电源端口&#xff0c…

为什么永远不会有语言取代 C/C++?

每个 CPU 都带有一种称为 ISA&#xff08;指令集架构&#xff09;汇编的电路语言。ISA 程序集是一种硬件语言&#xff0c;由基本数据操作、数学计算和结构化编程&#xff08;即 jmp&#xff09;的操作组成。但是&#xff0c;为每个计算需求编写汇编代码无疑是耗时的&#xff0c…

(六)使用统计学方法进行变量有效性测试(43道选择题)

本文整理了使用统计学方法进行变量有效性测试相关的练习题&#xff0c;共43道&#xff0c;适用于想巩固理论基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;CDA二级-第7章&#xff09;。 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09;…

pinia.js报patchToApply.hasOwnProperty is not a function

vue3 ts pinia.js 先看报错> patchToApply.hasOwnProperty is not a function 错误信息&#xff1a; pinia.js?v91704efd:913 Uncaught (in promise) TypeError: patchToApply.hasOwnProperty is not a functionat mergeReactiveObjects (pinia.js?v91704efd:913:23)…

YOLOv5改进(七)--改进损失函数EIoU、Alpha-IoU、SIoU、Focal-EIOU

文章目录 1、前言2、损失函数代码实现2.1、修改metrics.py2.2、修改loss.py 3、替换EIOU4、替换SIoU5、替换Alpha-IoU6、替换Focal-EIOU7、目标检测系列文章 1、前言 YOLOv5默认使用损失函数为CIoU&#xff0c;本文主要针对损失函数进行修改&#xff0c;主要将bbox_iou函数进行…

昇思25天学习打卡营第2天|onereal》

今天学习内容是了解华为昇思平台。虽然打了卡&#xff0c;但是我的jupyter里面并没有播放按钮&#xff0c;所以还是无法运行代码。反映给昇思吴彦祖小哥了&#xff0c;他说需要专家帮我解决。 我还是要自我表扬一下&#xff0c;不懂就问&#xff0c;切莫不懂装懂&#xff0c;那…

充电宝哪个牌子最好最耐用?耐用西圣、罗马仕、绿联充电宝实测

目前充电宝是我们出行必备的“能量伴侣”。然而&#xff0c;市面上充电宝品牌繁多&#xff0c;让人眼花缭乱&#xff0c;究竟哪个牌子最好最耐用呢&#xff1f;为了给大家找到答案&#xff0c;我们精心挑选了西圣、罗马仕和绿联这三个备受关注的品牌&#xff0c;并对它们的充电…

clion调试opencv程序时,查看内存中图像的方法

很久之前在windows上使用 visual studio中 Image Watch插件查看内存中图像感觉很方便&#xff0c;后来转到liunx上开发后&#xff0c;在clion上一直没有找到对应的插件。之前看到过qtOpenImageDebugger好像有类似功能&#xff0c;vs code好像也可以&#xff0c;但是没有配置。 …

文华6幅图指标公式大全-多空精准买卖点提示指标源码

文华6幅图指标公式大全-多空精准买卖点提示指标源码&#xff1a; HH: HHV ( HIGH ,1)/5 HHV ( HIGH ,2)/5 HHV ( HIGH ,2)/5 HHV ( HIGH ,5)/5 HHV ( HIGH ,8)/5; LL: LLV ( LOW ,1)/5 LLV ( LOW ,2)/5 LLV ( LOW ,2)/5 LLV ( LOW ,5)/5 LLV ( LOW ,8)/5; H1: IFELSE ( H &l…

18.枚举

学习知识&#xff1a;枚举类型、相关的使用方法 Main.java&#xff1a; public class Main {public static void main(String[] args) {myenum[] colorlist myenum.values();//获取枚举中所有对象的引用数组for (myenum one : colorlist){System.out.println(one.toString(…

git提交新仓库代码,提示无权限,但用户名已修改

目录 1 用户名无权限 2 删除用户凭据 2.1 打开控制面板 2.2 找到“凭据管理器” 2.3 删除git历史 3 npm工具库添加git仓库指引 1 用户名无权限 之前因为时间的原因&#xff0c;js-tool-big-box工具库没有提交到github上去&#xff0c;今天想着往上提交一下&#xff0c;但…

如何打造安全DNS以保障业务可用?一文解读

DNS自1987年被实施以来&#xff0c;已成为网络通信中最重要的核心基础设施&#xff0c;同时也是企业对外提供数字服务的关键。没有正常安全的DNS服务&#xff0c;企业经营也就无从谈起。在DNS攻击逐年上升且容易被忽略的现代应用时代&#xff0c;如何打造安全DNS&#xff1f;本…

Mybatis操作数据库(二)

动态SQL 在 MyBatis 中&#xff0c;动态 SQL 是一种强大的特性&#xff0c;它允许根据不同的条件和场景在 SQL 语句中动态地组合和构建部分语句 < if>标签 我们在注册用户的时候,可能会有一个问题注册有两个字段 必填字段和非必填字段,这时我们需要使用动态标签来判定 例…

数据库管理与数据库语句

数据库用户管理及高级sql语句 数据库管理 数据库用户管理 mysql权限表 在mysql中mysql库中的user表是最重要的权限表&#xff0c;记录允许连接到服务器的账号信息以及全局权限&#xff0c; 在mysql库中db和host表也是重要的权限表 db表中存储了用户对某个数据库的操作权限&…

CS-流量通讯特征修改-端口store证书流量通讯规则

免责声明:本文仅做技术交流与学习... 目录 1.修改默认端口&#xff1a; 2.去除store证书特征&#xff1a; 查看证书指纹&#xff1a; 生成证书指纹&#xff1a; 应用证书指纹&#xff1a; 3.去除流量通讯特征&#xff1a; 规则资源 http流量特征修改: https流量特征修改:…

Web APIs-DOM-事件相关整理(完成网页交互)

目录 1.事件监听 2.事件监听绑定 3.事件类型 4.实例注意 5.事件对象 6.环境对象 7.回调函数 1.事件监听 &#xff08;绑定事件/注册事件&#xff09;: 程序检测有没有事件产生&#xff08;事件&#xff1a;比如单机一个按钮&#xff08;编程时系统发生的动作或者事情&a…

C++ 14新特性个人总结

variable templates 变量模板。这个特性允许模板被用于定义变量&#xff0c;就像之前模板可以用于定义函数或类型一样。变量模板为模板编程带来了新的灵活性&#xff0c;特别是在定义泛化的常量和元编程时非常有用。 变量模板的基本语法 变量模板的声明遵循以下基本语法&am…

云计算基础知识

前言&#xff1a; 随着ICT技术的高速发展&#xff0c;企业架构对计算、存储、网络资源的需求更高&#xff0c;急需一种新的架构来承载业务&#xff0c;以获得持续&#xff0c;高速&#xff0c;高效的发展&#xff0c;云计算应运而生。 云计算背景 信息大爆炸时代&#xff1a…

HttpServletRequest・getContentLeng・getContentType区别

getContentLength()&#xff1a; 获取客户端发送到服务器的HTTP请求主体内容的字节数&#xff08;长度&#xff09; 如果请求没有正文内容&#xff08;如GET&#xff09;&#xff0c;或者请求头中没有包含Content-Length字段&#xff0c;则该方法返回 -1 getContentType()&am…