升级到Spring Boot 2后,如何将缓存指标暴露给prometheus?

问题描述 投票:0回答:2

我最近将 Spring Boot 应用程序从 1.5 升级到 2.0.1。我还使用千分尺将普罗米修斯集成迁移到新的执行器方法。现在大多数功能都可以工作 - 包括一些自定义计数器和仪表。

我注意到新的 prometheus 端点

/actuator/prometheus
不再发布 spring 缓存指标(大小和命中率)。

我唯一能找到的是this问题及其相关的commit

我仍然无法获取普罗米修斯导出的缓存指标。我尝试设置一些属性:

management.metrics.cache.instrument-cache=true
spring.cache.cache-names=cache1Name,cache2Name...

但是没有什么真正有效的。我可以看到 Hazelcast 缓存管理器启动,注册缓存管理器 bean 等等 - 但

/metrics
/prometheus
都没有显示任何统计信息。使用
@Cacheable
注释填充缓存。这适用于 Spring Boot 1.5 - 我想是通过 Hazelcast 通过 JMX 公开其指标,然后 prometheus 导出器从那里获取它?

现在不知道如何将其连接在一起。欢迎任何提示!

spring-boot hazelcast prometheus spring-boot-actuator spring-cache
2个回答
12
投票

既然你已经回答了我的问题,我可以为此提供答案。

我的缓存是稍后通过计划任务创建的

那么文档的这一部分适用于您:

只有启动时可用的缓存才会绑定到注册表。对于在启动阶段后即时或以编程方式创建的缓存,需要显式注册。提供了 CacheMetricsRegistrar bean 来简化该过程。

所以你必须自己注册这样的缓存,希望这很简单,比如:

public class MyComponent {

  private final CacheMetricsRegistrar cacheMetricsRegistrar;
  private final CacheManager cacheManager;

  public MyComponent(CacheMetricsRegistrar cacheMetricsRegistrar,
                     CacheManager cacheManager) { ... }

  public void register() {
    // you have just registered cache "xyz"
    Cache xyz = this.cacheManager.getCache("xyz");
    this.cacheMetricsRegistrar.bindCacheToRegistry(xyz);
  }
}

您可以将此代码包含在现有代码中。如果您不想这样做,那么您需要在现有代码之后运行其他东西来将这些缓存注册到注册表。


2
投票

https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.supported.cache

只有启动时配置的缓存才会绑定到注册表。对于缓存配置中未定义的缓存,例如在启动阶段后动态创建或以编程方式创建的缓存,需要显式注册。提供了 CacheMetricsRegistrar bean 来简化该过程。

关键是如何获取CacheMetricsRegistrar?

如果你使用CaffineCache,首先在config类中创建一个CacheMetricsRegistrar Bean,如以下代码

@Configuration
public class AppConfig {
    @Autowired
    private MeterRegistry meterRegistry;
    @Bean
    public CacheMetricsRegistrar cacheMetricsRegistrar() {
        return new CacheMetricsRegistrar(meterRegistry, Lists.newArrayList(new CaffeineCacheMeterBinderProvider()));
    }
}

然后根据你的需要像这样的组件类代码

// inject the cacheMetricsRegistrar
@Autowired
private CacheMetricsRegistrar cacheMetricsRegistrar;

private final LoadingCache<String, String> MY_CACHE = Caffeine
            .newBuilder()
            .recordStats()
            .expireAfterAccess(10, TimeUnit.MINUTES)
            .maximumSize(100000)
            .build(this::getFromRedis);

@PostConstruct
public void init() {
        // LoadingCache -> Cache
        Cache cache = MY_CACHE;
        // bindCacheToRegistry
        cacheMetricsRegistrar.bindCacheToRegistry(new CaffeineCache("MY_CACHE", cache), Tag.of("name", "MY_CACHE"));

}
© www.soinside.com 2019 - 2024. All rights reserved.