You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加注册表后Cassandra Driver的Micrometer指标未显示求助

排查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 cause

java.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:25:56