• 【Zabbix】自动发现jvm


    前言

    希望通过自动发现Docker中的JAVA应用程序的JVM指标。

    思路

    1. 对zabbix_agent上的JAVA应用程序容器名进行收集
    2. 对zabbix_agent上的各项JVM指标进行收集
    3. 自动发现Docker中的JAVA应用程序

    zabbix_agent上的JAVA应用程序容器名进行收集

    zabbix_agent配置文件增加java_services采集项

    #自定义监控项 通过python脚本获取宿主机上的所有java容器
    UserParameter=java.services,/etc/zabbix/script/java_services.py   
    
    
    
    • 1
    • 2
    • 3
    • 4

    java_services.py

    ##返回结果为json格式的字符串,其中包含了几个java服务的容器名称。那么通过该py脚本可以配置自动发现规则。
    #!/usr/bin/env python3
    import json
    import os
    
    cmd=os.popen("""docker ps -a |grep Up|grep java|grep -Ei "java_risk|java_notify|java_pay"|awk '{print $12}'""")
    
    services=[]
    
    for port in cmd.readlines():
             r=port.strip()
             services+=[{'{#SERVICE}':r}]
    
    print (json.dumps({'data':services},sort_keys=True,indent=4,separators=(',',':')))    
                     
                                                                       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    对zabbix_agent上的各项JVM指标进行收集

    zabbix_agent配置文件增加gc采集项

    
    UserParameter=Socket.Survivor0[*],/etc/zabbix/script/get_gcstat.sh $1 s1
    UserParameter=Socket.Survivor1[*],/etc/zabbix/script/get_gcstat.sh $1 s2
    UserParameter=Socket.Eden[*],/etc/zabbix/script/get_gcstat.sh $1 eden
    UserParameter=Socket.Old[*],/etc/zabbix/script/get_gcstat.sh $1 old
    UserParameter=Socket.Metaspace[*],/etc/zabbix/script/get_gcstat.sh $1 meta
    UserParameter=Socket.CCS[*],/etc/zabbix/script/get_gcstat.sh $1 css
    UserParameter=Socket.YGC[*],/etc/zabbix/script/get_gcstat.sh $1 ygc
    UserParameter=Socket.YGCT[*],/etc/zabbix/script/get_gcstat.sh $1 ygct
    UserParameter=Socket.FGC[*],/etc/zabbix/script/get_gcstat.sh $1 fgc
    UserParameter=Socket.FGCT[*],/etc/zabbix/script/get_gcstat.sh $1 fgct
    UserParameter=Socket.GCT[*],/etc/zabbix/script/get_gcstat.sh $1 gct
    UserParameter=Socket.LGCC[*],/etc/zabbix/script/get_gcstat.sh $1 lgcc
    UserParameter=Socket.GCC[*],/etc/zabbix/script/get_gcstat.sh $1 gcc
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    get_gcstat.sh

    
    ## get_gcstat.sh
    #!/bin/bash
    TargetWord='SocketPlatform.jar'
    JavaBinDir='/usr/bin/'
    Server_name=$1
    S_file=/tmp/gcstat_${Server_name}.txt
    #PID=$("${JavaBinDir}"jps -l |grep ${TargetWord} | awk -F' ' '{print $1}')
    
    Get_status(){ 
    local PID=$(docker exec -i ${Server_name} /bin/ps -ef|grep java |grep -v grep |awk '{print $2}')
    local CMD="docker exec -i ${Server_name}"
    ${CMD} ${JavaBinDir}jstat -gccause $PID 1 1  > $S_file
    flag=0
    for i in $PID
    do
        if [ ! -z $i  ]
        then
            let flag+=1
        fi
    done
     
    if [ $flag -ne 1 ]
    then
        echo "the number of $TargetWord is more than 1 !!!"
        exit
    fi
    }
    # get value from jstat
    function gcstat_colum(){
        if [ ! -z ${1} ]&& [ ! -z ${2} ] && [ ! -z ${3} ] ;then
            #echo "cat $S_file |tail -1|awk -F' ' '{print $'${1}',$'${2}',$'${3}'}'"
            ret=$(cat $S_file |tail -1|awk -F' ' '{print $'${1}',$'${2}',$'${3}'}')
            echo $ret
        elif [ ! -z ${1} ]&& [ ! -z ${2} ]
        then
            ret=$(cat $S_file |tail -1|awk -F' ' '{print $'${1}',$'${2}'}')
            echo $ret
        elif [ ! -z ${1} ] && [ -z ${2} ]
        then
            ret=$(cat $S_file |tail -1|awk -F' ' '{print $'${1}'}')
            echo $ret
        else
            echo 'function get wrong arguments !'
        fi
    }
     
    # print prompt when script parameter is wrong
    function print_prompt(){
        echo '    please input correct parameter !' 
        echo '
        s1  (Survivor0)
        s2  (Survivor1)
        eden(Eden)
        old (Old)
        meta(Metaspace)
        css (CCS)
        ygc (YGC)
        ygct(YGCT)
        fgc (FGC)
        fgct(FGCT)
        gct (GCT)
            lgcc(LGCC)
        gcc (GCC)
    '
    }
     
    # transfer script's parameter to function gcstat_colum()
    case $2 in
    s1)
        gcstat_colum 1
        ;;
    s2)
        gcstat_colum 2
        ;;
    eden)
        gcstat_colum 3
        ;;
    old)
        gcstat_colum 4
        ;;
    meta)
        gcstat_colum 5
        ;;
    css)
        gcstat_colum 6
        ;;
    ygc)
        gcstat_colum 7
        ;;
    ygct)
        gcstat_colum 8
        ;;
    fgc)
        gcstat_colum 9
        ;;
    fgct)
        gcstat_colum 10
        ;;
    gct)
        gcstat_colum 11
        ;;
    lgcc)
        #gcstat_colum 12 13 
        gcstat_colum 12 13 14
        ;;
    gcc)
        Get_status
        #gcstat_colum 14 15
        gcstat_colum 15 16
        ;;
    *)
        print_prompt
        ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115

    新增JVM模板,自动发现Docker中的JAVA应用程序

    请添加图片描述请添加图片描述

    配置监控项原型

    特别要注意的是,因LGCC和GCC监控项的结果不一定是浮点数,将它们的字符类型改为文本,其他监控项的字符类型为浮点数。

    请添加图片描述

  • 相关阅读:
    springboot12总结篇(9 10 11)
    win10和win11如何用管理员身份打开hosts文件
    C语言分支和循环语句—for
    刷题2个月,终于挺进梦寐以求的大厂,数据结构和算法太TM重要了
    帆软报表执行sql报SQL command not properly ended
    TCP/IP
    sqlite3数据库文件损坏修复
    手写一个下拉的左侧二级菜单,Vue项目
    SmartSoftHelp 7.0 程序员必备工具
    监控识别未佩戴安全帽
  • 原文地址:https://blog.csdn.net/wayne_primes/article/details/126266106