prometheus监控springboot应用

想要监控Java应用,JMX永远是第一选择。在prometheus监控体系中,jmx_exporter是使用范围十分广的工具。今天我们来讲讲如何用jmx_exporter来监控我们的springboot应用。

这里采用的prometheus是腾讯云的云原生监控产品,对应的k8s集群是tke产品,并且云原生监控已关联对应的tke集群。

本次用的springboot demo代码github地址:https://github.com/nieweixing/nieweixing-test-springboot,代码结构如下图

1. 生成JMX Exporter 配置文件

首先生成一份prometheus-jmx-config.yaml配置文件,放在代码的根目录下

ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false

2. 引入JMX Exporter的jar

我们可以从https://github.com/prometheus/jmx_exporter获取下对应的jar

wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar

3. 编写dockerfile制作镜像

下面我们来写dockerfile制作镜像

FROM maven:3.8-openjdk-8
MAINTAINER nieweixing nwx_qdlg@163.com
ADD . /opt
RUN cd /opt && mvn clean package -Dmaven.test.skip=true
RUN mv /opt/target/spring-boot-helloworld-1.0.0-SNAPSHOT.jar /app.jar
WORKDIR /
RUN apt-get update -y
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y wget
RUN wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar
ADD ./prometheus-jmx-config.yaml /prometheus-jmx-config.yaml
ENTRYPOINT java -javaagent:./jmx_prometheus_javaagent-0.13.0.jar=8081:/opt/prometheus-jmx-config.yaml -jar /app.jar

这里我们将agent的包下载写到dockerfile里面,免掉了手动下载,启动命令中指定agent的方式启动JMX Exporter,端口不要和自己应用的监听冲突即可,这里我们应用的监控端口是8080,JMX Exporter的监听端口用的8081。

写好dockerfile后,可以用自动化构建或者手动构建下,生成对应的镜像。

4. 部署镜像到k8s集群

首先用上一步生成的镜像部署deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: prometheus-jvm
    qcloud-app: prometheus-jvm
  name: prometheus-jvm
  namespace: tke-test
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: prometheus-jvm
      qcloud-app: prometheus-jvm
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: prometheus-jvm
        qcloud-app: prometheus-jvm
    spec:
      containers:
      - env:
        - name: PATH
          value: /usr/local/openjdk-8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        - name: JAVA_HOME
          value: /usr/local/openjdk-8
        - name: LANG
          value: C.UTF-8
        - name: JAVA_VERSION
          value: 8u302
        - name: MAVEN_HOME
          value: /usr/share/maven
        - name: MAVEN_CONFIG
          value: /root/.m2
        image: nwx-test.tencentcloudcr.com/nwx/springboot:springboot-2e7681a104eba7f43b7649645c78517772fbce89
        imagePullPolicy: IfNotPresent
        name: prometheus-jvm
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 250m
            memory: 256Mi
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

然后暴露一个service提供下访问,这里需要给service打上label,后续用ServiceMonitor采集监控需要用到

apiVersion: v1
kind: Service
metadata:
  labels:
    app: jvm
  name: prometheus-jvm
  namespace: tke-test
spec:
  externalTrafficPolicy: Cluster
  ports:
  - name: 8080-8080-tcp
    nodePort: 32766
    port: 8080
    protocol: TCP
    targetPort: 8080
  - name: 8081-8081-tcp-472u7ygjuio
    nodePort: 32730
    port: 8081
    protocol: TCP
    targetPort: 8081
  selector:
    k8s-app: prometheus-jvm
    qcloud-app: prometheus-jvm
  sessionAffinity: None
  type: LoadBalancer

5. 创建ServiceMonitor

云原生监控默认是有ServiceMonitor 的 CRD,所以我们这里直接用ServiceMonitor采集监控数据即可

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: jvm
  name: jvm
  namespace: tke-test
spec:
  endpoints:
  - bearerTokenSecret:
      key: ""
    interval: 5s
    port: 8081-8081-tcp-472u7ygjuio
  namespaceSelector:
    matchNames:
    - tke-test
  selector:
    matchLabels:
      app: jvm

我们可以查看下对应的target状态是否为up

直接访问endpoint能查看数据指标,则说明采集成功

6. 添加Grafana监控面板

这里我们用社区提供的jvm监控面板 JVM dashboard,来监控我们的应用,直接在grafana导入8878模板,具体面板效果如下

如果有部分监控数据不显示,可以根据对应的promsql去thanos query搜一下对应的指标是否存在,有可能是名称不一致导致的。这里根据prometheus搜到的指标名称修改下promsql即可。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
prometheus监控springboot应用
想要监控Java应用,JMX永远是第一选择。在prometheus监控体系中,jmx_exporter是使用范围十分广的工具。今天我们来讲讲如何用jmx_exp...
<<上一篇
下一篇>>