在地图中使用MeterRegistry

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

我有Map dbhealth,它存储健康信息。 MeterRegistry 需要提醒连接是否超时。我对如何立即连接到注册表 MeterRegistry 感到困惑。

static method(){ // also other class called this method
for (Map.Entry<String, DataSource> dataSource :dbhealth.entrySet()) {
      Connection connection = dataSource.getValue().getConnection()
       if (!connection.isValid(timeout)) {
          print("bd connection is not valid for"+, dataSource.getKey());
         } 
}}

我的想法是创建新方法放入构造函数中,

public xxx(xx,xx, MeterRegistry meterRegistry){
for (Map.Entry<String, DataSource> dataSource :dbhealth.entrySet()) {
      Connection connection = dataSource.getValue().getConnection()
      boolean connected = connection.isValid(timeout)
         if(meterRegistry!=null){
            Gauge.builder(C.Metrics.DS_HEALTH, () -> (connected) ? 1 : 0)
                    .register(meterRegistry);
        }
      } 
}

但这些都是重复的代码,而且看起来很连线。有什么想法或建议吗?

spring-boot spring-boot-actuator micrometer spring-micrometer
1个回答
0
投票

也许你可以尝试如下:

  1. registerConnectionHealthMetrics
    方法迭代
    dbhealth
    地图,对于每个
    DataSource
    ,它使用
    Gauge
    创建一个
    Gauge.builder
    指标。
    Gauge
    MeterRegistry
    中注册,值 1 表示健康连接,0 表示不健康连接。

  2. isDataSourceConnected
    方法用于检查每个数据库连接的健康状况。

  3. 在main方法中,创建

    MyClass
    的实例并调用
    registerConnectionHealthMetrics
    方法来注册所有指标。

public class MyClass {
    private Map<String, DataSource> dbhealth;
    private MeterRegistry meterRegistry;

    public MyClass(Map<String, DataSource> dbhealth, MeterRegistry meterRegistry) {
        this.dbhealth = dbhealth;
        this.meterRegistry = meterRegistry;
    }

    public void registerConnectionHealthMetrics() {
        for (Map.Entry<String, DataSource> dataSourceEntry : dbhealth.entrySet()) {
            DataSource dataSource = dataSourceEntry.getValue();
            Gauge.builder("db_connection_health_" + dataSourceEntry.getKey(), this, 
                obj -> obj.isDataSourceConnected(dataSource) ? 1 : 0)
                .register(meterRegistry);
        }
    }

    private boolean isDataSourceConnected(DataSource dataSource) {
        try (Connection connection = dataSource.getConnection()) {
            return connection.isValid(timeout);
        } catch (SQLException e) {
            return false;
        }
    }

    public static void main(String[] args) {
        // Initialize your map of DataSources here
        Map<String, DataSource> dbhealth = new HashMap<>();
        // Populate the map with DataSource instances
        
        // Initialize a MeterRegistry using SimpleMeterRegistry
        MeterRegistry meterRegistry = new SimpleMeterRegistry();


        MyClass MyClass = new MyClass(dbhealth, meterRegistry);
        MyClass.registerConnectionHealthMetrics();
    }
}

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