prometheus client_java实现进程的CPU、内存、IO、流量的可观测

文章目录

    • 1、获取进程信息的方法
      • 1.1、通过读取/proc目录获取进程相关信息
      • 1.2、通过Linux命令获取进程信息
        • 1.2.1、top(CPU/内存)命令
        • 1.2.2、iotop(磁盘IO)命令
        • 1.2.3、nethogs(流量)命令
    • 2、使用prometheus client_java实现
    • 3、最终运行效果
      • 3.1、client_java在浏览器访问效果
      • 3.2、接入prometheus和Grafana访问效果

1、获取进程信息的方法

1.1、通过读取/proc目录获取进程相关信息

在Linux系统中,/proc 目录下的文件和文件夹代表了系统中的进程和硬件信息,包括CPU、内存、硬盘、网络等。它是一个虚拟文件系统(/proc),通过访问这个虚拟文件系统中的特殊文件,可以获取到系统的各种信息。常用的proc命令的用法和功能:

proc/cpuinfo # 这个文件显示了系统中的CPU信息,包括CPU型号、频率、缓存大小等。
proc/meminfo # 此文件显示了系统的内存使用情况,包括总内存、可用内存、缓存、交换空间等。
proc/version # 这个文件显示了当前正在运行的内核版本信息。
proc/filesystems # 此文件列出了当前系统支持的文件系统类型。
proc/net/dev # 这个文件显示了网络接口的统计信息,包括接口名称、接收和发送的数据包数量等。
proc/loadavg # 此文件显示了系统的平均负载情况,包括1分钟、5分钟和15分钟的平均负载值。
proc/sys/kernel # 此文件夹包含了一些内核参数的配置文件,可以通过修改这些文件来改变系统的行为。
/proc/[pid] # 目录是Linux系统中的一个虚拟文件系统目录,它包含了有关进程的信息,每个进程都有一个对应的/proc/pid目录。通过读取/proc/pid目录中的文件,可以及时了解进程的状态和运行情况,方便进行进程管理和调试。# 常见的/proc/[pid]信息
/proc/pid/attr # 安全相关的选项
/proc/pid/autogroup # 该目录包含了进程的自动分组信息。
/proc/pid/auxv # 该文件包含了进程的辅助向量信息。
/proc/pid/cgroup # 该文件包含了进程所在的控制组信息。
/proc/pid/clear_refs # 该文件用于清除进程使用的匿名内存页的引用计数。
/proc/pid/cmdline #该文件包含了进程启动时使用的命令行参数。
/proc/pid/comm # 该文件包含了进程的命令名。
/proc/pid/coredump_filter # 该文件包含了进程的转储核心过滤器。
/proc/pid/cpuset # 该文件包含了进程所在的CPU集合信息。
/proc/pid/cwd # 该文件是一个符号链接,指向当前进程的工作目录。
/proc/pid/environ # 该文件包含了进程的环境变量列表。
/proc/pid/exe # 该文件是一个符号链接,指向当前进程正在执行的可执行文件。
/proc/pid/fd # 该目录包含了当前进程打开的文件描述符列表。
/proc/pid/fdinfo # 该目录包含了当前进程打开的文件描述符信息。
/proc/pid/io # IO信息
/proc/pid/limits # 该文件包含了进程的资源限制信息。
/proc/pid/maps # 该文件包含了进程的内存映射信息。
/proc/pid/mem # 该文件包含了进程在内存中的内容。
/proc/pid/mountinfo # 该文件包含了进程所挂载的文件系统信息。
/proc/pid/mounts # 该文件包含了进程所挂载的文件系统信息,与mountinfo文件类似。
/proc/pid/mountstas # 该文件包含了进程所挂载的文件系统的统计信息。
/proc/pid/ns/ # 该目录包含了进程的命名空间信息。
/proc/pid/ns/ipc # 该文件是一个符号链接,指向进程的IPC命名空间。
/proc/pid/ns/net # 该文件是一个符号链接,指向进程的网络命名空间。
/proc/pid/ns/uts # 该文件是一个符号链接,指向进程的UTS命名空间。
/proc/pid/numa_maps # 该文件包含了进程的NUMA内存映射信息。
/proc/pid/oom_adj # 该文件包含了进程的OOM(Out of Memory)值,即内存不足时该进程被杀死的优先级。
/proc/pid/oom_score # 该文件包含了进程的OOM得分,即OOM杀死该进程的优先级。
/proc/pid/oom_adj_score # 该文件包含了进程的OOM值和OOM得分。
/proc/pid/root # 该文件是一个符号链接,指向进程的根目录。
/proc/pid/smaps # 该文件包含了进程的内存使用情况,与/proc/pid/maps文件类似,但提供了更详细的信息。
/proc/pid/stat # 该文件包含了进程的状态信息,如进程ID、父进程ID、状态、CPU使用情况等。
/proc/pid/statm # 该文件包含了进程的内存使用信息,如内存大小、共享内存大小、代码大小等。
/proc/pid/status # 该文件包含了进程的状态信息,如进程的状态、CPU使用情况、内存使用情况等。
/proc/pid/task # 该目录包含了当前进程的线程列表,每个线程都有一个对应的子目录。

