猿问

将 java-List<T> 转换为可用于 iomicrometer 的 MultiGauge 的流

从我的 springboot 应用程序中,我收到了一个结果列表List<T>,其中包含从数据库表中读取的 100 个元素

T包含字段

  • 唯一标识符

  • 经度

  • 纬度

  • 价值

我想把它变成多个千分尺,比如

object{id=<unique identifier>,longitude=<longitude>,latitude=<latitude>} <value>

object{id=<unique identifier>,longitude=<longitude>,latitude=<latitude>} <value>

object{id=<unique identifier>,longitude=<longitude>,latitude=<latitude>} <value>

...

指标应由普罗米修斯抓取,然后使用grafana/worldmap 可视化 我正在使用构建我的多仪表 MultiGauge l100 = MultiGauge.builder("metric-last100").register(registry);


List<T>并且在将其转换为流以供提供时非常失败,l100.register(...)如下所示:


// SELECT count(*) from job group by status WHERE job = 'dirty'     

MultiGauge statuses = MultiGauge.builder("statuses")

        .tag("job", "dirty")

        .description("The number of widgets in various statuses")

        .baseUnit("widgets")

        .register(registry);


...


// run this periodically whenever you re-run your query     

statuses.register(

  resultSet.stream().map(result -> 

    Row.of(Tags.of("status", result.getAsString("status")),     

    result.getAsInt("count")))

)

这是我的实际代码:


private MultiGauge l100;

...

l100 = MultiGauge.builder("ids-metric-last100").register(registry);

...   

public void updateMetricLast100Deliveries() {

  List<C3MpGeodataDOM> last100 = c3MpGeodataDAO.getlast100();


  l100.register(

    last100.stream().map(

        res -> Row.of(

            Tags.of(

                "sdgnr", res.getMpPK().getSdgnr(),

                "latitude", "" + res.getGeo_latitude(),

                "longitude", "" + res.getGeo_longitude()),

            1)));

}

请原谅我的愚蠢,有人可以帮忙吗?


动漫人物
浏览 136回答 1
1回答

哆啦的时光机

你可以尝试做这样的事情:1 - 创建一个类来存储您的结果并将数据转换为 MultiGauge.Row@Data@Builder@AllArgsConstructor@NoArgsConstructorpublic class UserData {&nbsp; private String gender;&nbsp; private Long counter;&nbsp; public MultiGauge.Row<UserData> toRow() {&nbsp; &nbsp; return MultiGauge.Row.of(Tags.of("gender", gender), this, c -> this.counter);&nbsp; }}2 - 创建自定义查询以对结果进行分组@Query(value = "select new multigauge.multigauge.UserData(usr.gender, count(usr.id)) " +&nbsp; &nbsp; "from users usr " +&nbsp; &nbsp; "group by usr.gender")&nbsp; &nbsp;List<UserData> retrieveUsersGroupedByGender();3 - 使用 toRow 方法转换列表并注册您的 MultiGauge@Scheduled(fixedDelay = 1000)&nbsp; public void updateGauges() {&nbsp; &nbsp; multiGauge.register(userRepository.retrieveUsersGroupedByGender()&nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; .map(UserData::toRow)&nbsp; &nbsp; &nbsp; .collect(toList()), true);&nbsp; }4 - 初始化您的 MultiGauge@PostConstruct&nbsp; public void init() {&nbsp; &nbsp; multiGauge = MultiGauge.builder("users_grouped_by_gender_metric").register(prometheusMeterRegistry);&nbsp; }我建议查看官方 GitHub 存储库中的单元测试:https://github.com/micrometer-metrics/micrometer/blob/master/micrometer-core/src/test/java/io/micrometer/core/instrument/MultiGaugeTest.java
随时随地看视频慕课网APP

相关分类

Java
我要回答