用prometheus监控java应用

技术

jvm进程

  1. java相关的exporter和插件见:https://github.com/prometheus/clientjava 在idea的vm options中加上:-javaagent:./lib/jmxprometheusjavaagent-0.12.0.jar=192.168.1.208:6060:./config/jmxexporter.yaml
  2. jmxexporter tomcat: 修改catalina.sh里面的JAVAOPTS增加jvm参数的地主添加:-javaagent:./lib/jmxprometheusjavaagent-0.12.0.jar=192.168.1.208:6060:./config/tomcat.yaml 配置模板:https://github.com/prometheus/jmxexporter/blob/master/exampleconfigs/tomcat.yml

其他的example有:

picture.image

httpserversampleconfig.yml:

picture.image

tomcat 安装步骤:

  • 下载exporter

      1. `wget https
 :
 //repo1.maven.org/maven2/io/prometheus/jmx/jmx\_prometheus\_javaagent/0.3.1/jmx\_prometheus\_javaagent-0.3.1.jar`


    
  • 修改tomcat server.xml

      1. `<?xml version='1.0' encoding='utf-8'?>`
2. `<!-- 把此端口改成 -1 ,避免启动多个 tomcat 实例时端口冲突,但是停止实例只能通过 kill -9 "tomcat pid" 命令,无法使用 shutdown.sh -->`
3. `<Server port="-1" shutdown="SHUTDOWN">`
4. `<Listener className="org.apache.catalina.startup.VersionLoggerListener" />`
5. `<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />`
6. `<Listener className="org.apache.catalina.core.JasperListener" />`
7. `<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />`
8. `<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />`
9. `<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />`
10. 
11. `<GlobalNamingResources>`
12. `<Resource name="UserDatabase" auth="Container"`
13. `type="org.apache.catalina.UserDatabase"`
14. `description="User database that can be updated and saved"`
15. `factory="org.apache.catalina.users.MemoryUserDatabaseFactory"`
16. `pathname="conf/tomcat-users.xml" />`
17. `</GlobalNamingResources>`
18. 
19. `<Service name="Catalina">`
20. `<!-- 把此端口改成 25013,不同的实例监听在不同的端口,避免启动多个 tomcat 实例时端口冲突 -->`
21. `<Connector port="25013" protocol="HTTP/1.1"`
22. `connectionTimeout="20000"`
23. `redirectPort="8443" />`
24. `<!-- 没有用到 AJP 连接方式,所以注释掉此行,不监听 8009 端口 -->`
25. `<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->`
26. `<Engine name="Catalina" defaultHost="localhost">`
27. 
28. `<Realm className="org.apache.catalina.realm.LockOutRealm">`
29. `<Realm className="org.apache.catalina.realm.UserDatabaseRealm"`
30. `resourceName="UserDatabase"/>`
31. `</Realm>`
32. 
33. `<Host name="localhost" appBase="webapps"`
34. `unpackWARs="true" autoDeploy="true">`
35. `<Context path="/oss" docBase="tx-web-oss" reloadable="true"/>`
36. 
37. `<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"`
38. `prefix="localhost_access_log." suffix=".txt"`
39. `pattern="%h %l %u %t "%r" %s %b" />`
40. 
41. `</Host>`
42. `</Engine>`
43. `</Service>`
44. `</Server>`


    
  • 配置 jmx exporter tomcat.yml:

      1. `---`
2. `lowercaseOutputLabelNames: true`
3. `lowercaseOutputName: true`
4. `rules:`
5. `- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'`
6. `name: tomcat_$3_total`
7. `labels:`
8. `port: "$2"`
9. `protocol: "$1"`
10. `help: Tomcat global $3`
11. `type: COUNTER`
12. `- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount):'`
13. `name: tomcat_servlet_$3_total`
14. `labels:`
15. `module: "$1"`
16. `servlet: "$2"`
17. `help: Tomcat servlet $3 total`
18. `type: COUNTER`
19. `- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount):'`
20. `name: tomcat_threadpool_$3`
21. `labels:`
22. `port: "$2"`
23. `protocol: "$1"`
24. `help: Tomcat threadpool $3`
25. `type: GAUGE`
26. `- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'`
27. `name: tomcat_session_$3_total`
28. `labels:`
29. `context: "$2"`
30. `host: "$1"`
31. `help: Tomcat session $3 total`
32. `type: COUNTER`


    
  • 配置 tomcat catalina.sh,让 jmx_exporter 跟 tomcat 一起启动

      1. `JAVA\_OPTS
 =
 "-javaagent:/work1/soft/monitor/jmx\_prometheus\_javaagent-0.3.1.jar=30013:/work1/soft/monitor/tomcat.yml"`


    

具体如下:


      1. `##JDK PATH`
2. `export JAVA_HOME=/usr/java/jdk1.8.0_73`
3. `export PATH=$JAVA_HOME/bin:$PATH`
4. `export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar`
5. 
6. `JAVA_OPTS="-Dfile.encoding=utf-8 -javaagent:/work1/soft/monitor/jmx_prometheus_javaagent-0.3.1.jar=30013:/work1/soft/monitor/tomcat.yml"`
7. 
8. `# OS specific support. $var _must_ be set to either true or false.`
9. `cygwin=false`
10. `darwin=false`
11. `os400=false`
12. `hpux=false`
13. `case "`uname`" in`


    
  • 在prometheus.yml中添加:

      1. `- job_name: 'jmx_tomcat'`
