尽管明确注册了TimedAspect,但@Timed不工作 - spring boot 2.1。

问题描述 投票:3回答:1

我需要使用微米级的 @Timed 注解来测量方法参数。由于它不能在任意方法上工作,我在spring配置中明确添加了@TimedAspect的配置。我参考了这篇帖子来了解确切的配置注:我试着添加了一个单独的配置类来实现这个功能,同时也把TimedAspect Bean作为现有配置Bean的一部分。

如何使用弹簧套2和千分尺测量维修方法。

然而,不幸的是,它并没有工作。Bean是注册过的,启动时从config类调用成功。调试时发现了这个问题。然而,@Around中的代码似乎从来没有执行过,没有抛出任何错误,并且能够在metrics和prometheus端点上查看默认的 "系统 "指标。

注意:这是在通过执行业务流使 "方法 "被多次调用之后。我知道,如果方法根本没有被调用,它可能不会显示在度量中。

版本:弹簧螺栓2.1.1,弹簧5.3,千分尺1.1.4,执行器2.1。

按照下面的帖子尝试了所有的方法。

如何用弹簧套2和千分尺来测量工作方法?

https:/github.comizeyesample-micrometer-spring-boottreettimed-annotation。

https:/github.commicrometer-metricsmicrometerissues361。

更新:所以,这个问题似乎只有当Timed是在一个抽象方法上,而这个抽象方法是通过另一个方法调用的。通过一个简单的例子,能够重现这个问题。 参考@Timed("say_hello_example")注解。当我点击prometheus端点时,它只是被忽略了,并且没有显示出来。

代码:抽象类

    public abstract class AbstractUtil {
    public abstract void sayhello();

    public void sayhellowithtimed(String passedVar) {
        System.out.println("Passed var =>"+passedVar);
        System.out.println("Calling abstract sayhello....");
        sayhello();

    }
}

Impl类

    @Component
@Scope("prototype")
public class ExampleUtil extends AbstractUtil  {

    public static final String HELLO = "HELLO";

    @Timed("dirwatcher_handler")
    public void handleDirectoryWatcherChange(WatchEvent event){
        System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context());
    }

    @Timed("say_hello_example")
    @Override
    public void sayhello() {
        System.out.println(HELLO);
        try {            Thread.sleep(1000);
        } catch (InterruptedException e) {              e.printStackTrace();
        }
    }
}

一个简单的DirWatcher实现类...

                package com.example;

            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.beans.factory.annotation.Value;
            import org.springframework.boot.context.event.ApplicationStartedEvent;
            import org.springframework.context.ApplicationListener;
            import org.springframework.context.annotation.Scope;
            import org.springframework.context.event.ContextRefreshedEvent;
            import org.springframework.stereotype.Component;

            import java.io.IOException;
            import java.nio.file.*;

            @Component
            @Scope("prototype")
            public class StartDirWatcher implements ApplicationListener<ApplicationStartedEvent> {

                @Value("${directory.path:/apps}")
                public String directoryPath;

                @Autowired
                private ExampleUtil util;

                private void monitorDirectoryForChanges() throws IOException, InterruptedException {
                    WatchService watchService = FileSystems.getDefault().newWatchService();
                    Path path = Paths.get(directoryPath);
                    path.register(
                            watchService,
                            StandardWatchEventKinds.ENTRY_CREATE,
                            StandardWatchEventKinds.ENTRY_DELETE,
                            StandardWatchEventKinds.ENTRY_MODIFY);
                    WatchKey key;
                    while ((key = watchService.take()) != null) {
                        for (WatchEvent<?> event : key.pollEvents()) {
                            util.handleDirectoryWatcherChange(event);
                            util.sayhellowithtimed("GOD_OF_SMALL_THINGS_onAPPEvent");
                        }
                        key.reset();
                    }
                }

                @Override
                public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
                    try {
                        monitorDirectoryForChanges();

                    } catch (Throwable e) {
                        System.err.println("ERROR!! "+e.getMessage());
                        e.printStackTrace();
                    }
                }
            }

Spring Boot应用类

package com.example;

import io.micrometer.core.aop.TimedAspect;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy
@ComponentScan
@Configuration
@SpringBootApplication
public class ExampleStarter{

    @Bean
    MeterRegistryCustomizer<PrometheusMeterRegistry> metricsCommonTags() {
        return registry -> registry.config().commonTags("app.name", "example.app");
    }
    @Bean
    TimedAspect timedAspect(MeterRegistry reg) {
        return new TimedAspect(reg);
    }

    public static void main(String[] args) {
        SpringApplication.run(ExampleStarter.class, args);
    }

}

主pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.metrics.timed.example</groupId>
<artifactId>example-app</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.1.2</version>
</dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
</dependencies>

spring-boot aspectj prometheus micrometer
1个回答
0
投票

我使用的是spring boot 2.2.6.释放 而这个MetricConfig为我工作

@Configuration
public class MetricConfig {

  @Bean
  MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
    return registry -> registry.config().commonTags("application", "my app");
  }

  @Bean
  TimedAspect timedAspect(MeterRegistry registry) {
    return new TimedAspect(registry);
  }

}

在application.yml中

management:
  endpoints:
    web:
      exposure:
        include: ["health", "prometheus"]
  endpoint:
    beans:
      cache:
        time-to-live: 10s
© www.soinside.com 2019 - 2024. All rights reserved.