1. 开启Tomcat JMX功能
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=10.124.129.241
-Dcom.sun.management.jmxremote.port=8889
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
重启tomcat即可;
注:java程序都会提供一个JMX接口去进行采集相关的数据,其他开启方式请参考相关说明,我主要是已tomcat监控为主;
2. 编写自动发现端口脚本
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
|
[
root
@
localhost
scripts
]
# cat /etc/zabbix/scripts/jmx_discovery.sh
#!/bin/bash
# function:monitor tcp connect status from zabbix
source
/
etc
/
bashrc
>
/
dev
/
null
2
>
&
1
source
/
etc
/
profile
>
/
dev
/
null
2
>
&
1
jmx_port_discovery
(
)
{
jmx_port
=
(
$
(
cat
/
etc
/
zabbix
/
scripts
/
java
.
txt
|
cut
-
d
"|"
-
f2
)
)
Tomcat_Name
=
(
$
(
cat
/
etc
/
zabbix
/
scripts
/
java
.
txt
|
cut
-
d
"|"
-
f1
)
)
printf
'{\n'
printf
'\t"data":[\n'
for
(
(
i
=
0
;
i
<
$
{
#jmx_port[@]};++i))
{
num
=
$
(
echo
$
(
(
$
{
#jmx_port[@]}-1)))
if
[
"$i"
!=
$
{
num
}
]
;
then
printf
"\t\t{ \n"
printf
"\t\t\t\"{#JMX_PORT}\":\"${jmx_port[$i]}\",\n"
printf
"\t\t\t\"{#JAVA_NAME}\":\"${Tomcat_Name[$i]}\"},\n"
else
printf
"\t\t{ \n"
printf
"\t\t \n"
printf
"\t\t\t\"{#JMX_PORT}\":\"${jmx_port[$i]}\",\n"
printf
"\t\t\t\"{#JAVA_NAME}\":\"${Tomcat_Name[$i]}\"}]}\n"
fi
}
}
case
"$1"
in
jmx_port_discovery
)
jmx_port
_discovery
;
;
*
)
echo
"Usage:$0 {jmx_port_discovery}"
;
;
esac
|
编写/etc/zabbix/scripts/java.txt文件,内容如下:
1
2
3
|
[
root
@
localhost
scripts
]
# cat /etc/zabbix/scripts/java.txt
Tomcat_442
|
8880
Tomcat_8591
|
8881
|
注:其实这里有个弊端,不太智能,也就是需要把监控的jmx端口和相关服务名称写到这个文本里去,这里还需要网友提供一个更可靠的方法,还请大家不要栗色指教。
3. 编写jmx监控配置文件
1
2
3
4
5
|
[
root
@
localhost
~
]
# cat /etc/zabbix/zabbix_agentd.conf.d/discovery_java_status.conf
UserParameter
=
java
.
jmx
.
discovery
,
/
etc
/
zabbix
/
scripts
/
jmx_discovery
.
sh
jmx_port_discovery
UserParameter
=
java
.
HeapMemoryUsage
.
status
[
*
]
,
/
usr
/
local
/
jdk1
.
7.0_71
/
bin
/
java
-
jar
/
etc
/
zabbix
/
scripts
/
cmdline
-
jmxclient
-
0.10.3.jar
-
127.0.0.1
:
$
1
java
.
lang
:
type
=
Memory
HeapMemoryUsage
2
>
&
1
|
grep
$
2
|
cut
-
d
" "
-
f2
UserParameter
=
java
.
NonHeapMemoryUsage
.
status
[
*
]
,
/
usr
/
local
/
jdk1
.
7.0_71
/
bin
/
java
-
jar
/
etc
/
zabbix
/
scripts
/
cmdline
-
jmxclient
-
0.10.3.jar
-
127.0.0.1
:
$
1
java
.
lang
:
type
=
Memory
NonHeapMemoryUsage
2
>
&
1
|
grep
$
2
|
cut
-
d
" "
-
f2
UserParameter
=
java
.
LoadClass
.
status
[
*
]
,
/
usr
/
local
/
jdk1
.
7.0_71
/
bin
/
java
-
jar
/
etc
/
zabbix
/
scripts
/
cmdline
-
jmxclient
-
0.10.3.jar
-
127.0.0.1
:
$
1
java
.
lang
:
type
=
ClassLoading
$
2
2
>
&
1
|
cut
-
d
" "
-
f6
|
4. 进行测试
其实,整体大致就是如此,key都能定义好了,至于模板我相信大家都能写了。(我也是今天才刚刚弄了下,很多也还没有完善)有关不同java的服务,最好是查看一下相关的文档,比如tomcat官方文档。这里大家可以参考一下tomcat自带的模板,下面给大家展示一下效果图:
谢谢"北京 - 小易"的分享。