DSL 项目接口探活监控报警
# 前言
Jpom 中的项目监控是判断项目的运行状态,项目的非 DSL 模式的运行状态又是通过 jps 查找进程 id 来判断项目是否在运行中,这样在一些项目假死的情况是无法监控到的
但是如何能监控到项目的假死状态(假死一般是 CPU 满了,项目无法正常响应处理其他任务、死锁等),一般项目都可以通过是否能正常访问到接口来判断当前项目的状态或者项目的负载情况,以及接口里面可以自动判断条件来决定项目状态
提示
本文主要介绍如果使用 DSL 模式的项目来实现接口探活管理项目运行状态并且监控到异常发送邮件通知
# 需要准备的环境
- Jpom 服务端
- 安装 jpom 需要 java 环境
- 构建需要 maven 环境
- Jpom 插件端
- 安装 jpom 需要 java 环境
- 一个代码仓库(案例中使用 java 项目)
- 一个邮件发送账号
# 项目的初始化配置
配置细节请参考:DSL项目接口探活
# DSL 脚本示例
#!/bin/bash
Tag="Application_${PROJECT_ID}"
MainClass="org.springframework.boot.loader.JarLauncher"
Lib="${PROJECT_PATH}"
Log="${PROJECT_PATH}/run.log"
JVM="-server -Xms128m -Xmx128m -XX:PermSize=32M -XX:MaxNewSize=64m -XX:MaxPermSize=64m -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
TestUrl="http://127.0.0.1:8084/random-sleep?max=3"
echo $Tag
RETVAL="0"
# See how we were called.
function start() {
# 先停止
stop
echo $Log
if [ ! -f $Log ]; then
touch $Log
fi
nohup java $JVM -Dappliction=$Tag -Djava.ext.dirs=$Lib":${JAVA_HOME}/jre/lib/ext" $MainClass > $Log 2>&1 &
sleep 3
head -n 10 $Log
}
function stop() {
pid=$(ps -ef | grep -v 'grep' | egrep $Tag| awk '{printf $2 " "}')
if [ "$pid" != "" ]; then
echo -n "boot ( pid $pid) is running"
echo
echo -n $"Shutting down boot: "
pid=$(ps -ef | grep -v 'grep' | egrep $Tag| awk '{printf $2 " "}')
if [ "$pid" != "" ]; then
echo "kill boot process"
kill -9 "$pid"
fi
else
echo "boot is stopped"
fi
status
}
function get_json_value()
{
local json=$1
local key=$2
local value=$(echo "${json}" | awk -F "[{,:}]" '{for(i=1;i<=NF;i++){if($i~"'${key}'"){print $(i+1)}}}' | sed 's/\"//g')
echo ${value}
}
function status()
{
# 这里的端口或者url 路径需要跟进你的项目端口和获取项目状态的接口来定
result_msg=$(curl -s -X GET --header 'Accept: application/json' --connect-timeout 2 -m 2 $TestUrl)
#echo $result_msg
echo "running:`get_json_value "${result_msg}" "data"`"
}
# See how we were called.
RETVAL="0"
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
*)
usage
;;
esac
exit $RETVAL
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
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
说明:这里为了复现假死状态,特意模拟了休眠时间,并且将超时时间修改为 2 秒,实际使用中请修改为自己业务的端口和接口地址,以及超时时间
curl 请求超时时间不要过长,建议控制在 1 秒。因为获取项目状态是串行执行,如果单个项目 status 执行耗时过大会影响查看节点项目状态相关功能
补充说明
在 Jpom 中,重启流程看下图。在一些极端情况下,可能出现已经无法监控到运行状态了,但是项目进程还存在。这样如果直接执行启动很大可能出现项目端口被占用的情况。目前建议在 DSL 脚本的 start 方法中手动调用一下 stop(后续版本会优化此流程)
# 配置邮件发送信息
# 配置邮件发件人
注意:密码一般为授权码并发邮件的登陆密码,这里使用 QQ 邮箱为例,不同平台获取邮箱授权码方式不一样,实际使用中可以在搜索引擎中搜索查看生成邮箱授权码方法
# 配置监控信息
# 愉快使用
这样就实现使用接口来探活监控项目状态并且可以邮件报警等,更多配置效果等您来发现!
帮助我们改善此文档 (opens new window)
上次更新: 2023/11/16, 15:33:44