为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

动漫人物 2023-03-09 14:36:14
从我的 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)));}请原谅我的愚蠢,有人可以帮忙吗?
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

你可以尝试做这样的事情:


1 - 创建一个类来存储您的结果并将数据转换为 MultiGauge.Row


@Data

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class UserData {


  private String gender;

  private Long counter;


  public MultiGauge.Row<UserData> toRow() {

    return MultiGauge.Row.of(Tags.of("gender", gender), this, c -> this.counter);

  }


}

2 - 创建自定义查询以对结果进行分组


@Query(value = "select new multigauge.multigauge.UserData(usr.gender, count(usr.id)) " +

    "from users usr " +

    "group by usr.gender")

   List<UserData> retrieveUsersGroupedByGender();

3 - 使用 toRow 方法转换列表并注册您的 MultiGauge


@Scheduled(fixedDelay = 1000)

  public void updateGauges() {

    multiGauge.register(userRepository.retrieveUsersGroupedByGender()

      .stream()

      .map(UserData::toRow)

      .collect(toList()), true);

  }

4 - 初始化您的 MultiGauge


@PostConstruct

  public void init() {

    multiGauge = MultiGauge.builder("users_grouped_by_gender_metric").register(prometheusMeterRegistry);

  }

我建议查看官方 GitHub 存储库中的单元测试:


https://github.com/micrometer-metrics/micrometer/blob/master/micrometer-core/src/test/java/io/micrometer/core/instrument/MultiGaugeTest.java


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信