利用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 data
except 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.1.2', 'author': '岳罡', 'blog': 'https://www.cnblogs.com/test-gang'})
def process_request(pid):
a = print_process(pid)
subprocess_info.labels(pid=f'{pid}', name=f'{a[1]}')
cpu_utilization.labels(pid=f'{pid}', name=f'{a[1]}').set(a[2])
memory.labels(pid=f'{pid}', name=f'{a[1]}').set(a[3]/1048576)
memory_usage_rate.labels(pid=f'{pid}', name=f'{a[1]}').set(a[4]) if __name__ == '__main__':
# 启动 HTTP 服务器,默认监听在 8000 端口
start_http_server(data['config']['start_http_server']) # 循环处理请求
while True:
# 创建 ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=4) as executor: # 控制线程池大小为4
# 提交任务给线程池
future = [executor.submit(process_request, pid) for pid in pid_list]
time.sleep(4)

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

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

步骤3:运行Exporter

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

3. Prometheus配置

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

步骤1:修改Prometheus配置文件

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

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

步骤2:重启Prometheus服务

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

4. Grafana配置

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

步骤1:添加Prometheus数据源

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

步骤2:导入仪表盘

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

步骤3:运行结果

利用Python开发Exporter,集成Prometheus和Grafana对进程监控的更多相关文章

  1. 利用python开发app实战

    你说,我们的未来 被装进棺材,染不上尘埃 *** 我很早之前就想开发一款app玩玩,无奈对java不够熟悉,之前也没有开发app的经验,因此一直耽搁了.最近想到尝试用python开发一款app,goo ...

  2. incubator-dolphinscheduler 如何在不写任何新代码的情况下,能快速接入到prometheus和grafana中进行监控

    一.prometheus和grafana 简介 prometheus是由谷歌研发的一款开源的监控软件,目前已经贡献给了apache 基金会托管. 监控通常分为白盒监控和黑盒监控之分. 白盒监控:通过监 ...

  3. 利用python开发的flappy bird 游戏

    python 中 pygame模块能让我们很方便的编写游戏,16年我用python 仿制了flappy bird 游戏,下面是游戏的完整代码以及素材,分享给大家. 第一个python文件,flappy ...

  4. 利用Python开发智能阅卷系统

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 机器学习与统计学 PS:如有需要Python学习资料的小伙伴可以加 ...

  5. 基于Prometheus和Grafana打造业务监控看板

    前言 业务监控对许许多多的场景都是十分有意义,业务监控看板可以让我们比较直观的看到当前业务的实时情况,然后运营人员可以根据这些情况及时对业务进行调整操作,避免业务出现大问题. 老黄曾经遇到过一次比较尴 ...

  6. python开发【第4篇】【进程、线程、协程】

    一.进程与线程概述: 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空 间. 线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的.线程有时又被称为轻 ...

  7. Python开发【笔记】:what?进程queue还能生产出线程!

    进程queue底层用线程传输数据 import threading import multiprocessing def main(): queue = multiprocessing.Queue() ...

  8. 利用python 提取log 文件里的关键句子,并进行统计分析

    利用python开发了一个提取sim.log 中的各个关键步骤中的时间并进行统计的程序: #!/usr/bin/python2.6 import re,datetime file_name='/hom ...

  9. 一次学生时代的经历,利用Python在机房杀红蜘蛛,脱离老师控制!

    这个为什么说是一次学生时代的经历呢,我的出发点并没有是为了吊胃口.确实,这个Python小应用,只能在学生时代用得着吧,尤其是高中和大学,如果你没有想到也没关系,看完我下面说的就会明白了.   在这里 ...

  10. Spark:利用Eclipse构建Spark集成开发环境

    前一篇文章“Apache Spark学习:将Spark部署到Hadoop 2.2.0上”介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上 ...

随机推荐

  1. Dell 塔式t440 安装centos (Non-Raid 成功版)

    前情提要 这篇文章是2021年我发布在csdn上,最近搬到博客园了,我把这篇文章重新整理发布下.有的图带有水印 csdn@at_the_Moment正常的,这就是我在csdn的账号. 提前声明一下这是 ...

  2. Contrastive Learning 对比学习 | RL 学 representation 时的对比学习

    记录一下读的三篇相关文章. 01. Representation Learning with Contrastive Predictive Coding arxiv:https://arxiv.org ...

  3. gitlab之配置文件.gitlab-ci.yml

    自动化部署給我们带来的好处 自动化部署的好处体现在几个方面 1.提高前端的开发效率和开发测试之间的协调效率 Before 如果按照传统的流程,在项目上线前的测试阶段,前端同学修复bug之后,要手动把代 ...

  4. 《HelloGitHub》第 104 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...

  5. 文件上传漏洞&靶场通关详解

    文件上传漏洞&靶场通关详解 什么是文件上传漏洞? 大部分网站都拥有上传文件的部分,文件上传漏洞是由于网站开发者对用户上传文件的过滤不够严格,攻击者可以通过这些漏洞上传可执行文件(如木马,恶意脚 ...

  6. Node.js Express 框架(2)

    1.读取文件并返回给客户端 res.sendFile(path):读取文件并返回给客户端,适合静态页面 app.get("/",function(req,res){ res.sen ...

  7. 远程连接利器:玩转MobaXterm

    今天这篇文章轻松不烧脑,主要是想和大家分享一下我在工作中常用的远程管理工具--MobaXterm.这款工具不仅功能强大,而且在日常的远程操作中极为高效,特别适合用来管理远程服务器.MobaXterm结 ...

  8. axmapcontrol的一点发现

    最近在做一个功能,从主窗体弹出子窗体(包含地图控件)显示地图.不过初始化的过程比较耗时(主要是连接远程数据),所以想改变鼠标样式为等待.本来是比较简单的思路 A:主窗体,B:子窗体 a.cursor= ...

  9. Typroa主题替换

    Typroa主题替换 从这里下载主题 1.解压后: 2.拷贝到typroa的主题目录下(打开typroa -> 偏好设置 -> 外观 -> 打开主题文件夹) 3.拷贝后: 4.重新打 ...

  10. 【相邻不同型贪心】LeetCode767 重构字符串

    题解 通常直接思考最佳策略是十分困难的,我们不妨思考每一种情况需要如何处理: 整个字符串只有一种字符 若字符串长度为 \(1\),那么字符串本身即为答案: 若字符串长度大于等于 \(2\),那么不存在 ...