添加注册表后Cassandra Driver的Micrometer指标未显示求助
我正尝试配置Cassandra Driver的Micrometer指标,已编写如下代码,但运行访问端点时出现Metrics禁用的错误,直接访问全局注册表也无结果,恳请帮忙排查。
配置类与属性类(Java)
@Configuration @EnableConfigurationProperties(CassandraProperties.class) public class CassandraMetricsConfig { @Bean public DriverConfigLoaderBuilderCustomizer configLoaderBuilderCustomizer(CassandraProperties cassandraProperties) { return builder -> { System.out.println("Builder is getting called "+cassandraProperties.getSessionMetrics()+" "+cassandraProperties.getNodeMetrics()+"\n"); builder.withStringList(METRICS_SESSION_ENABLED, cassandraProperties.getSessionMetrics()); builder.withStringList(METRICS_NODE_ENABLED, cassandraProperties.getNodeMetrics()); }; } @Bean @ConditionalOnClass(MeterRegistry.class) public CqlSessionBuilderCustomizer meterRegistryBuilderCustomizer(final ObjectProvider<MeterRegistry> meterRegistry) { System.out.println("Yeah we got there"); return sessionBuilder -> sessionBuilder.withMetricRegistry( meterRegistry.getIfAvailable( () -> Metrics.globalRegistry ) ); } @Bean @Primary public CqlSession session() { return CqlSession.builder() .withMetricRegistry(Metrics.globalRegistry) .withKeyspace("test").build(); } } @ConfigurationProperties("cassandra") public class CassandraProperties { public CassandraProperties(List<String> sessionMetrics, List<String> nodeMetrics) { this.sessionMetrics = sessionMetrics; this.nodeMetrics = nodeMetrics; } private List<String> sessionMetrics; private List<String> nodeMetrics; protected List<String> getSessionMetrics() { return sessionMetrics; } protected List<String> getNodeMetrics() { return nodeMetrics; } }
配置文件(YAML)
cassandra: session-metrics: - cql-requests - connected-nodes node-metrics: - pool.open-connections - pool.in-flight
Scala控制器代码
@RequestMapping(Array("/")) def index(): String = { session.execute("DESC keyspaces;") .forEach( (row) => println( row.getString("keyspace_name") ) ) val sb: StringBuilder = new StringBuilder() val registry = session.getMetrics .orElseThrow(() => new IllegalStateException("Metrics are disabled")) .getRegistry registry .getMeters .forEach( (key, meter) => { sb.append(key) } ) sb.toString() }
错误信息
2023-10-24T10:31:24.124-04:00 ERROR 1172 --- [nio-8080-exec-1]
o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for
servlet [dispatcherServlet] in context with path [] threw exception
[Request processing failed: java.lang.IllegalStateException: Metrics
are disabled] with root causejava.lang.IllegalStateException: Metrics are disabled
额外尝试
直接使用全局注册表,返回结果为空:
Metrics.globalRegistry.getMeters.forEach( meter => { System.out.println("Meter is " + meter.getId.toString) sb.append(meter.getId.toString) sb.append("\n") } )
排查与解决要点
1. Session构建未加载配置自定义器
你手动创建CqlSession Bean时,没有传入Spring配置好的DriverConfigLoader,导致DriverConfigLoaderBuilderCustomizer中设置的指标启用配置完全没生效,指标默认处于禁用状态。
修复方式:
修改Session Bean,注入DriverConfigLoader并传入构建器:
@Bean @Primary public CqlSession session(DriverConfigLoader driverConfigLoader) { return CqlSession.builder() .withConfigLoader(driverConfigLoader) .withMetricRegistry(Metrics.globalRegistry) .withKeyspace("test").build(); }
2. CassandraProperties属性绑定失败
你的CassandraProperties使用带参数的构造函数,但Spring Boot的@ConfigurationProperties默认需要无参构造函数(或配合@ConstructorBinding),否则无法正确绑定yaml中的配置,导致sessionMetrics和nodeMetrics为null,没有启用任何指标。
修复方式二选一:
- 方式一:添加
@ConstructorBinding(Spring Boot 2.2+支持)
@ConfigurationProperties("cassandra") @ConstructorBinding public class CassandraProperties { private final List<String> sessionMetrics; private final List<String> nodeMetrics; public CassandraProperties(List<String> sessionMetrics, List<String> nodeMetrics) { this.sessionMetrics = sessionMetrics; this.nodeMetrics = nodeMetrics; } // 保留原getter }
- 方式二:改为无参构造+setter
@ConfigurationProperties("cassandra") public class CassandraProperties { private List<String> sessionMetrics; private List<String> nodeMetrics; public CassandraProperties() {} // 添加setter public void setSessionMetrics(List<String> sessionMetrics) { this.sessionMetrics = sessionMetrics; } public void setNodeMetrics(List<String> nodeMetrics) { this.nodeMetrics = nodeMetrics; } // 保留原getter }
3. 确认配置常量正确性
代码中METRICS_SESSION_ENABLED和METRICS_NODE_ENABLED必须是Driver 4.x的正确配置键,建议直接使用DriverOption中的常量:
import com.datastax.oss.driver.api.core.config.DriverOption; // 替换原配置代码 builder.withStringList(DriverOption.METRICS_SESSION_ENABLED, cassandraProperties.getSessionMetrics()); builder.withStringList(DriverOption.METRICS_NODE_ENABLED, cassandraProperties.getNodeMetrics());
4. 检查依赖是否缺失
必须引入Cassandra Driver的Micrometer扩展依赖,否则Driver无法将指标导出到Micrometer Registry:
<!-- Maven依赖 --> <dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-metrics-micrometer</artifactId> <version>4.13.0</version> </dependency>
内容的提问来源于stack exchange,提问作者JGleason