2. `static_configs:`
3. `- targets: ['192.168.1.137:30013']`
4. `labels:`
5. `instance: '137-info'`
6. `- targets: ['192.168.1.138:30013']`
7. `labels:`
8. `instance: '138-admin'`
9. `- targets: ['192.168.1.139:30014']`
10. `labels:`
11. `instance: '139-user'`


    

picture.image

picture.image

  • 结果:

picture.image

注意,这里没有需要添加工程名的要求,但是下面的springboot方式需要注意工程名

  1. j ar包的详细说明和 下载地址:https://github.co m/prometheus/jmx_exporte r

    1. http://192.168.1.208:6060 可以看到metrics的信息。

    3.prometheus.yml中添加如下信息:


      1. `- job_name: 'jmx'`
2. `static_configs:`
3. `- targets: ['192.168.1.208:6060']`
4. `labels:`
5. `instance: '192.168.1.208'`


    

4.grafana界面上添加dashboard 使用的是https://grafana.com/grafana/dashboards/3457

8563也很不错,可以直接添加job name:https://grafana.com/grafana/dashboards/8563。

参考:https://blog.csdn.net/weixin\_34413103/article/details/88716872

  1. 界面如下:

picture.image 2. docker布署 参考:https://blog.csdn.net/weixin\_34413103/article/details/88716872

用jmxprometheusjavaagent-0.12.0.jar监控springboot程序

如果使用的不是tomcat容器,可以使用上文提到的httpserversampleconfig.yml或者自定义一个yml,如果使用的是tomcat容器,可以使用上面的tomcat.yml。在idea的vm options中添加:


      1. `-
 javaagent
 :./
 lib
 /
 jmx\_prometheus\_javaagent
 -
 0.12
 .
 0.jar
 =
 192.168
 .
 1.208
 :
 6060
 :./
 config
 /
 tomcat
 .
 yml`


    

jar包和yml文件需要提前放入指定目录中。

直接cmd启动:


      1. `java 
 -
 javaagent
 :./
 jmx\_prometheus\_javaagent
 -
 0.12
 .
 0.jar
 =
 192.168
 .
 1.208
 :
 6060
 :./
 tomcat
 .
 yml 
 -
 jar 
 Market
 .
 jar`


    

springboot2

springboot2的Micrometer:Micrometer 是一款监控指标的度量类库,可以让你在没有供应商锁定的情况下对 JVM 的应用程序代码进行调整。Spring Boot 2.0 增强了对 Micrometer 的集成,不再提供自己的指标 API。依靠 micrometer.io 来满足所有应用程序监视需求。

Micrometer 包括尺寸指标的支持,当与尺寸监测系统配对时,尺寸指标可以有效访问特定的指定度量标准,并且可以在其尺寸范围内向下钻取。

指标可以输出到各种系统和开箱即用的 Spring Boot 2.0,为 Atlas、Datadog、Ganglia、Graphite、Influx、JMX、New Relic、Prometheus、SignalFx、StatsD 和 Wavefront 提供支持,另外还可以使用简单的内存中度量标准。

集成后提供 JVM 指标(包括 CPU、内存、线程和 GC)、Logback、Tomcat、Spring MVC & 提供 RestTemplate。

springboot2监控指标见:https://www.cnblogs.com/JiangWJ/p/11117475.html

配置:


      1. `<dependency>`
2. `<groupId>org.springframework.boot</groupId>`
3. `<artifactId>spring-boot-starter-actuator</artifactId>`
4. `</dependency>`
5. 
6. `<dependency>`
7. `<groupId>io.micrometer</groupId>`
8. `<artifactId>micrometer-registry-prometheus</artifactId>`
9. `<version>1.0.6</version>`
10. `</dependency>`
11. 
12. `<dependency>`
13. `<groupId>io.github.mweirauch</groupId>`
14. `<artifactId>micrometer-jvm-extras</artifactId>`
15. `<version>0.1.2</version>`
16. `</dependency>`


    

application.properties:


      1. `#prometheus配置`
2. `management.metrics.export.prometheus.enabled=true`
3. `management.metrics.export.prometheus.step=1ms`
4. `management.metrics.export.prometheus.descriptions=true`
5. 
6. `management.endpoint.prometheus.enabled=true`
7. `management.endpoints.web.exposure.include=health,info,env,prometheus,metrics,httptrace,threaddump,heapdump,springmetrics`


    

直接

prometheus.yml:


      1. `- job_name: 'springboot2'`
2. `metrics_path: '/api/actuator/prometheus'`
3. `static_configs:`
4. `- targets: ['192.168.1.208:8080']`
5. `labels:`
6. `instance: '192.168.1.208-boot'`


    

效果:

picture.image

通过界面上add panel可以添加指标,可添加的指标如下:

  • jvmmemorycommitted_bytes
  • jvmthreadsstates_threads
  • jvmmemoryused_bytes
  • processcpuusage
  • rate(httpserverrequestssecondssum[5m])
  • jvmgcpausesecondscount

自定义java client

地址:https://github.com/java-rookie/client\_java 参考:https://www.jianshu.com/p/60c6d6cb4c49

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动客户端性能优化最佳实践
在用户日益增长、需求不断迭代的背景下,如何保证 APP 发布的稳定性和用户良好的使用体验?本次分享将结合字节跳动内部应用的实践案例,介绍应用性能优化的更多方向,以及 APM 团队对应用性能监控建设的探索和思考。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论