文章目录
- 1.创建shell监控脚本flink_log_monitor.sh
- 2.设置钉钉智能机器人
- 3.crontab执行脚本
- 4.mysql存放日志INFO
- 5.钉钉告警
1.创建shell监控脚本flink_log_monitor.sh
#!/bin/bash
now=`date '+%Y-%m-%d %H:%M:%S'`
# 传入要遍历的目录
root_dir="$1"
# 初始化监控文件,通过getdir方法得到
monitor_file=
# 错误记录到mysql
function error_storage(){
/usr/bin/mysql -uXXX -pXXX -h XXX -P 3306 -e \
"use hadoop;
CREATE TABLE IF NOT EXISTS hadoop.FLINK_LOG_MONITOR(
YARN_JOB_NAME VARCHAR(255) COMMENT 'FLINK ON YARN JOB名称',
YARN_ID VARCHAR(255) COMMENT 'FLINK ON YARN ID',
HOST_NAME VARCHAR(255) COMMENT '日志产生的HOST',
ERROR_LOG_DIR VARCHAR(255) COMMENT 'ERROR日志目录',
ERROR_TIMES INT(11) DEFAULT 0 COMMENT '日志中ERROR次数',
CREATE_TIME DATETIME DEFAULT NULL COMMENT '日志时间',
PRIMARY KEY (YARN_JOB_NAME,HOST_NAME,ERROR_LOG_DIR)
)ENGINE = INNODB DEFAULT CHARSET = utf8 comment 'YARN APPLICATION 的日志监控';
"
}
# 钉钉告警
# 告警的是日志中新增error次数
function DingDing_Alarm(){
webhook='https://oapi.dingtalk.com/robot/send?access_token=XXXXXX'
curl $webhook -H 'Content-Type: application/json' -d "
{
'msgtype': 'text',
'text': {
'content': 'FlinkJob On yarn Log Error Alarm\n
YARN_JOB_NAME: [$yarn_job_name]\n
YARN_ID: [$yarn_id]\n
HOST: [$hostname]\n
ERROR_LOG_DIR: [$monitor_file] \n
ERROR_TIMES: [$error_increase]\n
CREATE_TIME: [$now]'
}
}"
}
# 错误日志监控
function error_monitor(){
error_times=$(cat $monitor_file | grep 'ERROR' | wc -l)
if [[ $error_times -gt 0 ]];then
yarn_id=`echo "$monitor_file"|awk -F '/' '{print $6}'`
yarn_job_name=`$HADOOP_HOME/bin/yarn application -list | grep $yarn_id | awk '{print $2}'`
hostname=$HOSTNAME
#只对yarn jobm名中包含flink的任务进行日志监控
if [[ $yarn_job_name =~ "flink" ]]; then
error_times_mysql=`/usr/bin/mysql -uXXX -pXXX -h XXX -P 3306 -Bse "
select ERROR_TIMES from hadoop.FLINK_LOG_MONITOR WHERE YARN_JOB_NAME='"$yarn_job_name"' AND HOST_NAME='"$hostname"' AND ERROR_LOG_DIR='"$monitor_file"';
" | tr -cd '[0-9]' | sed -r 's/0*([0-9])/\1/'`
# error_times_mysql为空时,赋值为0
para=
if [[ $error_times_mysql == $para ]];then
error_times_mysql=0
fi
# 新增error次数
error_increase=$(($error_times - $error_times_mysql))
if [[ $error_increase -gt 0 ]];then
# 错误日志情况
/usr/bin/mysql -uXXX -pXXX -h XXX -P 3306 -e \
"
replace into hadoop.FLINK_LOG_MONITOR values('"$yarn_job_name"','"$yarn_id"','"$hostname"','"$monitor_file"','"$error_times"','$now');
"
# 钉钉告警
DingDing_Alarm
elif [[ $error_increase -lt 0 ]];then
echo 'error_increse 小于0'
/usr/bin/mysql -uXXX -pXXX -h XXX -P 3306 -e \
"
delete from hadoop.FLINK_LOG_MONITOR WHERE YARN_JOB_NAME='"$yarn_job_name"' AND HOST_NAME='"$hostname" AND ERROR_LOG_DIR='"$monitor_file"'';
"
fi
fi
fi
}
# 遍历目录下的所有子目录及文件
function getdir(){
for element in `ls $1`
do
dir_or_file=$1"/"$element
if [ -d $dir_or_file ]
then
getdir $dir_or_file
else
monitor_file=$dir_or_file
#对每个文件日志进行监控
error_monitor
fi
done
}
# 初始话数据库
# error_storage
# 执行脚本 ./flink_log_monitor.sh $HADOOP_HOME/logs/userlogs
getdir $root_dir
2.设置钉钉智能机器人
参考
shell 操作钉钉机器人实现告警提醒的方法
https://www.jb51.net/article/186143.htm
钉钉官网开发文档
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
3.crontab执行脚本
此crontab 调用方式会有问题
# 每1小时运行一次
0 */1 * * * /flink/flinkPro/flink_log_monitor.sh $HADOOP_HOME/logs/userlogs
注意:$HADOOP_HOME/logs/userlogs 目录存放了所有在yarn上运行的应用日志
特别注意:
/flink/flinkPro/flink_log_monitor.sh $HADOOP_HOME/logs/userlogs
这行脚本可以在linux的shell中直接运行,但是使用crontab调用执行的时候就会找不到$HADOOP_HOME 对应的值.
可以在/var/log/cron 或 /var/log/message 或/var/spool/mail/root查看到相应报错日志
正确的crontab 调用方式
(1)将脚本flink_log_monitor.sh 中的所有用到$HADOOP_HOME的,改成具体的本地hadoop路径,如/hadoop/hadoop-2.9.1
(2)另外创建一个脚本flink_monitor.sh
#!/bin/bash
nohup /flink/flinkMonitor/flink_log_monitor.sh /hadoop/hadoop-2.9.1/logs/userlogs > /flink/flinkMonitor/monitor.log 2>&1 &
(3)再使用crontab 调用
# 每1小时运行一次
0 */1 * * * /flink/flinkMonitor/flink_monitor.sh
(4)可以在指定路径/flink/flinkMonitor/monitor.log看到crontab运行日志
tail -200f /flink/flinkMonitor/monitor.log
4.mysql存放日志INFO
YARN_JOB_NAME: FLINK ON YARN JOB名称
YARN_ID : FLINK ON YARN ID
HOST_NAME: 日志产生的HOST
ERROR_LOG_DIR: ERROR日志目录
ERROR_TIMES : 日志中新增ERROR次数,只有新增的ERROR才会发送钉钉告警
CREATE_TIME: 日志时间
5.钉钉告警
这个是对应Flink Web界面上jobmanager报错日志的linux机器存储目录
ERROR_LOG_DIR: [/hadoop/hadoop-2.9.1/logs/userlogs/application_1590926337664_5935/container_e84_1590926337664_5935_01_000001/jobmanager.log]
可直接 tail -200f 命令查看具体日志信息
tail -200f hadoop/hadoop-2.9.1/logs/userlogs/application_1590926337664_5935/container_e84_1590926337664_5935_01_000001/jobmanager.log
这个是对应Flink Web界面上taskmanager报错日志的linux机器存储目录
ERROR_LOG_DIR: [/hadoop/hadoop-2.9.1/logs/userlogs/application_1590926337664_5935/container_e84_1590926337664_5935_01_000002/taskmanager.log]