当前位置: 首页 > 知识库问答 >
问题:

提供CPU使用率的Spring启动执行器

慕容宇
2023-03-14

我想知道是否有一种方法可以通过Spring Boot致动器获得CPU使用指标?我可以使用/metrics和/healthendpoint查看其他指标,但无法获得CPU使用情况。我想避免编写一个额外的类来查看CPU使用情况。知道吗?谢谢

共有3个答案

羊毅庵
2023-03-14

不幸的是,Spring Boot Actuator没有可用的CPU指标。
幸运的是,您可以编写自己的。

只需创建一个满足以下要求的测量bean:

>

  • 它有权访问仪表服务,因为它将跟踪一个值。

    @Autowired
    private GaugeService gaugeService;
    

    创建一个线程,该线程调用例程来测量进程的 CPU 负载:

    @PostConstruct
    public void startMeasuring() {
        new Thread() {
            @Override
            public void run() {
                gaugeService.submit("process.cpu.load", getProcessCpuLoad());
                Thread.sleep(2000);   //measure every 2sec.
            }
        }.start();
    }
    

    有一个使用MxBeans获取进程CPU负载的例程:

    public static double getProcessCpuLoad() throws Exception {
        MBeanServer mbs    = ManagementFactory.getPlatformMBeanServer();
        ObjectName name    = ObjectName.getInstance("java.lang:type=OperatingSystem");
        AttributeList list = mbs.getAttributes(name, new String[]{ "ProcessCpuLoad" });
    
        if (list.isEmpty())     return Double.NaN;
    
        Attribute att = (Attribute)list.get(0);
        Double value  = (Double)att.getValue();
    
        // usually takes a couple of seconds before we get real values
        if (value == -1.0)      return Double.NaN;
        // returns a percentage value with 1 decimal point precision
        return ((int)(value * 1000) / 10.0);
    }
    

    您还可以使用这种方法提取系统范围的CPU负载。

    希望这能有所帮助。

  • 顾穆冉
    2023-03-14

    Spring Boot 2致动器解决方案(基于@diginoise的代码来测量CPU负载),注册一个具有测量请求值的功能的计量器(无需启动线程或调度计时器):

    @Component
    public class CpuMetrics {
    
        private final static String METRICS_NAME = "process.cpu.load";
    
        @Autowired
        private MeterRegistry meterRegistry;
    
        @PostConstruct
        public void init() {
            Gauge.builder(METRICS_NAME, this, CpuMetrics::getProcessCpuLoad)
                .baseUnit("%")
                .description("CPU Load")
                .register(meterRegistry);
        }
    
        public Double getProcessCpuLoad() {
            try {
                MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
                ObjectName name = ObjectName.getInstance("java.lang:type=OperatingSystem");
                AttributeList list = mbs.getAttributes(name, new String[]{"ProcessCpuLoad"});
    
                return Optional.ofNullable(list)
                        .map(l -> l.isEmpty() ? null : l)
                        .map(List::iterator)
                        .map(Iterator::next)
                        .map(Attribute.class::cast)
                        .map(Attribute::getValue)
                        .map(Double.class::cast)
                        .orElse(null);
    
            } catch (Exception ex) {
                return null;
            }
        }
    }
    

    CPU指标将在/actuator/metrics/process.CPU.load:

    {
      "name": "process.cpu.load",
      "description": "CPU Load",
      "baseUnit": "%",
      "measurements": [
        {
          "statistic": "VALUE",
          "value": 0.09767676212004521
        }
      ],
      "availableTags": []
    }
    
    董意蕴
    2023-03-14

    刚刚检查了一下,我找到了这个执行器…/执行器/度量/process.cpu.usage

    它输出以下内容:

    {
        name: "process.cpu.usage",
        description: "The "recent cpu usage" for the Java Virtual Machine process",
        baseUnit: null,
        measurements: [
            {
                statistic: "VALUE",
                value: 0.0001742149747252696
            }
        ],
        availableTags: [ ]
    }
    

    当前使用的是Spring启动版本 2.2.2.发布

     类似资料:
    • 问题内容: 我一直在研究Spring / Spring MVC应用程序,并且希望添加性能指标。我遇到过Spring Boot Actuator,它看起来是一个不错的解决方案。但是我的应用程序不是Spring Boot应用程序。我的应用程序在传统容器Tomcat 8中运行。 我添加了以下依赖 我创建了以下配置类。 我什至可以按照StackOverflow另一篇文章的建议在每个配置类上添加 问题答案:

    • 我有: a)1台服务器(4vcpu,8GB)运行hazelcast节点, b)1台(4vcpu,8MB)运行tomcat 7上的hazelcash性能中心。 两台服务器都在同一个本地网络中。 我已经测试了2个场景:< br >场景1)我已经开始了a)和b)。没有传输数据。a)上的cpu使用率为0-10%。< br >情景2)我已经开始了a)和b)。我已经将大量数据转移到a)上进行处理,并一直等到它

    • 如何为执行器endpoint启用安全性,当在Spring启动1.5.4.RELEASE项目中没有Spring Security模块依赖项时 我在应用程序中添加了以下值。属性,但当我单击任何endpoint时,我会得到错误 我应该如何启用安全性?

    • 我有一个python程序成功地使用云服务帐户执行bigquery。当我尝试使用Jenkins调度python程序时,我看到了以下错误:gcloud用户对表和数据集具有bigquery编辑器、dataowner和admin权限。 log: gCloud auth激活服务帐户abc--key-file=****激活的服务号凭据:abc273721.iam.gserviceaccount.com]gCl

    • 我们有一个核心库和几个集成项目。每个集成项目都使用核心库,并继承核心DB flyway迁移。在核心中,有创建模式和一些初始数据的flyway迁移脚本。集成项目还包含迁移脚本。到目前为止,迁移脚本的执行顺序是这样的,核心迁移总是在集成项目之前运行,如下所示: 但是,我想要的是版本优先,而不是项目,例如: 我在核心中使用以下类: 以及集成项目中的以下内容: 如何通过Flyway实现这一点?

    • 问题内容: 我的目标是使我们的Redis服务器在生产中达到约80%的CPU利用率。通过确保我们不会利用CPU不足,同时为增长和高峰留出一些空间,这将有益于后端服务器设计。 使用Redis自己的基准测试工具时,很容易达到100%的CPU使用率: 在此基准上,我们分配了50个客户端以将1,000,000个请求推送到我们的Redis服务器。 但是在使用其他客户端工具(例如redis-lua或webdis