将 java-List<T> 转换为可用于 iomicrometer 的 MultiGauge 的流
Converting a java-List<T> into a stream usable with iomicrometer's MultiGauge
我从我的 springboot 应用程序收到一个结果列表 List<T>
,其中包含使用
从数据库 table 读取的 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>
...
指标应由 prometheus 抓取,然后使用 grafana/worldmap 进行可视化
我正在使用
MultiGauge l100 = MultiGauge.builder("metric-last100").register(registry);
并且无法将 List<T>
转换为流来馈送 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)));
}
请原谅我的笨拙,有人可以帮忙吗?
谢谢
/米
您可以尝试这样做:
1 - 创建一个 class 来存储您的结果并将数据转换为 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 存储库中的单元测试:
我从我的 springboot 应用程序收到一个结果列表 List<T>
,其中包含使用
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>
...
指标应由 prometheus 抓取,然后使用 grafana/worldmap 进行可视化
我正在使用
MultiGauge l100 = MultiGauge.builder("metric-last100").register(registry);
并且无法将 List<T>
转换为流来馈送 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)));
}
请原谅我的笨拙,有人可以帮忙吗?
谢谢
/米
您可以尝试这样做:
1 - 创建一个 class 来存储您的结果并将数据转换为 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 存储库中的单元测试: