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即可。