【问题标题】:Metric for version number版本号指标
【发布时间】:2019-01-15 17:41:22
【问题描述】:

是否可以向 Java 系统添加一些指标,以将版本号作为受监控应用程序的字符串返回?

我的目标是在 Kubernetes 集群中监控每个在 Docker 容器内运行 Java 应用程序的 Pod,并查看每个 Java 应用程序的当前版本。

如果不可能,您是否知道如何从 Java 应用程序获取该信息并使其在 Grafana 仪表板中可用?

【问题讨论】:

  • 你的意思是像 System.getProperty("java.version") 这样的 Docker 容器中的 Java 版本吗?还是您的意思是应用程序本身的版本?如果是第二个,这取决于它是如何构建的。为此,我们个人使用 Maven(和 Jenkins 来构建)。如何使用我没有经验的其他可构建应用程序来做到这一点。
  • MANIFEST.MF 的实施版本是否适合您?查看这个问题,看看如何在运行时获取它:stackoverflow.com/questions/2712970/…
  • 您使用什么指标收集器?如果您使用 prometheus java_client(github.com/prometheus/client_java),我认为它会将 java 版本公开为度量标准。(依赖于您的仪器来提取度量标准)(stackoverflow.com/questions/47559338/…)
  • 我的意思是我的应用程序版本中的版本号。假设已部署版本 1.7.4711。然后我希望能够在我的仪表板中看到 1.7.4711。我会给@Olivier 的答案一个旋转。这听起来像是解决 Prometheus 喜欢返回数字和数字系列这一事实的一种方法。

标签: java kubernetes grafana prometheus


【解决方案1】:

在您的应用程序中,您可以提供使用标签导出的 Gauge 指标,例如版本号或提交/构建哈希,然后将仪表的值设置为 1。

例如,redis_exporter 导出有关 redis 实例的信息的方式如下:

# HELP redis_instance_info Information about the Redis instance
# TYPE redis_instance_info gauge
redis_instance_info{addr="redis://localhost:6379",os="Linux 4.4.0-62-generic x86_64",redis_build_id="687a2a319020fa42",redis_mode="standalone",redis_version="3.0.6",role="master"} 1

您可以看到版本和一些其他属性导出为指标redis_instance_info 的标签。

【讨论】:

    【解决方案2】:

    扩展@Oliver 的想法,我正在添加一个示例 java 类,该类在应用程序启动/准备好后向 Prometheus 指标端点公开当前使用的应用程序版本、git 分支和 git commit id。

    这假设您有一个启用了 prometheus 指标作为执行器端点的 Spring Boot 应用程序。

    @Component
    @RequiredArgsConstructor
    public class PrometheusCustomMetricsService implements ApplicationListener<ApplicationReadyEvent> {
    
        private static final int FIXED_VALUE = 1;
        @Value("${info.project.version}")
        private String applicationVersion;
    
        private final MeterRegistry meterRegistry;
        private final GitProperties gitProperties;
    
        @Override
        public void onApplicationEvent(@NonNull ApplicationReadyEvent event) {
            registerApplicationInfoGauge();
        }
    
        private void registerApplicationInfoGauge() {
            Tag versionTag = new ImmutableTag("application_version", applicationVersion);
            Tag branchTag = new ImmutableTag("branch", gitProperties.getBranch());
            Tag commitIdTag = new ImmutableTag("commit_id", gitProperties.getShortCommitId());
    
            meterRegistry.gauge("application_info",
                                List.of(versionTag, branchTag, commitIdTag),
                                new AtomicInteger(FIXED_VALUE));
        }
    }
    
    

    您的自定义指标应该在 prometheus 端点中显示如下:

    application_info{application_version="1.2.3",branch="SOME-BRANCH-123",commit_id="123456"} NaN
    

    我不会担心 application_info 计量器的值是 NaN,因为我们不需要该值,仅将其用作发送标签的一种方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 2020-07-17
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多