首页 > 系统相关 >利用Python开发Exporter,集成Prometheus和Grafana对进程监控

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

时间:2024-09-27 11:01:01浏览次数:1  
标签:Exporter name Python pid Grafana Prometheus

利用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.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'])


    # 创建 ThreadPoolExecutor
    with 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: 8000

pid_list: [21352, 123]

步骤3:运行Exporter

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

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:运行结果

image

标签:Exporter,name,Python,pid,Grafana,Prometheus
From: https://www.cnblogs.com/test-gang/p/18433811

相关文章

  • 8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特
    特征工程是机器学习流程中的关键步骤,在此过程中,原始数据被转换为更具意义的特征,以增强模型对数据关系的理解能力。特征工程通常涉及对现有数据应用转换,以生成或修改数据,这些转换后的数据在机器学习和数据科学的语境下用于训练模型,从而提高模型性能。本文主要介绍处理数值变量特......
  • 一篇文章教你用python玩转数据透视表PivotTable
    目录建数据透视表 配置行列字段添加列字段配置“值字段” 关闭分类汇总设置表格形式显示读取数据来透视表内容读取rowfield的内容读取valuefield的内容筛选透视表添加行标签筛选添加筛选标签(Pagefield)排序透视表 本文主要介绍excel的数据透视表常见的操......
  • python在word文档中搜索关键词,复制段落
    目录简介:打开原始word文档创建一个新的文档(存放摘抄内容)搜索关键词复制和粘贴匹配的段落简介:本文示例的流程:打开一个word文档,搜索关键词所在的段落,并将对应段落复制粘贴到新的word文档中,并标记出处文件名和页码。可以用来批量对word文档进行提取。打开原始word文......
  • 提高python读写excel单元格的效率
    目录1、批量写入一列与逐个写入一列的效率对比2、批量读取一行3、批量读取一列4、批量读取二维表格5、批量写入二维表格使用pywin32读写excel,如果逐个单元格访问,会明显感觉到执行效率很低。因为pywin32其实是python重新封装了一下com接口,交互效率本身就低。试了一......
  • [Python手撕]重排链表
    #Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defreorderList(self,head:Optional[ListNode])->None:""&quo......
  • Python线程:如何让程序跑得更快?
    引言线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以拥有多个线程,这些线程共享进程的数据空间,并能并发执行,从而提高程序的效率。在Python中使用线程,可以让我们在编写网络爬虫、多任务处理等应用时更加游刃有余。接下来,我......
  • python最经典基础算法题-10
    题目001:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n【思路】:学了lambda想耍一下,结果发现官网写的比我还简洁!n=17fenmu=range(2,n+1,2)ifn%2==0elserange(1,n+1,2)s=sum(map(lambdax:1/x,fenmu))print(s)#官网参考......
  • Python线程终止:如何优雅地结束一场“舞蹈”
    引言线程终止在多线程编程中扮演着至关重要的角色。合理地管理线程生命周期不仅能够提升程序性能,还能避免内存泄漏等问题的发生。在实际开发过程中,我们常常会遇到需要提前终止某个线程的情况,比如用户请求取消正在进行的任务、系统资源紧张时需要释放部分线程以节省资源等。掌握正......
  • python 实现gradient boosting regressor梯度增强回归器算法
    gradientboostingregressor梯度增强回归器算法介绍梯度增强回归器(GradientBoostingRegressor,简称GBR)是一种集成学习算法,专门用于解决回归问题。它通过组合多个弱学习器(通常是决策树)来构建一个强大的预测模型。以下是关于梯度增强回归器算法的详细解释:原理梯度增强回......
  • Python实现:时间序列趋势外推法应用-龚珀兹曲线拟合
    龚珀兹曲线下表数据为某跨国公司1989-2021年的年销售量数据,使用适合的模型预测该公司2022年的销售额,并得出理由。部分数据如下表(具体数据从主页资源下载):年份时序(t)总额(yt)时序应该从0开始19891138.40019902174.00119913190.55219924196.10319935230.50419946237.10519957274.......