如何通过SpringBoot获取Cassandra连接客户端及推送自定义指标至Prometheus?
Cassandra客户端监控与自定义指标推送Prometheus实现方案
1. SpringBoot获取Cassandra客户端连接信息
- 通过Cassandra系统表查询:Cassandra内置
system_views.client_connections系统表,存储所有活跃客户端的连接详情(IP、连接时间、协议版本等)。在SpringBoot中可通过CqlSession直接执行查询:
@Autowired private CqlSession cqlSession; public List<Map<String, Object>> getActiveClients() { ResultSet resultSet = cqlSession.execute("SELECT client_ip, connection_time, protocol_version FROM system_views.client_connections"); return resultSet.all().stream() .map(Row::toMap) .collect(Collectors.toList()); }
- 通过JMX接口获取:连接Cassandra默认JMX端口(7199),调用
org.apache.cassandra.db:type=ClientState下的MBean方法获取客户端列表。SpringBoot中可借助JmxConnector实现JMX连接与数据读取。
2. 捕获客户端IP、查询语句并推送Prometheus
步骤1:捕获客户端查询数据
- 启用Cassandra查询日志:修改
cassandra.yaml配置文件,开启全量或慢查询日志,日志条目包含客户端IP、查询语句、执行时长等信息:
query_logging_options: enabled: true log_level: INFO logger_class: org.apache.cassandra.db.MarkerBasedQueryLogger
- 自定义Query拦截器:实现
org.apache.cassandra.cql3.QueryHandler接口,在process方法中拦截查询请求,直接提取客户端IP和语句内容。
步骤2:SpringBoot收集并推送指标
- 引入Micrometer Prometheus依赖:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
- 自定义计数器指标,按客户端IP和查询类型维度统计:
@Autowired private MeterRegistry meterRegistry; private String extractQueryType(String query) { // 简单解析查询类型,实际可使用语法解析库优化 return query.trim().split("\\s+")[0].toUpperCase(); } public void trackClientQuery(String clientIp, String query) { String queryType = extractQueryType(query); Counter.builder("cassandra_client_queries_total") .tag("client_ip", clientIp) .tag("query_type", queryType) .register(meterRegistry) .increment(); }
- 暴露Prometheus端点:在
application.properties中配置:
management.endpoints.web.exposure.include=prometheus management.metrics.tags.application=cassandra-monitor
Prometheus可通过http://<springboot-host>:<port>/actuator/prometheus拉取指标。
3. 创建Cassandra自定义指标并推送Prometheus
方式一:Cassandra端自定义JMX指标+Prometheus JMX Exporter
- 编写自定义MBean:实现业务指标逻辑(如特定表读写次数统计),注册到Cassandra的JMX服务器。
- 配置Prometheus JMX Exporter:通过exporter抓取Cassandra的JMX指标(含自定义MBean),Prometheus直接从exporter拉取数据。
方式二:SpringBoot定时收集推送
- 定时查询Cassandra获取自定义指标值,注册为Micrometer指标:
@Scheduled(fixedRate = 60000) // 每分钟更新一次 public void refreshCustomMetrics() { // 示例:统计业务表行数 long orderCount = cqlSession.execute("SELECT COUNT(*) FROM commerce.orders").one().getLong(0); Gauge.builder("cassandra_commerce_orders_total", () -> orderCount) .description("Total rows in commerce.orders table") .register(meterRegistry); // 示例:统计活跃连接数 long activeConnections = cqlSession.execute("SELECT COUNT(*) FROM system_views.client_connections").one().getLong(0); Gauge.builder("cassandra_active_clients_total", () -> activeConnections) .description("Total active Cassandra clients") .register(meterRegistry); }
- 确保Prometheus配置中包含SpringBoot actuator端点的抓取任务,即可获取自定义指标。
内容的提问来源于stack exchange,提问作者enthusiast
相关产品推荐
相关产品推荐

