当前位置:   article > 正文

zabbix监控java进程内存使用情况_使用zabbix监控java进程各种信息 agent

使用zabbix监控java进程各种信息 agent

 需求:监控集群里面所有Java进程的内存使用情况。

查看linux系统里面有哪些java进程在运行:jps命令

  1. [root@localhost zabbix]# jps
  2. 26490 YarnTaskExecutorRunner
  3. 12012 NodeManager
  4. 14047 YarnTaskExecutorRunner
  5. 25007 Jps

查看java进程的内存使用情况:jstat命令  -gc  -gcutil

  1. [root@node035 zabbix]# jstat -gc 12012
  2. S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
  3. 2560.0 2560.0 0.0 2208.0 335872.0 180374.6 338432.0 57522.0 51624.0 50525.8 5808.0 5542.1 104079 881.980 3 0.384 882.364
  1. [root@node035 zabbix]# jstat -gcutil 12012
  2. S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
  3. 0.00 86.25 89.43 17.00 97.87 95.42 104079 881.980 3 0.384 882.364

 ####################################################################### 

采集数据脚本:

        这里最好用grep命令过滤出所有你要监控的所有java进程,不要用grep -v排除法

        因为有些进程可能从产生到销毁的过程比你使用jps命令还快,例如jps,jstat,jmap等命令,所以可能使用jps | grep 只能获取一个进程pid号,无法获取进程名等信息,

        导致你的脚本会出现偶尔卡顿的情况,然后数据获取也会出现一系列的问题

        对于可能出现的同一个进程名有多个进程存在的情况,例如父子进程等。

        这里脚本采用的是给相同进程名进行标记的方法,例如 kafka,kafka1,kafka2.....

        因为zabbix采用的是自动发现的方式来获取进程名,曾经尝试过使用进程名+pid的方式来获取,但是pid会发生变化,

        所以目前还没有好的方法来分离两个相同进程名的方法

        不过监控的意义在于观察监控项的趋势变化,如果看到一个进程内存状态有异常,根据进程名再到我们脚本的数据文件里面来获取pid

  1. [root@node031 monitor]# cat getJavaMemoryStatus.sh
  2. #!/bin/bash
  3. # Final output
  4. output=""
  5. # Variables
  6. flag=1
  7. last_name=""
  8. currnet_name=""
  9. # JPS Command
  10. result=`/usr/local/jdk/bin/jps | egrep "QuorumPeerMain|Kafka|CanalAdminApplication|CanalLauncher|JournalNode|DFSZKFailoverController|NameNode|DataNode|ResourceManager|NodeManager|YarnJobClusterEntrypoint|YarnTaskExecutorRunner|HMaster|HRegion" | sort -k2 -k1`
  11. # Main Loop
  12. #echo "$result" | while read -r pid name ; do
  13. while read -r pid name ; do
  14. #echo "${pid},${name},${last_name}"
  15. # Add num to same process name, for example: Process1, Process2 ...
  16. if [ x"$name" = x"$last_name" ]; then
  17. currnet_name="$name$flag"
  18. flag=$(( $flag + 1 ))
  19. else
  20. currnet_name="$name"
  21. flag=1
  22. fi
  23. last_name="$name"
  24. # Get GC Status
  25. res_gc=`/usr/local/jdk/bin/jstat -gc $pid 2>/dev/null | awk 'NR==2{print $1, $2, $3, $4, $5, $6, $7, $8}'`
  26. res_gcutil=`/usr/local/jdk/bin/jstat -gcutil $pid 2>/dev/null | awk 'NR==2{print $1, $2, $3, $4, $7, $8, $9, $10}'`
  27. # Combime output
  28. if [ x"$output" = x"" ]; then
  29. output="${currnet_name} $pid ${res_gc} ${res_gcutil}"
  30. else
  31. output+=$'\n'"${currnet_name} $pid ${res_gc} ${res_gcutil}"
  32. fi
  33. #echo "$output"
  34. done <<< "$result"
  35. # Output
  36. echo "$output" > /tmp/java_memory_status.txt

脚本优化:

        获取数据命令尽量只运行一次,减少服务器压力

        取数据的时候尽量不要读文件,减少IO

