Ambari自定义服务开发-自定义告警
[toc]
在AmbariWebUI中我们经常看到各种告警,如:
当然也有正常的提示
这种信息主要是为了提示用户当前集群或者服务的一个状态,方便使用者随时发现集群问题。
那么我们如何自己去设置一个告警呢?
对于告警来说,主要有两个概念,一个是 Alert Definition,一个是 Alert Instance。
Alert Definition: 告警的定义,Server使用Alert Definition来将alert分配到合适的Ambari Agent中并创建Alert instance。在Alert Definition中会定义alert的检测时间间隔(interval)、类型(type)、以及阈值(threshold)等。
Alert Instance:Ambari 会读取alert definition,然后创建对应的实例(instance)去定期执行这个告警。
# 告警结果类型
Alert 的检查结果会以五种级别呈现,分别是 OK、WARNING,CRITICAL、UNKNOW 和 NONE。其中最常见的是前三种。
# 告警任务类型
类型 | 用途 | 阈值是否可配 | 阈值单位 |
---|---|---|---|
PORT | 用来监测机器上的一个端口是否可用 | 是 | 秒 |
METRIC | 用来监测Metric相关的配置属性 | 是 | % |
AGGREGATE | 用于收集其他某些Alert的状态 | 是 | % |
WEB | 用于监测一个WebUI(URL)地址是否可用 | 否 | 无 |
SCRIPT | Alert的检测逻辑由一个自定义的python脚本执行 | 否 | 无 |
# 配置告警文件
每个服务的告警配置都是通过alerts.json
文件定义,可以配置当前服务下的多个组件告警信息。
可以参考官方的配置文件/var/lib/ambari-server/resources/common-services/AMBARI_METRICS/0.1.0/alerts.json
# 配置介绍
告警的配置文件为根目录的alerts.json
,如下图所示:
这里拿PORT类型的举例,直接看下面PORT类型介绍就可以
# 端口检测报警-PORT
{
"DORIS": { # 对应 metainfo.xml 中的 service.name 值
"service": [],
"FRONTEND": [ # 对应 metainfo.xml 中的 component.name 值
{
"name": "doris_fe_server_process",
"label": "Doris FE 中文测试",
"description": "Doris FE 中文中文",
"interval": 1,
"scope": "ANY",
"enabled": true,
"source": {
"type": "PORT",
"uri": "{ {fe/http_port}}", # 获取fe.xml配置文件下的http_port参数,ip是获取安装FRONTEND组件所在的服务器IP
"default_port": 8030,
"reporting": {
"ok": { # 当连接正常时的信息。
"text": "TCP OK - {0:.3f}s response on port {1}"
},
"warning": # 当连接响应时间超过 1.5 秒时的警告信息。
"text": "TCP OK - {0:.3f}s response on port {1}",
"value": 1.5
},
"critical": { # 当连接失败或响应时间超过 5 秒时的严重告警信息。
"text": "Connection failed",
"value": 5
}
}
}
}
]
}
}
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
参数说明(FRONTEND组件下的参数说明):
参数 | 说明 | 对应表alert_definition字段 |
---|---|---|
name | 告警唯一ID | definition_name |
label | 在WebUI中显示告警名称 | label |
description | 在WebUI中显示告警描述 | description |
interval | 告警检测周期,单位为分钟 | schedule_interval |
scope | 告警范围。取值范围:SERVICE、HOST、ANY。 | scope |
enabled | 是否启用告警。 | enabled(1:true,0:false) |
source | 告警具体配置 | 作为json存储在alert_source字段 |
- type | 告警类型,取值范围:PORT/WEB/METRIC/AGGREGATE/SCRIPT | source_type |
- uri | 定义参数,这里需要填变量。如:{ {fe/http_port}} 代表获取fe.xml 配置文件下的http_port 参数 | 作为json存储在alert_source字段 |
- default_port | 监测告警的默认端口号。如果 uri 参数失效,就会读取该参数。 | 作为json存储在alert_source字段 |
- reporting | 代表告警级别,分别是 OK、WARNING,CRITICAL、UNKNOWN 和 NONE 。常用的主要为前三种。 text 表示告警级别的描述信息; value 的值为 数值类型 ,单位为 秒。代表超过该阈值,则呈现不同的告警级别。 | 作为json存储在alert_source字段 |
tip:当enabled设置为false,在页面中看到的告警状态为NONE
重新将文件同步到服务器中,然后重启ambari-server服务,卸载我们自定义开发的服务,再次安装。
如果我们自定义监控的端口异常,会自动提示告警
# 网页检测报警-WEB
{
"DORIS": {
"service": [],
"FRONTEND": [
{
"name": "yarn_webui",
"label": "Web 告警测试",
"description": "Web 告警测试描述",
"interval": 1,
"scope": "ANY",
"enabled": true,
"source": {
"type": "WEB",
"uri": {
"http": "8088",// 可直接追加端口号,参数变量用{ {}}标识,当前发现只识别configuration目录下的xml文件内的属性。如果参数变量不符合语法,就会读取https。
"https": "8088",
"https_property": "http", // 当这里值是http时,就检测http链接;当这里值是https时,就检测的https链接。
"https_property_value": "https",
"connection_timeout": 5.0,
"default_port": 8088 // 默认端口。假如上面的http和https参数变量填的都报错,系统就会默认使用这个端口号,加上当前组件的主机名,构成一个web ui链接。
},
"reporting": {
"ok": {
"text": "TCP OK - {0:.3f}s response on port {1}"
},
"warning": {
"text": "TCP OK - {0:.3f}s response on port {1}",
"value": 1.5
},
"critical": {
"text": "Connection failed",
"value": 5
}
}
}
}
]
}
}
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
# 脚本检测报警-SCRIPT
tip:如果是修改 SCRIPT 类型的 py 文件,则只需要将修改后的 py 文件放置到 告警组件所在机器的 /var/lib/ambari-agent/cache/stacks/HDP/3.1/services/DORIS/package/alerts 目录下即可(以 DORIS 为例)。实时更新,不需要重启 ambari-server ,大概等待一分钟后,程序刷新。
{
"DORIS": {
"service": [],
"FRONTEND": [
{
"DORIS": {
"service": [],
"FRONTEND": [
{
"name": "doris_fe_pid_exists",
"label": "doris fe check process",
"description": "check doris fe process",
"interval": 1,
"scope": "ANY",
"source": {
"type": "SCRIPT",
"path": "HDP/3.1/services/DORIS/package/alerts/alert_pid_exists.py"
}
}
]
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
tip: 当脚本运行失败WebUI中告警状态会显示为UNKWN状态
在WebUI中
Response
会提示简单的异常提示,根据提示处理问题即可
alert_pid_exists.py
内容
#!/usr/bin/env python
# -*- coding: utf-8 -*--
from resource_management import *
import os
import socket
from resource_management.core.logger import Logger
def execute(configurations={}, parameters={}, host_name=None):
config = Script.get_config()
doris_pid_dir = config['configurations']['doris-env']['doris_pid_dir'].rstrip("/")
doris_pid_file = format("{doris_pid_dir}/doris-fe.pid")
result = os.path.exists(doris_pid_file)
if result:
result_code = 'OK'
es_head_process_running = True
else:
# OK、WARNING、CRITICAL、UNKNOWN、NONE
result_code = 'CRITICAL'
es_head_process_running = False
if host_name is None:
host_name = socket.getfqdn()
# 告警时显示的内容Response
alert_label = 'Doris FE is running on {0}' if es_head_process_running else 'Doris FE is NOT running on {0}'
alert_label = alert_label.format(host_name)
Logger.info("test check alert123456")
print('test check alert')
return ((result_code, [alert_label]))
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
# 自定义告警API
# 查看所有自定义告警
http://bigdata-01:8080/api/v1/clusters/hadoop_cluster/alert_definitions
# 新增自定义告警
tip:无需重启即生效
curl -u admin:admin -H "X-Requested-By: ambari" -X POST http://bigdata-01:8080/api/v1/clusters/hadoop_cluster/alert_definitions -d ' {"AlertDefinition":{"service_name":"DORIS","component_name":"FRONTEND","enabled":true,"interval":1,"label":"DorisFE服务进程","name":"doris_fe_server_process_chinese","description":"DorisFE服务进程如果不存在或端口未启用则进行报警。","scope":"ANY","source":{"type":"PORT","uri":"{ {fe/http_port}}","default_port":9200,"reporting":{"ok":{"text":"TCPOK-{0:.3f}sresponseonport{1}"},"warning":{"text":"TCPOK-{0:.3f}sresponseonport{1}","value":1.5},"critical":{"text":"Connectionfailed","value":5}}}}} '
# 参考
https://blog.csdn.net/youyou1543724847/article/details/78377400
https://cwiki.apache.org/confluence/display/AMBARI/Alerts