Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
javalover123888
SkyWalking
提交
acdfd823
S
SkyWalking
项目概览
javalover123888
/
SkyWalking
与 Fork 源项目一致
Fork自
山不在高_有仙则灵 / SkyWalking
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SkyWalking
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
acdfd823
编写于
4月 25, 2016
作者:
wu-sheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.修复邮件底色的问题
2.改写新的邮件标题规则,使用户可以通过邮件判断邮件内容的告警类型,优先显示系统异常。
上级
9629db51
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
170 addition
and
147 deletion
+170
-147
skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/procesor/AlarmMessageProcessor.java
...loud/skywalking/alarm/procesor/AlarmMessageProcessor.java
+169
-144
skywalking-alarm/src/main/resources/mail-template.ftl
skywalking-alarm/src/main/resources/mail-template.ftl
+1
-3
未找到文件。
skywalking-alarm/src/main/java/com/ai/cloud/skywalking/alarm/procesor/AlarmMessageProcessor.java
浏览文件 @
acdfd823
...
...
@@ -36,164 +36,189 @@ import freemarker.template.TemplateException;
public
class
AlarmMessageProcessor
{
private
static
Logger
logger
=
LogManager
.
getLogger
(
AlarmMessageProcessor
.
class
);
static
List
<
AlarmType
>
alarmTypeList
;
static
Template
t
;
static
{
alarmTypeList
=
AlarmTypeUtil
.
getAlarmTypeList
();
}
public
void
process
(
UserInfo
userInfo
,
AlarmRule
rule
)
throws
TemplateException
,
IOException
,
SQLException
{
Map
<
String
,
List
<
AlarmMessage
>>
warningMap
=
new
HashMap
<
String
,
List
<
AlarmMessage
>>();
Set
<
String
>
warningMessageKeys
=
new
HashSet
<
String
>();
long
currentFireMinuteTime
=
System
.
currentTimeMillis
()
/
(
1000
*
60
);
long
warningTimeWindowSize
=
currentFireMinuteTime
-
rule
.
getPreviousFireTimeM
();
// 获取待发送数据
if
(
warningTimeWindowSize
>=
rule
.
getConfigArgsDescriber
().
getPeriod
())
{
for
(
AlarmType
alarmType
:
alarmTypeList
)
{
String
type
=
alarmType
.
getType
();
List
<
AlarmMessage
>
warningObjects
=
new
ArrayList
<
AlarmMessage
>();
for
(
ApplicationInfo
applicationInfo
:
rule
.
getApplicationInfos
())
{
for
(
int
period
=
0
;
period
<
warningTimeWindowSize
;
period
++)
{
Long
currentMinuteTime
=
currentFireMinuteTime
-
period
-
1
;
String
alarmKey
=
userInfo
.
getUserId
()
+
"-"
+
applicationInfo
.
getAppCode
()
+
"-"
+
currentMinuteTime
;
if
(!
type
.
equals
(
"default"
))
{
alarmKey
+=
"-"
+
type
;
}
warningMessageKeys
.
add
(
alarmKey
);
setAlarmMessages
(
alarmKey
,
warningObjects
);
}
}
if
(
warningObjects
.
size
()
>
0
)
{
warningMap
.
put
(
type
,
warningObjects
);
}
}
// 发送告警数据
int
warningSize
=
this
.
getWarningSize
(
warningMap
);
if
(
warningSize
>
0
)
{
if
(
"0"
.
equals
(
rule
.
getTodoType
()))
{
logger
.
info
(
"A total of {} alarm information needs to be sent {}"
,
warningSize
,
rule
.
getConfigArgsDescriber
().
getMailInfo
().
getMailTo
());
// 发送邮件
String
subjects
=
generateSubject
(
userInfo
.
getUserName
(),
warningSize
,
rule
.
getPreviousFireTimeM
(),
currentFireMinuteTime
);
Map
<
String
,
Object
>
parameter
=
new
HashMap
<
String
,
Object
>();
parameter
.
put
(
"alarmTypeList"
,
alarmTypeList
);
parameter
.
put
(
"warningMap"
,
warningMap
);
parameter
.
put
(
"name"
,
userInfo
.
getUserName
());
parameter
.
put
(
"startDate"
,
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
rule
.
getPreviousFireTimeM
()
*
10000
*
6
)));
parameter
.
put
(
"endDate"
,
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
currentFireMinuteTime
*
10000
*
6
)));
String
mailContext
=
generateContent
(
parameter
);
if
(
mailContext
.
length
()
>
0
)
{
MailInfo
mailInfo
=
rule
.
getConfigArgsDescriber
()
.
getMailInfo
();
MailUtil
.
sendMail
(
mailInfo
.
getMailTo
(),
mailInfo
.
getMailCc
(),
mailContext
,
subjects
);
}
}
}
// 清理数据
for
(
String
toBeRemovedKey
:
warningMessageKeys
)
{
expiredAlarmMessage
(
toBeRemovedKey
);
}
// 修改-保存上次处理时间
dealPreviousFireTime
(
userInfo
,
rule
,
currentFireMinuteTime
);
}
}
private
void
dealPreviousFireTime
(
UserInfo
userInfo
,
AlarmRule
rule
,
long
currentFireMinuteTime
)
{
rule
.
setPreviousFireTimeM
(
currentFireMinuteTime
);
savePreviousFireTime
(
userInfo
.
getUserId
(),
rule
.
getRuleId
(),
currentFireMinuteTime
);
}
private
String
generateSubject
(
String
userName
,
int
count
,
long
startTime
,
long
endTime
)
{
//TODO:邮件标题修改,添加了名称
String
title
=
"[Warning] Dear "
+
userName
+
", there were "
+
count
+
" alarm information between "
+
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
startTime
*
10000
*
6
))
+
" to "
+
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
endTime
*
10000
*
6
));
return
title
;
}
private
void
expiredAlarmMessage
(
final
String
key
)
{
RedisUtil
.
execute
(
new
Executable
<
Long
>()
{
private
static
Logger
logger
=
LogManager
.
getLogger
(
AlarmMessageProcessor
.
class
);
private
static
final
String
TYPE_OF_EXCEPTION_WARNING
=
"default"
;
static
List
<
AlarmType
>
alarmTypeList
;
static
Template
t
;
static
{
alarmTypeList
=
AlarmTypeUtil
.
getAlarmTypeList
();
}
public
void
process
(
UserInfo
userInfo
,
AlarmRule
rule
)
throws
TemplateException
,
IOException
,
SQLException
{
Map
<
String
,
List
<
AlarmMessage
>>
warningMap
=
new
HashMap
<
String
,
List
<
AlarmMessage
>>();
Set
<
String
>
warningMessageKeys
=
new
HashSet
<
String
>();
long
currentFireMinuteTime
=
System
.
currentTimeMillis
()
/
(
1000
*
60
);
long
warningTimeWindowSize
=
currentFireMinuteTime
-
rule
.
getPreviousFireTimeM
();
// 获取待发送数据
if
(
warningTimeWindowSize
>=
rule
.
getConfigArgsDescriber
().
getPeriod
())
{
for
(
AlarmType
alarmType
:
alarmTypeList
)
{
String
type
=
alarmType
.
getType
();
List
<
AlarmMessage
>
warningObjects
=
new
ArrayList
<
AlarmMessage
>();
for
(
ApplicationInfo
applicationInfo
:
rule
.
getApplicationInfos
())
{
for
(
int
period
=
0
;
period
<
warningTimeWindowSize
;
period
++)
{
Long
currentMinuteTime
=
currentFireMinuteTime
-
period
-
1
;
String
alarmKey
=
userInfo
.
getUserId
()
+
"-"
+
applicationInfo
.
getAppCode
()
+
"-"
+
currentMinuteTime
;
if
(!
TYPE_OF_EXCEPTION_WARNING
.
equals
(
type
))
{
alarmKey
+=
"-"
+
type
;
}
warningMessageKeys
.
add
(
alarmKey
);
setAlarmMessages
(
alarmKey
,
warningObjects
);
}
}
if
(
warningObjects
.
size
()
>
0
)
{
warningMap
.
put
(
type
,
warningObjects
);
}
}
// 发送告警数据
int
warningSize
=
this
.
getWarningSize
(
warningMap
);
int
exceptionAlarmSize
=
this
.
getExceptionSize
(
warningMap
);
if
(
warningSize
>
0
)
{
if
(
"0"
.
equals
(
rule
.
getTodoType
()))
{
logger
.
info
(
"A total of {} alarm information needs to be sent {}"
,
warningSize
,
rule
.
getConfigArgsDescriber
()
.
getMailInfo
().
getMailTo
());
// 发送邮件
String
subjects
=
generateSubject
(
userInfo
.
getUserName
(),
exceptionAlarmSize
,
warningSize
,
rule
.
getPreviousFireTimeM
(),
currentFireMinuteTime
);
Map
<
String
,
Object
>
parameter
=
new
HashMap
<
String
,
Object
>();
parameter
.
put
(
"alarmTypeList"
,
alarmTypeList
);
parameter
.
put
(
"warningMap"
,
warningMap
);
parameter
.
put
(
"name"
,
userInfo
.
getUserName
());
parameter
.
put
(
"startDate"
,
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
rule
.
getPreviousFireTimeM
()
*
10000
*
6
)));
parameter
.
put
(
"endDate"
,
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
currentFireMinuteTime
*
10000
*
6
)));
String
mailContext
=
generateContent
(
parameter
);
if
(
mailContext
.
length
()
>
0
)
{
MailInfo
mailInfo
=
rule
.
getConfigArgsDescriber
()
.
getMailInfo
();
MailUtil
.
sendMail
(
mailInfo
.
getMailTo
(),
mailInfo
.
getMailCc
(),
mailContext
,
subjects
);
}
}
}
// 清理数据
for
(
String
toBeRemovedKey
:
warningMessageKeys
)
{
expiredAlarmMessage
(
toBeRemovedKey
);
}
// 修改-保存上次处理时间
dealPreviousFireTime
(
userInfo
,
rule
,
currentFireMinuteTime
);
}
}
private
void
dealPreviousFireTime
(
UserInfo
userInfo
,
AlarmRule
rule
,
long
currentFireMinuteTime
)
{
rule
.
setPreviousFireTimeM
(
currentFireMinuteTime
);
savePreviousFireTime
(
userInfo
.
getUserId
(),
rule
.
getRuleId
(),
currentFireMinuteTime
);
}
private
String
generateSubject
(
String
userName
,
int
exceptionAlarmSize
,
int
count
,
long
startTime
,
long
endTime
)
{
String
title
=
(
exceptionAlarmSize
>
0
?
"[Error]"
:
"[Warning]"
)
+
" Dear "
+
userName
+
", SkyWalking collects "
+
(
exceptionAlarmSize
>
0
?
exceptionAlarmSize
+
" tid of system exceptions, "
:
""
);
if
(
count
>
exceptionAlarmSize
)
{
title
+=
(
count
-
exceptionAlarmSize
)
+
" tid of warings, "
;
}
title
+=
"between "
+
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
startTime
*
10000
*
6
))
+
" to "
+
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
new
Date
(
endTime
*
10000
*
6
));
return
title
;
}
private
void
expiredAlarmMessage
(
final
String
key
)
{
RedisUtil
.
execute
(
new
Executable
<
Long
>()
{
@Override
public
Long
exe
(
Jedis
client
)
{
return
client
.
expire
(
key
,
0
);
}
});
}
}
private
void
savePreviousFireTime
(
final
String
userId
,
final
String
ruleId
,
final
long
currentFireMinuteTime
)
{
RedisUtil
.
execute
(
new
Executable
<
Long
>()
{
private
void
savePreviousFireTime
(
final
String
userId
,
final
String
ruleId
,
final
long
currentFireMinuteTime
)
{
RedisUtil
.
execute
(
new
Executable
<
Long
>()
{
@Override
public
Long
exe
(
Jedis
client
)
{
return
client
.
hset
(
userId
,
ruleId
,
String
.
valueOf
(
currentFireMinuteTime
));
return
client
.
hset
(
userId
,
ruleId
,
String
.
valueOf
(
currentFireMinuteTime
));
}
});
}
}
private
void
setAlarmMessages
(
final
String
key
,
final
Collection
<
AlarmMessage
>
warningTracingIds
)
{
RedisUtil
.
execute
(
new
Executable
<
Object
>()
{
private
void
setAlarmMessages
(
final
String
key
,
final
Collection
<
AlarmMessage
>
warningTracingIds
)
{
RedisUtil
.
execute
(
new
Executable
<
Object
>()
{
@Override
public
Collection
<
String
>
exe
(
Jedis
client
)
{
Map
<
String
,
String
>
result
=
client
.
hgetAll
(
key
);
if
(
result
!=
null
)
{
for
(
String
traceid
:
result
.
keySet
()){
warningTracingIds
.
add
(
new
AlarmMessage
(
traceid
,
result
.
get
(
traceid
)));
}
}
return
null
;
if
(
result
!=
null
)
{
for
(
String
traceid
:
result
.
keySet
())
{
warningTracingIds
.
add
(
new
AlarmMessage
(
traceid
,
result
.
get
(
traceid
)));
}
}
return
null
;
}
});
}
private
String
generateContent
(
Map
parameter
)
throws
IOException
,
TemplateException
,
SQLException
{
if
(
t
==
null
)
{
t
=
TemplateConfigurationUtil
.
getConfiguration
().
getTemplate
(
"mail-template.ftl"
);
}
StringWriter
out
=
new
StringWriter
();
t
.
process
(
parameter
,
out
);
return
out
.
getBuffer
().
toString
();
}
private
int
getWarningSize
(
Map
<
String
,
List
<
AlarmMessage
>>
warningMap
)
{
int
result
=
0
;
for
(
Entry
<
String
,
List
<
AlarmMessage
>>
entry
:
warningMap
.
entrySet
())
{
if
(
entry
.
getValue
()
!=
null
)
{
result
+=
entry
.
getValue
().
size
();
}
}
return
result
;
}
}
private
String
generateContent
(
Map
parameter
)
throws
IOException
,
TemplateException
,
SQLException
{
if
(
t
==
null
)
{
t
=
TemplateConfigurationUtil
.
getConfiguration
().
getTemplate
(
"mail-template.ftl"
);
}
StringWriter
out
=
new
StringWriter
();
t
.
process
(
parameter
,
out
);
return
out
.
getBuffer
().
toString
();
}
private
int
getExceptionSize
(
Map
<
String
,
List
<
AlarmMessage
>>
warningMap
)
{
if
(
warningMap
.
containsKey
(
TYPE_OF_EXCEPTION_WARNING
))
{
return
warningMap
.
get
(
TYPE_OF_EXCEPTION_WARNING
).
size
();
}
return
0
;
}
private
int
getWarningSize
(
Map
<
String
,
List
<
AlarmMessage
>>
warningMap
)
{
int
result
=
0
;
for
(
Entry
<
String
,
List
<
AlarmMessage
>>
entry
:
warningMap
.
entrySet
())
{
if
(
entry
.
getValue
()
!=
null
)
{
result
+=
entry
.
getValue
().
size
();
}
}
return
result
;
}
}
skywalking-alarm/src/main/resources/mail-template.ftl
浏览文件 @
acdfd823
...
...
@@ -24,7 +24,6 @@
color
:
#c75f3e
;
}
.greetings
{
background
:
#f9f9f9
;
font-family
:
Microsoft
YaHei
,
SimHei
,
Arial
;
}
...
...
@@ -33,7 +32,6 @@
padding
:
0
;
}
#mainDiv
{
background
:
#f9f9f9
;
padding
:
25px
;
font-size
:
14px
;
line-height
:
25px
;
...
...
@@ -92,7 +90,7 @@
<div
id=
"mainDiv"
>
<p
class=
"greetings"
>
Dear ${name!}:
</p>
<p
class=
"greetings"
>
&
nbsp
&
nbsp
&
nbsp
&
nbspOur platform
received
alarm infomation between
<b>
${startDate!}
</b>
to
<b>
${endDate!}
</b>
as follows:
<p
class=
"greetings"
>
&
nbsp
&
nbsp
&
nbsp
&
nbspOur platform
collects
alarm infomation between
<b>
${startDate!}
</b>
to
<b>
${endDate!}
</b>
as follows:
</p>
<table
id=
"dataTable"
width=
"80%"
>
<tr
id=
"dataTableHead"
>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录