1.2、通过Linux命令获取进程信息

1.2.1、top(CPU/内存)命令
# 使用方式
top 的使用方式 top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]-d delay	#delay代表秒数,表示top命令显示的页面更新一次的间隔(default=5s)
-b	#以批次的方式执行top
-p	#-p pid 仅显示指定进程 ID 的信息
-u	#-u username 仅显示指定用户名的进程信息
-S	#累计显示进程的 CPU 使用时间
-c	#显示完整的命令行而不截断
-i	#不显示闲置(idle)或无用的进程
-H	#在进程信息中显示线程的详细信息
-n	#与-b配合使用,表示需要进行几次top命令的输出结果
-p	#指定特定的pid进程号进行观察# top 命令显示的页面还可以输入以下按键执行相应的功能(注意区分大小写)
?	#显示在top页面中可以输入的命令
P	#以 CPU 的使用资源排序显示
M	#以内存的使用资源排序显示
N	#以 PID 排序显示
T	#由进程使用的时间累计排序显示
k	#给某一个 pid 一个信号,可以用来杀死进程(9)
r	#给某个 pid 重新定制一个 nice 值(即优先级)
q	#退出 top (用 ctrl + c 也可以退出 top)# 结果参数说明:
PID     # 进程 ID
USER    # 进程所有者
PR      # 优先级
NI      # nice 值
VIRT    # 虚拟内存大小
RES     # 常驻集大小,即物理内存大小
SHR     # 共享内存大小
S       # 进程状态
%CPU    # CPU 使用率
%MEM    # 内存使用率
TIME+   # CPU 时间累计
COMMAND # 命令名称或命令行
1.2.2、iotop(磁盘IO)命令
#1、前置条件
#    1:内核版本为2.6.20或更高版本
#    2:Python 2.7或更高的版本
#2、yum安装 
yum -y install iotop
#3、源码安装
wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.gz
tar -zxvf iotop-0.6.tar.gz
cd iotop-0.6
python setup.py build
python setup.py install#运行命令选项
iotop -oP  # 仅仅显示有IO的进程
--version #显示版本号
-h, --help #显示帮助信息
-o, --only # 只显示有 I/O 活动的进程,避免显示那些没有任何 I/O 操作的进程
-b, --batch # 批量模式,用于记录日志或分析,输出一次后自动退出,常用于将数据重定向到文件。
-n NUM, --iter=NUM #在非交互式模式下,设置显示的次数,
-d SEC, --delay=SEC # 指定每次刷新的时间间隔(以秒为单位),默认为 1 秒。
-p PID, --pid=PID #只显示指定PID的信息
-u USER, --user=USER #显示指定的用户的进程的信息
-P, --processes #只显示进程,一般为显示所有的线程
-a, --accumulated #显示从iotop启动后每个线程完成了的IO总数
-k, --kilobytes # 以 KB/s 为单位显示 I/O 速率,默认显示 B/s。
-t, --time #在每一行前添加一个当前的时间# 结果说明
TID                #线程号或进程号
PRIO               #线程运行时的I/O优先级
USER               #进程所属用户
DISK READ          #刷新时间间隔内读取数据量
DISK WRITE         #刷新时间间隔内写入数据量
SWAPIN             #每个进程的交换使用率
IO                 #每个进程的 I/O 利用率,包含磁盘和交换
COMMAND            #进程名字
1.2.3、nethogs(流量)命令
# 安装
yum方式安装Nethogs
安装依赖
yum install epel-release
yum install nethogs# 运行命令选项
nethogs ens33 -t -v 0 -d 5 -c 2
nethogs -t -v 0 -d 5 -c 2-V # 打印版本信息
-h # 帮助信息
-b # 以“bughunt”模式运行(隐式tracemode),并显示每个进程的网络使用情况和其他相关信息
-d # 指定刷新间隔的秒数,默认为1秒。
-v # 流量显示模式 (0 = KB/s, 1 = total KB, 2 = total B, 3 = total MB). 默认 0
-c # 更新次数。默认值为0(无限制)
-t # 跟踪模式,以文本模式显示结果,记录下每一次刷新的流量信息
-p # 在混杂模式下监听流量(不推荐)
-s # 按发送流量进行排序