进程自动发现脚本:

  1. [root@localhost parameter_script]# cat java_discovery.sh
  2. #!/bin/bash
  3. javaProcessList=`cat /tmp/java_memory_status.txt|awk '{print $2"#"$1}'`
  4. echo "{\"data\":["
  5. first=1
  6. for javaProcess in $javaProcessList;
  7. do
  8. IFS='#' read -r -a items <<< "$javaProcess";
  9. if [ $first == 1 ]; then
  10. echo "{\"{#JAVAPSNAME}\":\"${items[1]}\",\"{#JAVAPSPID}\":\"${items[0]}\"}";
  11. first=0
  12. else
  13. echo ",{\"{#JAVAPSNAME}\":\"${items[1]}\",\"{#JAVAPSPID}\":\"${items[0]}\"}";
  14. fi
  15. done;
  16. echo "]}";

####################################################################### 

获取java进程内存数据脚本:

  1. [root@node031 parameter_script]# cat getjavastatus.sh
  2. #!/bin/bash
  3. pid=`cat /tmp/java_memory_status.txt | awk '{print $2}'`
  4. case $2 in
  5. # S0总大小
  6. S0C)
  7. grep -w $1 /tmp/java_memory_status.txt |awk '{print $3}'|bc
  8. ;;
  9. # S1总大小
  10. S1C)
  11. grep -w $1 /tmp/java_memory_status.txt |awk '{print $4}'|bc
  12. ;;
  13. # S0使用大小
  14. S0U)
  15. grep -w $1 /tmp/java_memory_status.txt |awk '{print $5}'|bc
  16. ;;
  17. # S1使用大小
  18. S1U)
  19. grep -w $1 /tmp/java_memory_status.txt |awk '{print $6}'|bc
  20. ;;
  21. # Eden总大小
  22. EC)
  23. grep -w $1 /tmp/java_memory_status.txt |awk '{print $7}'|bc
  24. ;;
  25. # Eden使用大小
  26. EU)
  27. grep -w $1 /tmp/java_memory_status.txt |awk '{print $8}'|bc
  28. ;;
  29. #old大小
  30. OC)
  31. grep -w $1 /tmp/java_memory_status.txt |awk '{print $9}'|bc
  32. ;;
  33. #old使用大小
  34. OU)
  35. grep -w $1 /tmp/java_memory_status.txt |awk '{print $10}'|bc
  36. ;;
  37. # S0使用率
  38. S0Util)
  39. grep -w $1 /tmp/java_memory_status.txt |awk '{print $11}'|bc
  40. ;;
  41. # S1使用率
  42. S1Util)
  43. grep -w $1 /tmp/java_memory_status.txt |awk '{print $12}'|bc
  44. ;;
  45. # Eden使用率
  46. EUtil)
  47. grep -w $1 /tmp/java_memory_status.txt |awk '{print $13}'|bc
  48. ;;
  49. #old使用率
  50. OUtil)
  51. grep -w $1 /tmp/java_memory_status.txt |awk '{print $14}'|bc
  52. ;;
  53. # 年轻代垃圾回收次数
  54. YGC)
  55. grep -w $1 /tmp/java_memory_status.txt |awk '{print $15}'|bc
  56. ;;
  57. # 年轻代垃圾回收消耗时间
  58. YGCT)
  59. grep -w $1 /tmp/java_memory_status.txt |awk '{print $16}'|bc
  60. ;;
  61. # 老年代垃圾回收次数
  62. FGC)
  63. grep -w $1 /tmp/java_memory_status.txt |awk '{print $17}'|bc
  64. ;;
  65. # 老年代垃圾回收消耗时间
  66. FGCT)
  67. grep -w $1 /tmp/java_memory_status.txt |awk '{print $18}'|bc
  68. ;;
  69. esac

添加配置文件,自定义监控项

  1. UserParameter=javaps,/etc/zabbix/parameter_script/java_discovery.sh
  2. UserParameter=javastat[*],/etc/zabbix/parameter_script/getjavastatus.sh $1 $2

重启zabbix-agent2进程

service zabbix-agent2 restart

配置计划任务

*/1 * * * * sh /data/script/monitor/getJavaMemoryStatus.sh

配置java进程自动发现

创建一个模板组:JavaProcess

 创建一个模板 JavaProcess

在 JavaProcess模板里面创建自动发现规则

 

 添加要监控的监控项原型

 给要监控的主机添加JavaProcess模板

 

zabbix会自动将发现的进程添加到对应主机,然后根据监控项原型创建出对应的监控项,采集到数据以后grafana就会产生图形

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/161284?site
推荐阅读
相关标签
  

闽ICP备14008679号