使用AI异常检测技术实现业务故障分钟级定位及恢复
随着企业规模的增长,业务稳定性面临更多挑战,如何确保企业业务的稳定运行成为企业需要深思的问题。AppStage运维中心提供的AI异常检测技术,能够实现业务故障分钟级定位。通过运用AI异常检测的动静态算法监控业务指标,结合告警通知和业务报表功能,可以及时发现并处理故障,迅速恢复业务的稳定运行。
前提条件
- 已完成日志接入并创建导流任务,具体操作请参见步骤二:虚拟机日志接入和步骤三:创建导流任务。
- 已创建业务黄金指标,具体请参见步骤二:创建指标。
- 已纳管Linux主机,具体请参见纳管Linux主机。
步骤一:使用异常检测功能配置告警
使用快速配置功能完成不同级别告警的配置,下面以紧急告警为例,说明如何配置告警。完成紧急告警配置后,可以参考该操作完成严重告警、一般告警、提示告警的配置,需要修改任务名称、告警名、告警级别、固定阈值的上限和下限,其他配置不变。
- 严重告警:任务名称“request_sucratetest_major_alarm”、告警名“request_sucratetest_严重告警”、告警级别“major”、固定阈值-上限“1”、固定阈值-下限“0.93”。
- 一般告警:任务名称“request_sucratetest_minor_alarm”、告警名“request_sucratetest_一般告警”、告警级别“minor”、固定阈值-上限“1”、固定阈值-下限“0.95”。
- 提示告警:任务名称“request_sucratetest_notice_alarm”、告警名“request_sucratetest_提示告警”、告警级别“notice”、固定阈值-上限“1”、固定阈值-下限“0.97”。
- 登录AppStage运维中心。
- 在顶部导航栏选择服务。
- 单击
,选择“运维 > 监控服务(ServiceInsight)”。
- 在监控服务左侧导航栏选择 ,进入“异常检测”页面。
- 单击“快速配置”,进入任务基础信息快速配置页面。
- 配置任务参数,如图1所示,参数说明如表1所示。
表1 配置任务参数说明 参数
示例
说明
指标
演示指标测试 / 请求成功率测试
选择指标仓库的指标。
任务名称
request_sucratetest_critical_alarm
根据所选指标自动生成,可以自定义任务名称,只能包含字母、数字、下划线。
告警名
request_sucratetest_紧急告警
根据所选指标自动生成,可以自定义告警名。
异常检测生成的告警会展示在告警列表中,并展示告警名字段“AlertName”。
数据源类型
-
默认显示所选指标所属的数据源类型,不可修改。
告警级别
critical
设置告警级别,与告警模块级别相对应。
描述
-
输入任务描述。
维度列表
request_url
来自于指标的逻辑实体上的维度,选择异常检测需要对哪些维度做检测。
ALL维度列表
-
维度列表中,某个维度需要关注整体的趋势时,可以配置该维度,数据汇聚结果这个维度的值为“ALL”,其指标值为整体指标的总量或平均值。
例如,做接口请求量告警时,一共有三个接口,每个接口的请求量分别是100、200、300,配置了ALL维度后,会增加一个接口名为ALL的数据,其请求量为三个接口的请求量总和,也就是600。这里的请求量换成成功率、时延等指标时,ALL的取值即为所有接口的平均值。
维度过滤设置
-
只关注维度部分取值时,可以设置该参数对维度取值进行过滤。
指标类型
success_rate
指标的类型,针对指标的定义进行选择。
算法类型
固定阈值
选择异常检测算法,支持固定阈值和动态阈值。
- 固定阈值:简单设置上限或者下限值。一旦数据超过上限或是低于下限则发生异常。
- 动态阈值:通过训练历史数据,实现对数据特征的学习,构建数据的模型。并利用模型来预测数据的趋势走向。当实际值和预测值相差过大,认为异常。
上限
1
当算法类型选择固定阈值时,需要设置上限。
下限
0.9
当算法类型选择固定阈值时,需要设置下限。
预估维度数
1
当算法类型选择固定阈值时,可以预估维度数量。
- 配置完成后,单击“保存”,弹出任务状态窗口,如图2所示,按照异常检测任务模块生成一个完整的异常检测任务,自动创建训练数据表,并且参数均为默认参数。
- 任务执行完成后,关闭任务状态窗口,弹出基础配置页面,关闭该页面。
- 在任务列表,单击已创建的任务所在行“操作”列的“基础”。
单击“字段配置”,单击“获取动态值”,如图3所示,在“维度名-值筛选器”页面单击“保存”,动态获取维度值,获取完成后单击“确认”。
- 单击任务所在行“操作”列的“模型”。
- 在“算法配置”页签可以修改告警算法配置,如将“annomaly_in_mins”修改为1,将“annomaly_out_mins”修改为5,即当异常持续1分钟则上报告警,当相关指标恢复正常5分钟则退出告警,单击“确定”。
- 在“训练配置”页签,单击“立即训练”。
- 在“算法配置”页签,单击“当前模型”后的“刷新”,然后选择已生成的训练模型,单击“确定”。
- 在“Judge配置”页签,将“调度(固定间隔)”修改为1分钟,“汇聚时间提前”修改为3分钟,单击“启动任务”,单击“确认”。
单击“Judge历史”,生成Judge任务,等待Judge判断完成,状态变为“FINISH”表示Judge任务正常完成,然后单击“确定”。
- (可选)单击任务所在行“操作”列的“告警”,查看快速配置生成的告警任务。
已自动开启告警推送,如图4所示,将产生的告警数据推送至监控服务告警模块,按照配置的告警名称、告警级别生成告警数据。
步骤二:配置告警总览报表
- 在监控服务左侧导航栏选择“监控 > 报表开发”。
- 在业务报表编辑页面,单击左下角的“设置和帮助”,会显示“设置和帮助”菜单栏下的内容。
- 单击“新增页面”,如图5所示,页面参数说明如表2所示,参数配置完成后单击“确定”。
表2 新增页面参数说明 参数
示例
说明
类型
页面
选择“页面”类型,新增业务报表页面。
如需对页面进行分组,可以在此处新增分类。
名称
演示_告警总览
输入页面名称,长度在1~20个字符。
英文名称
show_alarm
输入页面英文名称,可以输入英文字符以及英文符,数字。
添加到分类
-
可以选择无分类,或者已新增的分类。
页面类型
告警总览页面
选择需要创建的页面类型。
- 瀑布流页面:最常用的页面类型,即常见的报表页面。
- 自由布局页面:支持创建自由布局页面。
- 页面跳转:日志检索常用类型,需要设置一个url地址。
- 轮播页面:轮播大屏,可以将已创建的页面进行轮播。需要设置轮播间隔,并在轮播页面选择已创建页面。
- Tab页页面:可以将已创建的页面以标签页进行呈现。在页面选择下单击“添加”,设置标签页名称并选择相关页面,多次添加完成标签页设置。
- 共享页面:支持添加其他服务已共享的页面。选择已共享的页面并输入url参数。
- mdrca页面:支持创建mdrca页面。
- 告警总览页面:支持将异常检测任务生成的告警数据进行大屏展示。
- 根因诊断页面:支持将根因诊断数据进行大屏展示。
- UEO页面:支持创建UEO页面。
- 自定义页面:支持自定义页面,可以选择对应的页面id。
- 华为云资源监控大盘:支持查看华为云已购买资源实例的数量、状态及费用。
- 单击“管理页面”,单击已新增页面“演示_告警总览”所在行“操作”列的“发布”。
发布后,可在“监控 > 业务报表”页面查看。
步骤三:配置告警值班人员
- 在监控服务左侧导航栏选择 ,进入语音值班配置页面。
- 单击“模板管理”,切换至“模板管理”页签,单击“新增模板”。
- 配置值班模板,如图6所示,模板参数说明如表3所示,配置完成后,单击“保存”。
表3 模板参数说明 参数
示例
说明
模板名称
演示_值班模板
自定义模板名称。
模板类型
按班次
- 按班次:班次配置指的是一天内(00:00 - 24:00)的配置。如果一天只有一个配置,则不需要对时间进行分片;如果一天内根据不同的时间段有不同的限制,则可以对一天(00:00 - 24:00)进行分片处理,分为几个时间段再进行配置。
- 按周:按周的模板是按天的进阶版,在按天的基础上,按照自然周的形式增加了对于周工作日的判断。和一天的配置一样,周配置的每个周工作日也可以根据时间片进行配置且比较灵活。
- 按月:按月的模板跟周类似,将配置的周期改为按自然月划分。
值班信息
- 00:00 Hrs~24:00 Hrs
- 责任人:根据实际情况配置责任人
- 处理方式:立即通知
- 开始时间、结束时间:设置具体值班时间。
- 第一责任人、第二责任人、扩展人员:设置值班时间段告警的值班责任人。
- 处理方式:选择处理方式。选择立即通知时,会根据语音值班配置开启的通知方式,立刻触发通知流程,进行通知。选择不通知时,语音值班配置开启了语音呼叫时,选择该方式将不会进行语音呼叫,短信和welink正常通知。
- 单击“值班管理”,切换至“值班管理”页签,单击“新增配置”。
- 配置语音值班参数,参数说明如表4所示,配置完成后,单击“保存”。
当出现紧急告警或严重告警时,所选模板中设置的责任人会收到语音呼叫、短信和welink通知告警信息。
表4 语音值班配置参数说明 参数
示例
说明
自有服务
与顶部导航栏选择的服务一致
选择数据所在服务名称。
reminder通知
开启
告警未处理会触发reminder通知,短信、welink、邮箱会重复通知一次。
开启reminder通知后,致命级别告警1个小时未处理会重新通知一次,严重级别告警2个小时未处理会重新通知一次。
短信通知
开启
选择是否开启短信通知。
开启短信通知后,当产生告警时,所选模板中设置的第一责任人、第二责任人和前两个扩展人员会收到短信。
短信规则:短信最多显示134个字,当内容超过134个字时,剩余内容会被省略,短信规则根据告警来源不同,拼接规则不同,具体如下:
- appstage内部上报:【华为云应用平台】服务名|告警级别|发生时间|指标名称|details。例如【华为云应用平台】MessageSMS |notice|2024-04-01 10:35:00|30S及时率_分运营商_10分钟_动态_GZ|details。
- 云监控服务CES上报:【华为云应用平台】服务名|告警级别|告警时间|命名空间|资源名称|指标名称|当前值(阈值)|Region。例如 【华为云应用平台】WebCommunityService|重要|2024/04/01 09:49:46|ECS|openlab_MasterNode02|CPU使用率|99.35 %(阈值80 %)|华北-乌兰察布一。
- 应用运维服务AOM上报(上报的告警体须为json格式):【华为云应用平台】服务名|告警级别|告警时间|集群名称|指标名称|依据的告警规则|当前值(阈值)。例如【华为云应用平台】Service|重要|2024/08/28 10:23:34|cce-wiseeyetest-bj4-turbo-opsagent-001|diskUsedRate|异常告警|10.02(阈值:5)。
welink通知
开启
配置对接华为云WeLink后会显示该参数,可以选择是否开启welink通知。
开启welink通知后,当产生告警时,所选模板中设置的第一责任人、第二责任人和扩展人员(已配置WeLink属性)会收到welink通知。
邮箱通知
开启
选择是否开启邮箱通知。
开启邮箱通知时,请确保所选模板内的所有人员已配置邮箱信息,如未配置,请联系组织管理员添加邮箱信息。
责任人
根据实际情况选择责任人
选择告警责任人。
级别
严重&紧急
选择需要通知的告警级别。
语音呼叫
开启
选择是否开启语音呼叫。
开启后会按照所选模板配置的处理方式确定是否进行呼叫。
语音呼叫规则如下:
- 语音呼叫会依次呼叫第一责任人、第二责任人、告警责任人(所选的责任人),每个责任人最多呼叫3次,每次间隔2分钟,如均未接听,则不会再次呼叫。
- 如果告警责任人与第一责任人相同,呼叫至告警责任人时会拨打一次,其他重复场景时会跳过下一个责任人。
关键字
-
默认关键字为“/”,表示匹配所有的告警。
增加模板匹配时,可以单击关键字后的“编辑”,匹配消息、主机名、主机IP、serviceId等告警关键字。
模板
演示_值班模板
选择模板,可选模板范围为当前服务所在产品下的所有模板。
步骤四:插入异常数据触发告警推送
- 在监控服务左侧导航栏选择 。
- 在 “业务工具”页面,单击“新建工具”。
- 配置工具参数,参数说明如表5所示,配置完成后,单击“保存”。
表5 新建工具参数说明 参数
示例
说明
工具名称
show_log_generate_user
自定义工具名称,最大长度为128,可包含中文、字母、数字、下划线“_”、中划线“-”和中文括号()。
工具描述
-
输入工具描述,最大长度为512。
工具参数
-
输入工具参数,不能包含><`&$;#。
脚本类型
shell
选择脚本类型,目前支持shell和python。
脚本内容
#!/bin/bash # 可在脚本执行成功时调用,输出成功信号 function success() { echo "###Atom.result.success####end" echo "###end" } function serach() { echo "###Atom.result.success####end" echo "###已查询到文件" } # 可在脚本执行失败时调用,输出失败信号 function failure() { echo "###Atom.result.failure####end" echo "###end" } # 可在脚本需要"导出结果"时调用。多个导出结果用\n隔开 # 如果想输出多行消息可以多次调用该函数,或者加入换行符。 例如, output "aaaaa\nbbbbb\nccccc\nddddd" # 注意:1.如果通过调用接口的方式创建作业,脚本只能通过调用output函数才可以在output字段中获取脚本输出 # 注意:2.页面上"导出结果"按钮导出的仅仅是output输出的消息 function output() { echo "###Atom.output####end" echo -e "$*" echo "###end" } function log_generate() { echo "####日志构造开始####end" # 获取当前时间 count=0 #记录循环次数 max_count=120 #最大执行次数 while [ $count -lt $max_count ]; do random_number=$(( $RANDOM % 100 )) # 设置日志级别 if [ $random_number -lt 70 ]; then log_type="INFO" elif [ $random_number -lt 90 ]; then log_type="DEBUG" else log_type="ERROR" fi # 设置LogRecordPostFilter log_messages=("(InterfaceTsak.java:26)" "(InterfaceTsak.java:92)" "(InterfaceTsak.java:78)" "(InterfaceTsak.java:44)") log_message=${log_messages[$RANDOM % ${#log_messages[@]}]} request_services=("WiseEyePOCMicroServiceA01Userget" "WiseEyePOCMicroServiceA01Userpost") request_service=${request_services[$RANDOM % ${#request_services[@]}]} request_services="WiseEyePOCMicroServiceA01User" #设置接口url request_get_urls=("http://orgidLogin.huawei.com/user" "http://orgidLogin.huawei.com/user/list" "http://orgidLogin.huawei.com/user/88" "http://orgidLogin.huawei.com/user/66" "http://orgidLogin.huawei.com/user/102") request_post_urls=("http://orgidLogin.huawei.com/user/add" "http://orgidLogin.huawei.com/user/33") if [ $request_service == "WiseEyePOCMicroServiceA01Userget" ]; then request_url=${request_get_urls[$RANDOM % ${#request_get_urls[@]}]} request_type="GET" else request_url=${request_post_urls[$RANDOM % ${#request_post_urls[@]}]} request_type="POST" fi #设置接口错误码 request_status_fail=("500" "302" "401" "402" "403") if [ $log_type == "ERROR" ]; then request_status=${request_status_fail[$RANDOM % ${#request_status_fail[@]}]} else request_status="200" fi # 获取当前时间 timestamp=$(date +"%Y-%m-%d %H:%M:%S.%3N") # 写入日志数据 echo "$timestamp|$log_type|$log_message|Request $request_services|$request_type|$request_url|$(( $RANDOM % 201 ))|$request_status" >> /opt/wiseeye/test/appstageshow.log # 插入主机异常日志 #log_entry="2025-04-05 14:31:19.403|INFO|(LogRecordPostFilter.java:48)|Request APSTarzanApsMeetingUser|GET|http://orgidLogin.huawei.com/user/list|390|404" let count=$count+1 #间隔多久触发一次 #sleep_time=$(( $RANDOM % 8 + 3 )) #sleep $sleep_time sleep 2 done echo "####日志构造完成####" } # 巡检作业专用输出函数,输出巡检结果。多个巡检结果用%隔开 # 示例:inspect_output "$item_name1%$item_name2%$item_name3".(请预先定义好变量) # 注意:巡检任务定义使用的脚本必须使用inspect_output函数 function inspect_output() { echo "###Atom.output####end" echo -e "inspect_output:$* end" echo "###end" } # 请在此处开始编写你的脚本内容。(如需要输出日志,直接echo "log_str"即可) # 注意:请务必确保最终调用success或者failure函数,否则系统无法捕获脚本输出信息 log_generate success
编辑脚本内容,可进入全屏模式编辑。
如果脚本中包含高危指令需要进行二次确认。
- shell类型高危指令:shutdown、reboot、rm 、/dev/sda、umount、poweroff、restart、 halt、 init、 undo。
- python类型高危指令:shutdown、reboot、rm 、/dev/sda、umount、poweroff、restart、 halt、 init、 undo、poweroff、remove、rmtree。
- 在 “业务工具”页面,单击已创建的工具所在行“操作”列的“执行”。
- 在“虚拟机执行”页签,选择需要执行的运维账号,然后单击“资源”后的“选择资源”,选择已纳管的Linux主机,其他参数不变,然后单击“执行”,开始使用虚拟机执行作业脚本,插入异常日志。
步骤五:查看告警总览报表并处理告警数据
当出现紧急告警或严重告警时,所选模板中设置的责任人会收到通知,收到通知后,可以在“告警 > 告警列表”页面查看并处理告警,也可以按照如下操作查看告警总览报表并处理告警。