2、使用prometheus client_java实现

本文使用《Prometheus监控java应用》的prometheus的“client_java”库实现自定义Exporter,使用zt-exec库执行top、iotop、nethogs命令获取进程的CPU使用率、内存使用率、IO读写速度、发送接收流量信息,这里省略实现代码。

3、最终运行效果

3.1、client_java在浏览器访问效果

在这里插入图片描述

3.2、接入prometheus和Grafana访问效果

在这里插入图片描述

在这里插入图片描述

附件:task_exporter(审核中)
已使用graalvm构建的二进制文件,不依赖jdk,在cetnos7、8下运行测试正常,运行命令

./task_exporter

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

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

相关文章

AAA Mysql与redis的主从复制原理

一 :Mysql主从复制 重要的两个日志文件:bin log 和 relay log bin log:二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log:用来保存从节点I/O线程接受的bin log日志…

用凡尔码系统进行隐患排查二维码的制作

隐患排查是企业安全管理的重要环节,通过定期或不定期地对生产设备、作业场所、作业人员等进行检查,发现并消除安全隐患,预防事故的发生。隐患排查的效率和质量直接影响到企业的安全生产水平和经济效益。 传统的隐患排查方法主要依靠纸质进行…

PostgreSQL学习笔记七:常规SQL操作

