[spring-projects/spring-boot]通过指标端点公开 InfoContributor 信息

2024-04-23 172 views
7

这是对 Spring Boot 2.0 执行器指标端点的增强的请求。

在 prometheus 中,捕获应用程序元数据(例如版本)作为单个指标上的标签是很常见的(请参阅https://www.robustperception.io/exusing-the-software-version-to-prometheus/)。

我建议创建(并默认公开)MeterBinder 的 ApplicationInfoMetrics 实现,它将所有注册的 InfoContributor 数据转换为名为“application.info”的 Guage 上的标签,值为 1.0。信息 JSON 将针对标签名称进行扁平化:

{
    "git": {
        "commit": {
            "id": "4616b7b"
        },
        "branch": "master"
    },
    "build": {
        "version": "0.0.1-SNAPSHOT",
        "artifact": "myapp",
        "name": "My Application",
        "group": "mygroup"
    }
}

将转换为以下普罗米修斯指标:

# HELP application_info Application info
# TYPE application_info gauge
application_info{build_artifact="myapp",build_group="mygroup",build_name="My Application",build_version="0.0.1-SNAPSHOT",git_branch="master",git_commit_id="4616b7b"} 1.0

如果有一个配置选项可以排除/包含 InfoContributor 字段以转换为标签,那就太好了。

回答

6

你觉得怎么样,@jkschneider?

2

有趣的。 WDYT @checketts?

我不认为这一切都是可自动配置的,你觉得呢?我们提供活页夹,你提供输入?

3

我喜欢。它将以相同的方式自动配置ApplicationInfoMetrics。我相信用户必须自己提供属性值。

@jondavind1我认为最初排除用作标签的字段不会成为度量基数方面的问题。但可能应该包含在内,以防万一用户遇到他们不希望暴露的值或有问题且需要删除的值。对于普罗米修斯来说这并不是太紧急,因为它允许您通过配置在摄取时删除标签。

8

很高兴听到您认为这个想法有价值。

我认为即使默认情况下未启用,这也是完全可自动配置的。 Spring boot提供了几个开箱即用的InfoContributor(Git、Build、Environment),用户可以将更多注册为bean。可以在启动时读取这些 InfoContributor 以配置 application_info 指标。这就是我在我的项目中实现它的方式。

@checketts 你所说的意思是不同的班级吗ApplicationInfoMetrics?我搜索了 spring-boot 和 micrometer 存储库,但没有看到任何叫这个名字的东西。

9

@jondavind1 您介意提交一份包含您项目中实施情况的 PR 吗?

8

我不完全确定我理解这个问题,但某些应用程序可能包含与此完全无关的信息。例如,start.spring.io/actuator/info 是否相关? (真诚地询问,因为我不确定我是否理解该功能)。

如果没有,也许我们应该专注于包含一些东西(带有默认值),而不是默认情况下获取所有内容。

4

@snicoll要回答您的问题start.spring.io/actuator/info,是的,按照我设想的功能的方式,执行器info端点上的所有信息都将作为仪表上的标签提供,application_info除非(假设这些配置选项可用)您将其配置ApplicationInfoMetrics为仅包含明确指定的标签,或包含所有标签,并明确排除某些标签。

现在,对于您的示例,许多依赖项数据对于针对普罗米修斯中的指标的查询可能没有价值。在我们的项目中,我们发现能够在查询结果中查看 git 和构建信息非常有价值(这些是我们启用的唯一 InfoContributor 元素)。

如果您想从info端点完全剥离此功能,这可能是有意义的,但对于我的用例,由于 spring-boot 已经拥有我想要的端点上的所有信息info,因此使用它是有意义的。

8

@jkschneider 我根本不介意提交 PR,但我可能需要几天时间才能获得批准,因为相关代码是为我的雇主开发的。

5

当您说 ApplicationInfoMetrics 时,您指的是不同的类吗

抱歉@jondavind1,我只是指您在第一篇文章中提到的课程。我并不是指特定的班级。

2

如果没有人反对的话,我想把它捡起来试一试,因为过去三个月这里没有任何动静。我已经读过它,并且我想我明白 @jondavind1 的要求,所以我认为很快提供第一个 PR 是可行的。

7

@tbilou 谢谢,但我认为我们应该等待,看看 @jondavind1 是否能够提交他们现有的实现。 @jondavind1,你进展得怎么样?

5

对于严重的延误和缺乏沟通,我深表歉意。在公司政策和对该项目的贡献方面存在相当大的混乱。 @wilkinsona,如果@tbilou 愿意尝试公关,我会说继续吧。

4

谢谢你,@jondavind1。交给你了,@tbilou。

3

我已经准备好了 PR(https://github.com/spring-projects/spring-boot/pull/13946)需要有人特别看看 flattenkeys 方法。现有的代码库中必须已经有类似的东西,我们可以在这里重用,而不是创建另一个遍历地图的递归函数......

9

它可能已经被讨论过,但使用标签贡献者将全局标签(SHA 或版本)应用于所有指标似乎是对指标进行切片和切块的更好方法。

7

可以使用MeterRegistryCustomizerbean 来应用全局标记。例如,下面是将 git commit ID 有一个标签应用于所有计量表的一个:

@Bean
public MeterRegistryCustomizer<?> gitTag(GitProperties gitProperties) {
    return (meterRegistry) -> meterRegistry.config().commonTags("git.commit", gitProperties.getCommitId());
}

这是我们推荐的方法,并且当前的 API 已经可以做到这一点。