利用Python开发Exporter,集成Prometheus和Grafana对进程监控

news/2024/11/18 15:36:21/文章来源:https://www.cnblogs.com/test-gang/p/18433811

利用Python开发Exporter,集成Prometheus和Grafana对进程监控

在现代软件开发和运维中,监控是确保系统稳定运行和快速响应问题的重要手段。Prometheus和Grafana的组合是监控领域的强大工具,它们能够收集、处理和展示各种指标数据。本文将介绍如何利用Python开发一个Exporter,通过Prometheus收集数据,并在Grafana中展示进程监控指标。

1. 环境准备

首先,确保你的环境中已经安装了Python、Prometheus和Grafana。以下是基本的安装步骤:

安装Python:Python的安装可以通过其官网下载并安装,确保版本为Python 3.x。
安装Prometheus:从Prometheus的GitHub发布页面下载对应操作系统的安装包,解压并配置。
安装Grafana:从Grafana的官网下载并安装Grafana。

2. Python Exporter开发

Exporter是Prometheus的一个组件,用于暴露监控数据给Prometheus。我们将使用Python的prometheus_client库来开发一个简单的Exporter,用于监控系统进程。

步骤1:安装三方库

在Python环境中安装prometheus_client、pyyaml、psutil库:

pip install prometheus_client
pip install pyyaml
pip install psutil

步骤2:编写Exporter脚本

创建一个Python脚本,用于收集系统进程的信息并暴露给Prometheus。

import psutil
import yaml
from prometheus_client import start_http_server, Gauge, Info
import time
from concurrent.futures import ThreadPoolExecutor# 读取YAML文件
def read_yaml(file_path):with open(file_path, 'r') as file:try:data = yaml.safe_load(file)return dataexcept yaml.YAMLError as e:print(e)# 获取进程数据
def print_process(pid):# 使用进程ID获取进程对象try:process = psutil.Process(pid)except psutil.NoSuchProcess:print(f"进程ID {pid} 不存在")time.sleep(1)return [-1, '进程不存在', 0, 0, 0]# 打印结果: 进程ID, 进程名称, CPU利用率, 内存, 内存占用率return [pid, process.name(), process.cpu_percent(interval=1), process.memory_info().rss, process.memory_percent()]# 使用函数
yaml_file_path = 'config.yml'  # 替换为你的YAML文件路径
data = read_yaml(yaml_file_path)
pid_list = data['pid_list']# exporter信息
subprocess_exporter_info = Info('subprocess_exporter_info', '子进程监控基础信息')
subprocess_info = Gauge('subprocess_info', '子进程信息', ['pid', 'name'])
cpu_utilization = Gauge('cpu_utilization', 'CPU利用率', ['pid', 'name'])
memory = Gauge('memory', '内存(MB)', ['pid', 'name'])
memory_usage_rate = Gauge('memory_usage_rate', '内存占用率', ['pid', 'name'])# 赋值
subprocess_exporter_info.info({'version': '1.0.1', 'author': '岳罡', 'blog': 'https://www.cnblogs.com/test-gang'})
def process_request(pid_lists):for i in pid_lists:a = print_process(i)subprocess_info.labels(pid=f'{i}', name=f'{a[1]}')cpu_utilization.labels(pid=f'{i}', name=f'{a[1]}').set(a[2])memory.labels(pid=f'{i}', name=f'{a[1]}').set(a[3]/1048576)memory_usage_rate.labels(pid=f'{i}', name=f'{a[1]}').set(a[4])if __name__ == '__main__':# 启动 HTTP 服务器start_http_server(data['config']['start_http_server'])# 创建 ThreadPoolExecutorwith ThreadPoolExecutor(max_workers=4) as executor:  # 控制线程池大小为4# 循环处理请求while True:# 提交任务给线程池future = executor.submit(process_request, pid_list)time.sleep(4)

创建一个yml文件,用于为python脚本传输进程PID和http_server的端口号。

config:start_http_server: 8000pid_list: [21352, 123]

步骤3:运行Exporter

运行上述Python脚本,它将在8000端口上启动一个HTTP服务器,等待Prometheus的拉取请求。
image

  • gitee仓库:https://gitee.com/qdyg/subprocess_exporter
  • github仓库:https://github.com/YueGang0725/subprocess_exporter

3. Prometheus配置

接下来,需要配置Prometheus以从我们的Exporter中拉取数据。

步骤1:修改Prometheus配置文件

找到Prometheus的配置文件(通常是prometheus.yml),并添加一个job来抓取我们的Exporter:

scrape_configs:- job_name: 'process_exporter'scrape_interval: 15sstatic_configs:- targets: ['localhost:8000']

步骤2:重启Prometheus服务

保存配置文件并重启Prometheus服务,使其加载新的配置。

4. Grafana配置

最后,在Grafana中配置数据源和仪表盘,以展示从Prometheus获取的进程监控数据。

步骤1:添加Prometheus数据源

在Grafana中,添加一个新的数据源,选择Prometheus,并填写Prometheus服务器的URL(如http://localhost:9090)。

步骤2:导入仪表盘

导入进程性能详情.json仪表盘模板

  • gitee仓库:https://gitee.com/qdyg/subprocess_exporter
  • github仓库:https://github.com/YueGang0725/subprocess_exporter

步骤3:运行结果

image

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软工结对项目

这个作业属于哪个课程 结对项目这个作业要求在哪里 结对项目这个作业的目标 合作完成一个自动生成小学四则运算题目的命令行程序结对组合成员介绍结对组合成员姓名 学号 GitHub项目地址苏清仪 3222004337 GitHub项目地址张易欣 3222004811 GitHub项目地址PSP表格PSP2.1 Persona…

Docker镜像、Spark支持多表...Apache SeaTunnel 2.3.8版本将带来的惊喜

Apache SeaTunnel 2.3.8版本即将于大家见面,近日,Apache SeaTunnel PMC Member 范佳在社区的交流会上为大家提前透露了关于这个新版本即将进行的功能与特性更新概况,详细内容如下: SeaTunnel 简介 SeaTunnel是一个高性能的开源分布式数据集成系统,支持各种数据源的实时流式…

校青协宣传推广中心-二面-作品展示

主题图片ps:主题图片引用自扬州大学青年志愿者协会官Q 作品展示

深入理解 Nuxt.js 中的 app:error 钩子

title: 深入理解 Nuxt.js 中的 app:error 钩子 date: 2024/9/27 updated: 2024/9/27 author: cmdragon excerpt: 摘要:本文深入讲解了Nuxt.js框架中的app:error钩子,介绍其在处理web应用中致命错误的重要作用、使用方法及实际应用场景。通过创建Nuxt项目、定义插件、触发错…

黑马PM-内容项目-产品需求说明

产品需求说明产品交互需求说明如何撰写产品交互需求说明

MySQL窗口函数汇总

1.窗口函数概述窗口函数是一种SQL函数,非常适合于数据分析,其最大的特点就是:输入值是从SELECT语句的结果集中的一行或者多行的"窗口"中获取的,也可以理解为窗口有大有小(行数有多有少)。通过OVER子句,窗口函数与其他的SQL函数有所区别,如果函数具有OVER子句…

深入工作流调度的内核

在大数据时代,工作流任务调度系统成为了数据处理和业务流程管理的核心组件,在大数据平台的构建和开发过程中尤为重要。随着数据量的激增和业务需求的多样化,合理的任务调度不仅能够提高资源利用率,还能保证业务流程的稳定和高效运行。本文将结合实际场景,探讨目前市面上常…

【TES817】l基于XCZU19EG FPGA的高性能实时信号处理平台

板卡概述 TES817是一款基于ZU19EG FPGA的高性能实时信号处理平台,该平台采用1片高性能的FPGA:XCZU19EG-2FFVC1760I作为主处理器,FPGA的PL端外挂1组72位DDR4 SDRAM,用来实现超大容量数据缓存,FPGA的PS端外挂1组72位的DDR4 SDRAM的高速数据缓存,用来支持操作系统的运行。 该…

PbootCms模板当列表页只有一页的时候不显示分页的小技巧

在 PBootCMS 中,如果希望在列表页只有一页时隐藏分页条,可以通过条件判断来实现。具体步骤如下: 步骤 1: 判断总页数获取总页数:使用 {page:count} 获取总页数。 判断总页数:当总页数大于 1 时显示分页条。详细解释判断总页数使用 {pboot:if([page:count] > 1)} 判断总…

PbootCMS中判断文章列表是否有缩略图并避免默认图片的显示

在PBootCMS中,为了在文章列表中展示缩略图,并避免在没有上传缩略图时显示默认图片,可以使用 isico 返回值来判断当前文章是否有缩略图。以下是一个详细的示例代码,展示了如何实现这一功能。 示例代码<ul class="note-ul">{pboot:list scode={sort:scode}}&…

PBOOTCMS模板安装后,网站首页打开版式错乱的解决方法。(为什么PBOOTCMS的模板首页错乱)

在PBootCMS模板安装后,如果发现首页打开时版式错乱,通常是由于样式表(CSS文件)没有正确加载导致的。以下是一个详细的解决方法,并将其绘制成表格形式。 解决方法检查站点信息确认后台站点信息中的域名是否正确填写。 域名必须包含 http:// 或 https://。具体步骤进入后台管…

【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题

问题现象 客户刚开始使用YashanDB odbc的时候,需要查看调用日志详情, 确认相应接口调用情况。 问题的风险及影响 客户在windows server 2016环境测试,影响测试业务的开展。 问题影响的版本 YashanDB版本:所有版本 问题发生原因 本案例是对操作的说明, 不涉及根因 解决方法…