[golang]-prometheus获取物理cpu热区的温度

2023-10-18 00:20

本文主要是介绍[golang]-prometheus获取物理cpu热区的温度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导语:golang,通过prometheus获取物理cpu热区的温度

package collectorimport ("bytes""encoding/json""fmt""os/exec""strconv""strings""github.com/go-kit/log""github.com/prometheus/client_golang/prometheus""github.com/shirou/gopsutil/cpu"
)const (// 定义自定义数据指标的子系统名称// 这里可能改成temp_metrics好点tempMetricsSubsystem = "temp_metrics"
)// 定义 tempMetricsCollector 结构体
type tempMetricsCollector struct {logger log.Logger//...
}type TempStat struct {CPU int32 `json:"cpu"`// Temp       float64 `json:"temp"`PhysicalID string `json:"physicalId"`
}func init() {// 在该函数中调用 registerCollector() 函数,注册自定义 tempMetricsCollectorregisterCollector("temp_metrics", defaultEnabled, NewTempMetricsCollector)
}// 定义 tempMetricsCollector 的工厂函数,后续传入 registerCollector() 函数中,以便创建 tempMetricsCollector 对象
func NewTempMetricsCollector(logger log.Logger) (Collector, error) {return &tempMetricsCollector{logger: logger,}, nil
}// 实现 Update() 函数,以便在处理请求时被 Collector.Collect() 调用
func (c *tempMetricsCollector) Update(ch chan<- prometheus.Metric) error {var metricType prometheus.ValueTypemetricType = prometheus.CounterValuem := make(map[string]float64)infos, err := cpu.Info()if err != nil {return fmt.Errorf("couldn't get cpunfo: %s", err)}// 把切片里的有效数据放到map中for _, info := range infos {data, _ := json.MarshalIndent(info, "", " ")var p InfoStaterr := json.Unmarshal(data, &p)if err != nil {fmt.Println("temp json err:", err)}// cpu_no := string(p.CPU)// 获取cpu温度//执行/sys/class/thermal/thermal_zone$cpu_id/temp 并输出返回文本cmd_line1 := fmt.Sprintf("%s%d%s", "cat /sys/class/thermal/thermal_zone", p.CPU, "/temp")cmd1 := exec.Command("sh", "-c", string(cmd_line1))fmt.Println("cmd1 is ", cmd1)// cmd1 := exec.Command("sh", "-c", "fuser -v ", req, " |   grep '[0-9]*[1-9][0-9]'")stdout1 := &bytes.Buffer{}cmd1.Stdout = stdout1cmd1.Run()s2 := stdout1.String()s2 = strings.Replace(s2, " ", "", -1)s2 = strings.Replace(s2, "\n", "", -1)// fmt.Println("s2", s2)fmt.Printf("%#v\n", s2)f1, err1 := strconv.ParseFloat(s2, 64)if err1 != nil {return fmt.Errorf("couldn't change s2 to f1: %s", err)}fmt.Println("f1", f1)s1 := fmt.Sprintf("%s%d", "cpu_temp_", p.CPU)m[s1] = f1// m[s1] = f1 * 0.001fmt.Println("temp map m:", m)for k, v := range m {// `prometheus.MustNewConstMetric()` 返回 `prometheus.constMetric` 对象,由描述信息,指标类型,指标值构成.如下指标// # HELP go_info Information about the Go environment.// # TYPE go_info gauge// go_info{version="go1.14.4"} 1ch <- prometheus.MustNewConstMetric(prometheus.NewDesc(// 描述信息包括 数据指标名称(由 `BuildFQName()`函数组合而成),帮助信息,变量标签,常量标签prometheus.BuildFQName(namespace, tempMetricsSubsystem, k),fmt.Sprintf("Temp metrics field cpu temp %s.", k),nil, nil,),// 返回v为float64类型metricType, v,)}}return nil
}

结果看情况是通过grafana处理还是在代码里直接*0.01

CPU 温度(最热的核心)由 x86_pkg_temp 给出。

$ cat /sys/class/thermal/thermal_zone10/type 
x86_pkg_temp

然后/sys/class/thermal/thermal_zone10/temp是应该在 i3 状态栏中使用的文件。

附带说明一下,每个内核的温度都可以temp*_input/sys/devices/platform/coretemp.0/hwmon/hwmon*/. 关联temp*_label显示哪个文件与哪个内核相关(在我的例子中是 4 个内核):

.../hwmon*/$  grep "" temp*_label
temp1_label:Physical id 0
temp2_label:Core 0
temp3_label:Core 1
temp4_label:Core 2
temp5_label:Core 3

该文件temp1_input对应于内核的最热值。

如果要获取对应每个cpu的温度 需要

cat /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input

参考

https://qa.1r1g.cn/unix/ask/21339181/

https://cloud.tencent.com/developer/article/1820706

这篇关于[golang]-prometheus获取物理cpu热区的温度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228924

相关文章

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%