Ambari自定义服务开发-监控指标Metrics介绍
[toc]
在Ambari WebUi中我们可以看到METRICS中有很多监控图表,本章节对如何配置METRICS监控图标进行介绍。
# AMS(Ambari Metrics Service)数据保存文职
登录AMS
服务所在服务器
查看ams使用的hbase的配置文件,ams-hbase和我们安装的hbase服务不是一个Hbase服务
$ ps -ef|grep ams-hbase
ams 37629 1 0 Feb28 ? 00:00:00 bash /usr/lib/ams-hbase/bin/hbase-daemon.sh --config /etc/ams-hbase/conf foreground_start master
2
执行命令hbase --config /etc/ams-hbase/conf shell
可以看到监控用到的表
$ hbase --config /etc/ams-hbase/conf shell
hbase(main):001:0> list
TABLE
CONTAINER_METRICS
HOSTED_APPS_METADATA_UUID
INSTANCE_HOST_METADATA
METRICS_METADATA_UUID
METRIC_AGGREGATE_DAILY_UUID
METRIC_AGGREGATE_HOURLY_UUID
2
3
4
5
6
7
8
9
# 配置metainfo.xml
在metainfo.xml文件内的<componment>
中添加<timelineAppid>
标签
<!--存储 metric 数据的默认类型-->
<timelineAppid>doris</timelineAppid>
2
这里需要注意字段 timelineAppId,该值是唯一的,一般用 Service Name 即可,并且不区分大小写。Metrics Collector 中的 Timeline Server 会通过 timelineAppid 区分各个服务的 Metrics 信息。
Metrics Collector:用于接收Metric信息的Controller
# 仪表盘配置-widgets.json
{
"layouts": [
{
"layout_name": "default_xxx_dashboard",
"display_name": "Standard xxx Dashboard",
"section_name": "xxx_SUMMARY",
"widgetLayoutInfo": [
# 具体仪表盘配置信息
]
}
]
}
2
3
4
5
6
7
8
9
10
11
12
参数说明:
layout_name : 布局的唯一标识符,用于在Ambari中区分不同的布局。xxx替换成自己的服务名小写。
section_name : xxx 替换成自己的服务名大写就行,其他不用改。
display_name : xxx 替换成自己的服务名就行,其他不用改。
# 四种METRICS监控图表类型介绍
# GRAPH图
上图对应的配置文件,下面内容是在layouts.widgetLayoutInfo
下的
{
"widget_name": "NameNode GC count",
"description": "Count of total garbage collections and count of major type garbage collections of the JVM.",
"widget_type": "GRAPH",
"is_visible": true,
"metrics": [
{
"name": "jvm.JvmMetrics.GcCount._rate", // 数据推送到collector的实际名称。
"metric_path": "metrics/jvm/gcCount._rate", // 这个路径和metrics.json文件的metricKey要保持一致(去掉._rate的部分)
"service_name": "HDFS", // 服务名
"component_name": "NAMENODE", // 组件名
"host_component_criteria": "host_components/metrics/dfs/FSNamesystem/HAState=active" // 可选参数,该值为主机指标,不加这个参数的话,就是服务指标
},
{
// 多个值,代表在图中的多条线
"name": "jvm.JvmMetrics.GcCountConcurrentMarkSweep._rate",
"metric_path": "metrics/jvm/GcCountConcurrentMarkSweep._rate",
"service_name": "HDFS",
"component_name": "NAMENODE",
"host_component_criteria": "host_components/metrics/dfs/FSNamesystem/HAState=active"
}
],
"values": [
{
"name": "GC total count", // 该字段仅用于“GRAPH图形”窗口小部件类型。作为放大图例中的标签名称。
"value": "${jvm.JvmMetrics.GcCount._rate}" // 这是用来计算数据集值的表达式。表达式包含对声明的度量名称和作为有效操作数的常量的引用。表达式还包含一组有效的运算符{+、-、*、/},可以与有效的操作数一起使用。表达式中也允许使用括号。
},
{
"name": "GC count of type major collection",
"value": "${jvm.JvmMetrics.GcCountConcurrentMarkSweep._rate}"
}
],
"properties": { // 包含显示单位、阈值标识等等
"graph_type": "LINE",
//"display_unit": "ms", 在途中显示的数据单位,常用的有 ms,% 等
"time_range": "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
# GAUGE百分比
上图对应的配置文件,下面内容是在layouts.widgetLayoutInfo
下的
{
"widget_name": "heap使用内存的百分比", // 仪表盘显示的名称
"description": "heap使用内存的百分比,当值达到75%的时候开始GC", //详细描述,在添加仪表盘中可以看到
"widget_type": "GAUGE", //显示指标的类型
"is_visible": true, //是否可见,一般都为true
"metrics": [
{
"name": "heap.used.memory", // 数据推送到collector的实际名称。
"metric_path": "metrics/heap/used/memory", //这个路径和metrics.json文件的metricKey要保持一致
"service_name": "DORIS", // 服务名称
"component_name": "FRONTEND" // 组件名称
},
{
"name": "heap.max.memory",
"metric_path": "metrics/heap/max/memory",
"service_name": "DORIS",
"component_name": "FRONTEND"
}
],
"values": [
{
"name": "heap used memory",
"value": "${heap.used.memory/heap.max.memory}" // 图标显示的结果,取heap.used.memory/heap.max.memory的值
}
],
"properties": {
"error_threshold": "0.9", // 告警百分比,当达到该大小则字体显示红色
"warning_threshold": "0.75" // 告警百分比,当达到该大小则字体显示黄色
}
}
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
# Number数字
上图对应的配置文件,下面内容是在layouts.widgetLayoutInfo
下的
{
"widget_name": "Under Replicated Blocks", // 仪表盘显示的名称
"description": "Number represents file blocks that does not meet the replication factor criteria. Its indicative of HDFS bad health.",//详细描述,当类型为GRAPH时才会显示,其他类型就当做备注
"widget_type": "NUMBER", //显示指标的类型
"is_visible": true, //是否可见,一般都为true
"metrics": [
{
"name": "Hadoop:service=NameNode,name=FSNamesystem.UnderReplicatedBlocks", // 数据推送到collector的实际名称。
"metric_path": "metrics/dfs/FSNamesystem/UnderReplicatedBlocks",//这个路径和metrics.json文件的metricKey要保持一致
"service_name": "HDFS", // 服务名称
"component_name": "NAMENODE",// 组件名称
"host_component_criteria": "host_components/metrics/dfs/FSNamesystem/HAState=active"
}
],
"values": [
{
"name": "Under Replicated Blocks",
"value": "${Hadoop:service=NameNode,name=FSNamesystem.UnderReplicatedBlocks}" // 图标显示的结果
}
],
"properties": {
"warning_threshold": "0", //告警值
"error_threshold": "50" //告警值
//"display_unit": "ms", 在途中显示的数据单位,常用的有 ms,min,d 等
}
}
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
# Template自定义显示内容
上图对应的配置文件,下面内容是在layouts.widgetLayoutInfo
下的
{
"widget_name": "Elasticsearch集群节点的存活占比",// 仪表盘显示的名称
"description": "Elasticsearch集群节点的存活占比,存活个数/总个数",//详细描述,当类型为GRAPH时才会显示,其他类型就当做备注
"widget_type": "TEMPLATE",//显示指标的类型
"is_visible": true,//是否可见,一般都为true
"metrics": [
{
"name": "nodes.number._max", // 数据推送到collector的实际名称。
"metric_path": "metrics/nodes/number._max",// 这个路径和metrics.json文件的metricKey要保持一致(去掉.max的部分)
"service_name": "ELASTICSEARCH", // 服务名称
"component_name": "ELASTICSEARCH_SERVICE"// 组件名称
},
{
"name": "total.nodes.number._max",
"metric_path": "metrics/total/nodes/number._max",
"service_name": "ELASTICSEARCH",
"component_name": "ELASTICSEARCH_SERVICE"
}
],
"values": [
{
"name": "the number of nodes",
"value": "${nodes.number._max} / ${total.nodes.number._max}" // 图标显示的结果
}
]
}
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
# 指标的聚合函数
聚合功能只与服务组件级度量相关,不支持主机组件级度量。
共支持四种聚合类型:
- max:所有主机组件的指标最大值
- min:所有主机组件中指标的最小值
- avg:所有主机组件的指标平均值
- sum:所有每个主机组件的度量值总和
组件部署在各节点上,每个节点都要向 metrics collector 发送自己的指标数据,然后展示的时候,就会根据各主机的指标值聚合展示。
# metrics.json
{
"<服务组件名称>": {
"Component": [
{
"type": "ganglia", // ganglia是负责收集指标数据的
"metrics": {
"default": {
"<metricKey>": { // 这里的metricKey值为widgets.json里面的metrics[i].metric_path的值。去掉._max、._min之类的聚合标识
"metric": "<metricName>", // 这里的metricName值为widgets.json里面的metrics[i].name的值。去掉._max、._min之类的聚合标识
"pointInTime": true, // 表示该 Metric 属性是否允许时间段的查询,如果为 false 则代表不允许,这样就会只取最后一次的值。参数通常用来表示一个指标是否应该被视为一个瞬时值,即在某一特定时刻的值。当设置为true时,它意味着该指标代表的是某一时刻的数据点,比如某一时刻的CPU使用率或内存使用量。这种类型的指标不是基于时间范围的聚合,而是某一具体时刻的快照。
"temporal": true // 代表是否支持时间段的查询请求,这里一般都是 true。用来指明一个指标是否随时间变化而变化,即是否应该跟踪和展示这个指标随时间的变化趋势。当设置为true时,它表示这个指标是随时间变化的,适合用来跟踪和展示一段时间内的趋势,如CPU或内存的使用趋势。
},
...
}
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 监控指标发布
widgets.json
和metrics.json
需要放在DORIS/
根目录下,然后重启ambari-server
服务,重新安装DORIS
服务即可。
# 监控指标数据发送至Ambari Metrics
监控的信息Ambari都是通过Ambari Metrics
服务进行接收的
使用curl命令进行测试数据发送
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.fe.mem",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285930994,
"starttime": 1709285930994,
"metrics": {
"1709285399240": 100
}
},{
"metricname": "doris.fe.cpu",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285930994,
"starttime": 1709285930994,
"metrics": {
"1709279932606": 100
}
}
]
}
'
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.fe.cpu",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709279598483,
"starttime": 1709279598483,
"metrics": {
"1709279598483": 30
}
}
]
}
'
# 百分比测试数据
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.used.memory",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285093016": 90
}
},{
"metricname": "doris.max.memory",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285907921": 90
}
}
]
}
'
# 添加文档
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.data.count",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 170928590792,
"starttime": 170928590792,
"metrics": {
"1709285093016": 88
}
}
]
}
'
# 自定义数据发送
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.total.nodes.number",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285093016": 8
}
},{
"metricname": "doris.nodes.number",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285907921": 7
}
}
]
}
'
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
数据发送成功返回结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><response/>
# 配置参数使用样例
上面描述的各监控仪表盘的Demo样例总结(完整版)
# widgets.json
{
"layouts": [
{
"layout_name": "default_doris_dashboard",
"display_name": "Standard Doris Dashboard",
"section_name": "DORIS_SUMMARY",
"widgetLayoutInfo": [
{
"widget_name": "Doris 内存使用",
"description": "Doris 内存使用",
"widget_type": "GRAPH",
"is_visible": true,
"metrics": [
{
"name": "doris.fe.mem",
"metric_path": "metrics/doris/fe/mem",
"service_name": "DORIS",
"component_name": "FRONTEND"
},
{
"name": "doris.fe.cpu",
"metric_path": "metrics/doris/fe/cpu",
"service_name": "DORIS",
"component_name": "FRONTEND"
}
],
"values": [
{
"name": "FE 使用内存",
"value": "${doris.fe.mem}"
},
{
"name": "FE 使用CPU",
"value": "${doris.fe.cpu}"
}
],
"properties": {
"graph_type": "LINE",
"display_unit": "%",
"time_range": "1"
}
},
{
"widget_name": "当前Doris使用内存的百分比",
"description": "记录当前Doris使用内存的百分比",
"widget_type": "GAUGE",
"is_visible": true,
"metrics": [
{
"name": "doris.used.memory",
"metric_path": "metrics/doris/used/memory",
"service_name": "DORIS",
"component_name": "FRONTEND"
},
{
"name": "doris.max.memory",
"metric_path": "metrics/doris/max/memory",
"service_name": "DORIS",
"component_name": "FRONTEND"
}
],
"values": [
{
"name": "内存使用百分比",
"value": "${doris.used.memory/doris.max.memory}"
}
],
"properties": {
"error_threshold": "0.9",
"warning_threshold": "0.75"
}
},
{
"widget_name": "文档数量",
"description": "表中所有文档数量",
"widget_type": "NUMBER",
"is_visible": true,
"metrics": [
{
"name": "doris.data.count",
"metric_path": "metrics/doris/data/count",
"service_name": "DORIS",
"component_name": "FRONTEND"
}
],
"values": [
{
"name": "文档数量",
"value": "${doris.data.count}"
}
],
"properties": {
"warning_threshold": "50000",
"error_threshold": "100000",
"display_unit": "条"
}
},{
"widget_name": "Doris集群节点的存活占比",
"description": "Doris集群节点的存活占比,存活个数/总个数",
"widget_type": "TEMPLATE",
"is_visible": true,
"metrics": [
{
"name": "doris.nodes.number._max",
"metric_path": "metrics/doris/nodes/number._max",
"service_name": "DORIS",
"component_name": "FRONTEND"
},
{
"name": "doris.total.nodes.number._max",
"metric_path": "metrics/doris/total/nodes/number._max",
"service_name": "DORIS",
"component_name": "FRONTEND"
}
],
"values": [
{
"name": "节点存活信息",
"value": "${doris.nodes.number._max} / ${doris.total.nodes.number._max}"
}
]
}
]
}
]
}
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# metrics.json
{
"FRONTEND": {
"Component": [
{
"type": "ganglia",
"metrics": {
"default": {
"metrics/doris/fe/mem": {
"metric": "doris.fe.mem",
"pointInTime": true,
"temporal": true
},
"metrics/doris/fe/cpu": {
"metric": "doris.fe.cpu",
"pointInTime": true,
"temporal": true
},
"metrics/doris/used/memory": {
"metric": "doris.used.memory",
"pointInTime": true,
"temporal": true
},
"metrics/doris/max/memory": {
"metric": "doris.max.memory",
"pointInTime": true,
"temporal": true
},
"metrics/doris/data/count": {
"metric": "doris.data.count",
"pointInTime": true,
"temporal": true
},
"metrics/doris/nodes/number": {
"metric": "doris.nodes.number",
"pointInTime": true,
"temporal": true
},
"metrics/doris/total/nodes/number": {
"metric": "doris.total.nodes.number",
"pointInTime": true,
"temporal": true
}
}
}
}
]
}
}
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
# 测试模拟发送数据到Metrics
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.fe.mem",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285930994,
"starttime": 1709285930994,
"metrics": {
"1709285399240": 100
}
},{
"metricname": "doris.fe.cpu",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285930994,
"starttime": 1709285930994,
"metrics": {
"1709279932606": 100
}
}
]
}
'
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.fe.cpu",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709279598483,
"starttime": 1709279598483,
"metrics": {
"1709279598483": 30
}
}
]
}
'
# 百分比测试数据
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.used.memory",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285093016": 90
}
},{
"metricname": "doris.max.memory",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285907921": 90
}
}
]
}
'
# 添加文档
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.data.count",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 170928590792,
"starttime": 170928590792,
"metrics": {
"1709285093016": 88
}
}
]
}
'
# 自定义数据发送
curl -X POST http://bigdata-03:6188/ws/v1/timeline/metrics -H "Content-Type: application/json" -d '
{
"metrics": [
{
"metricname": "doris.total.nodes.number",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285093016": 8
}
},{
"metricname": "doris.nodes.number",
"appid": "doris",
"hostname": "bigdata-01",
"timestamp": 1709285907921,
"starttime": 1709285907921,
"metrics": {
"1709285907921": 7
}
}
]
}
'
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# 问题解决
# 每次更新重启安装服务,仪表盘之前的配置都会保留
调试过程中重新安装服务后,之前的都会保留
解决方法:
在仪表盘中直接点击delete
tip:删除前需要将仪表盘取消添加,不能展示在UI监控中
# 日志如何查看
我们可以查看 Metrics Collector 和 Ambari Server 的相关日志。
成功部署之前,可以看 Ambari Server 的日志,默认在 /var/log/ambari-server/ambari-server.log 。
成功部署之后,如果指标不显示,则可以查看 Metrics Collector 的日志,默认在 /var/log/ambari-metrics-collector/ambari-metrics-collector.log ,注意确定好服务在哪一个主机上。