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

Posted

技术标签:

【中文标题】将 java-List<T> 转换为可用于 iomicrometer 的 MultiGauge 的流【英文标题】:Converting a java-List<T> into a stream usable with iomicrometer's MultiGauge 【发布时间】:2019-11-16 16:14:06 【问题描述】:

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

T 包含字段

唯一标识符 经度 纬度 价值

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

objectid=<unique identifier>,longitude=<longitude>,latitude=<latitude> <value>
objectid=<unique identifier>,longitude=<longitude>,latitude=<latitude> <value>
objectid=<unique identifier>,longitude=<longitude>,latitude=<latitude> <value>
...

指标应由 prometheus 抓取,然后使用 grafana/worldmap 可视化 我正在使用 MultiGauge l100 = MultiGauge.builder("metric-last100").register(registry);

并且在将List&lt;T&gt; 转换为流以提供l100.register(...) 时非常失败,如图here 所示:

// 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)));

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

谢谢

/M

【问题讨论】:

请说明您是如何转换对象的。 @Turing85 - 我正在处理链接的示例 - 我添加了代码。我正在尝试用我的 List &lt;T&gt; 替换 resultSet.stream 我没有任何工作代码 - 那是我的问题。 【参考方案1】:

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

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

【讨论】:

我不认为这个答案增加了太多真正的价值,因为它只是一个链接。至少考虑从帖子中总结一些内容,使其对读者更有价值。当然,请继续引用您的来源并在应有的地方给予信任。有关仅链接答案的详细信息,请参阅:meta.stackexchange.com/a/8259/312717 我同意你的看法。我改变了答案。

以上是关于将 java-List<T> 转换为可用于 iomicrometer 的 MultiGauge 的流的主要内容,如果未能解决你的问题,请参考以下文章

java-List<实体>怎么转换成List<Object>

如何将 kotlin 流转换为可变流?

将背景图像转换为可单击的链接

将 OptionalDouble 转换为可选 <java.lang.Double>

Java-List集合排序之Comparable与Comparator的使用

将整数转换为可迭代对象以方便代码重用