PostgreSQL 支持标准的 SQL 语句,同时也扩展了一些特有的功能。以下是一些常规的 SQL 语句示例,这些示例涵盖了数据定义、数据操作和数据查询的基本操作: 数据定义语言 (DDL 创建数据库: CREATE DATABASE mydatabase;创建表&#…

Vue/组件的生命周期

这篇文章借鉴了coderwhy大佬的Vue生命周期 在Vue实例化或者创建组件的过程中 内部涉及到一系列复杂的阶段 每一个阶段的前后时机都可能对应一个钩子函数 以下是我根据coderwhy大佬文章对于每一个阶段的一些看法 1.过程一 首先实例化Vue或者组件 在实例化之前 会对应一个钩子函…

安装最新 MySQL 8.0 数据库(教学用)

安装 MySQL 8.0 数据库(教学用) 文章目录 安装 MySQL 8.0 数据库(教学用)前言MySQL历史一、第一步二、下载三、安装四、使用五、语法总结 前言 根据 DB-Engines 网站的数据库流行度排名(2024年)&#xff0…

使用 Go 语言与 Redis 构建高效缓存与消息队列系统

什么是 Redis? Redis 是一个开源的内存数据库,支持多种数据结构,包括字符串、列表、集合、哈希和有序集合。由于 Redis 运行在内存中,读写速度极快,常被用于构建缓存系统、实时排行榜、会话存储和消息队列等高并发场景…

【浏览器】如何正确使用Microsoft Edge

1、清理主页广告 如今的Microsoft Edge 浏览器 主页太乱了,各种广告推送,点右上角⚙️设置,把快速链接、网站导航、信息提要、背景等全部关闭。这样你就能得到一个超级清爽的主页。 网站导航       关闭 …

十款文件防泄密软件推荐,保护您的重要信息

信息安全是现代社会不可忽视的重要话题,尤其是在工作和生活中接触到大量敏感数据时。选择合适的文件防泄密软件,可以有效防止信息泄露。以下是我们为您推荐的十款优秀软件。 Ping32 以高效的文件加密功能而闻名,Ping32 可以轻松保护您的文件&…

【JavaEE】——回显服务器的实现

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:引入 1:基本概念 二:UDP socket API使用 1:socke…

笔记||VUE3

侦听器 | Vue.js (vuejs.org) 模板引用 | Vue.js (vuejs.org)

R语言绘制散点图

散点图是一种在直角坐标系中用数据点直观呈现两个变量之间关系、可检测异常值并探索数据分布的可视化图表。它是一种常用的数据可视化工具,我们通过不同的参数调整和包的使用,可以创建出满足各种需求的散点图。 常用绘制散点图的函数有plot()函数和ggpl…

SpringCloud学习记录|day4

学习材料 2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等) 网关 微服务下,好多不同地址和端口,而前端只知道8080,这怎么解决&…

《Programming from the Ground Up》阅读笔记:p217-p238

《Programming from the Ground Up》学习第11天,p217-p238总结,总计22页。 一、技术总结 1.C compiling p216, C compiling is split into two stages - the preprocessor and the main compiler。 注:感觉这个写法不好,因为p…

Java实体对象转换利器MapStruct详解

概述 现在的JAVA项目多数采用分层结构,参考《阿里巴巴JAVA开发手册》。 分层之后,每一层都有自己的领域模型,即不同类型的 Bean:  DO ( Data Object ) :与数据库表结构一一对应,…

acwing:1576. 再次树遍历

打卡一道有意义的题。 题签: 通过使用栈可以以非递归方式实现二叉树的中序遍历。 例如,假设遍历一个如下图所示的 66 节点的二叉树(节点编号从 11 到 66)。 则堆栈操作为:push(1); push(2); push(3); pop(); pop(); pu…

【HTML】defer 和 async 属性在 script 标签中分别有什么作用?

需要这两个属性的原因? 首先我们要知道的是,浏览器在解析 HTML 的过程中,遇到了 script 元素是不能继续构建 DOM 树的。 它会停止解析构建,首先去下载 js 代码,并且执行 js 的脚本;只有在等到 js 脚本执行…

AI训练 | 如何控制单篇文章不传给AI训练

随着生成式AI技术的普及,越来越多的企业开始使用AI工具来提升效率,但与此同时,关于AI训练的争议也越来越多。比如,2个月前字节跳动和WPS因为内容因为AI训练,引发了创作者的广泛讨论。这种对未经许可内容被“喂养”AI模…

draw.io创建自定义形状

Create custom shapes in draw.io using the text editor Reference draw怎么创建和编辑复杂的自定义形状 https://blog.csdn.net/u012028275/article/details/113828875 Create custom shapes in draw.io using the text editor

LeetCode讲解篇之377. 组合总和 Ⅳ

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 总和为target的元素组合个数 可以由 总和为target - nums[j]的元素组合个数 转换而来,其中j为nums所有元素的下标 而总和target - nums[j]的元素组合个数 可以由 总和为target - nums[j] - nums[k]的…

C++模版SFIANE应用踩的一个小坑

一天一个C大佬同事&#xff0c;突然截图过来一段代码&#xff1a;这写的啥呀&#xff0c;啰里吧嗦的&#xff0c;这个构造函数模板参数T1感觉是多余的呀 template<class T> class TestClass { public:TestClass(){}//函数1template<class T1 T, std::enable_if_t<…