如何在 java 程序中收集 Prometheus 指标?

Posted

技术标签:

【中文标题】如何在 java 程序中收集 Prometheus 指标?【英文标题】:How to collect the Prometheus metrics in a java program? 【发布时间】:2020-10-31 01:27:49 【问题描述】:

我搜索了大部分文章,但没有找到我预期的解决方案。我是普罗米修斯的新手。我需要让我的 java 程序收集 Prometheus 指标。因此,需要帮助才能通过我的 java 程序读取或获取 Prometheus 指标。

任何帮助或建议都会有所帮助。

谢谢

【问题讨论】:

你在使用框架吗? Java EE、Spring、...?没有任何细节,我只能建议看一些示例项目,或者使用 JHipster 设置一个带有指标的项目并在那里查看。 我正在使用 spring-boot 应用程序,在 pod 中运行。 【参考方案1】:

如果您使用的是 Spring boot 2.1.5.RELEASE,那么

    添加依赖执行器和 micrometer-prometheus
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
 <dependency> 
   <groupId>io.micrometer</groupId>
   <artifactId>micrometer-registry-prometheus</artifactId>
 </dependency>
    添加配置以启用对端点 /actuator/prometheus 的访问
management:
  endpoints:
    web:
      exposure:
       include: '*'
    尝试请求http://domain:port/actuator/prometheus

编辑 对于使用 kind 部署的 kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myAppName
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myAppName
  template:
    metadata:
      labels:
        app: myAppName
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "8091"
        prometheus.io/path: "/actuator/prometheus"
    spec:
      containers:
        - name: myAppName
          image: images.com/app-service:master
          imagePullPolicy: Always
          ports:
            - containerPort: 8091
          env:
            - name: INSTANCE_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: SPRING_PROFILES_ACTIVE
              value: "prod"
            - name: CONFIG_SERVER_ADDRESS
              value: "http://config-server:8888"
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /actuator/health
              port: 8091
              scheme: HTTP
            initialDelaySeconds: 45
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 5
          readinessProbe:
            failureThreshold: 5
            httpGet:
              path: /actuator/health
              port: 8091
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 5
      nodeSelector:
        servicetype: mvp-cluster

【讨论】:

出现错误错误:验证“src/main/resources/xxx-autoscaler-deployment.yaml”时出错:验证数据时出错:[ValidationError(Deployment.spec.template):未知字段“livenessProbe” io.k8s.api.core.v1.PodTemplateSpec,ValidationError(Deployment.spec.template):io.k8s.api.core.v1.PodTemplateSpec 中的未知字段“nodeSelector”,ValidationError(Deployment.spec.template):未知字段io.k8s.api.core.v1.PodTemplateSpec 中的“readinessProbe”];如果您选择忽略这些错误,请使用 --validate=false 关闭验证 @JDGuide 使用什么 apiVersion 和 kind(Pod ?)? livenessProbe 和 readinessProbe 它们是可选的,您可以删除它们以测试您的应用程序 我已经删除并测试了。将更新正在发生的事情。 如果 class 是 pojo 而不是 spring bean 怎么办?【参考方案2】:

有很多方法可以做到这一点请参考https://github.com/prometheus/client_java

【讨论】:

是的。但是,我找不到合适的使用。

以上是关于如何在 java 程序中收集 Prometheus 指标?的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus:如何收集临时进程的内存消耗指标?

如何编写一个在文件中收集值的 Prometheus 导出器?

如何使用联合从多个 Prometheus 实例(每个使用 instance="localhost:9090")中收集 Prometheus 的指标

Springboot 网关 Prometheus 收集海量数据

如何使用 grafana 可视化 prometheus 端点指标

如何标记 Prometheus blackbox_exporter 端点