TT Bigdata TT Bigdata
首页
GitHub (opens new window)
JaneTTR

JaneTTR

数据酿造智慧,每一滴都是沉淀!
  • Ambari 深度专题

  • Bigtop 方法论

  • 自定义集成

  • Ambari Server 与 Web

  • Ambari Metrics

    • 试读&介绍

    • Ambari-Metrics解读【简写AMS】

      • 源码下载及环境初始化
      • 项目目录及模块解读
      • AMS-Collector剖析

      • AMS-Collector表结构实战

      • AMS-Collector-元数据-接口实战

      • AMS-Collector-指标查询-接口实战

      • AMS-Collector-普通指标写入-接口实战

        • [/metrics] — 反向分析接口参数
        • [/metrics] — 普通指标写入方法
        • [/metrics] — 验证写入逻辑规则
        • [/metrics] — 数据写入代码整体逻辑
        • [/metrics] — 拦截非法指标写入
          • 一、为什么需要 acceptMetric?
          • 二、结论先行:acceptMetric 的设计原则
          • 三、源码全景解读
            • 逻辑拆解
          • 四、名单初始化:Collector 启动加载逻辑
          • 五、配置文件实战
            • 1. 应用名单
            • 2. 指标白名单
            • 3. 指标黑名单
            • 4. ams-hbase 特殊清单
          • 六、通配符机制
          • 七、运行时动态效果
        • [/metrics] — 指标数据入库
      • AMS-Collector-聚合指标写入-接口实战

  • Ambari Plus 思考

  • Redis集成实战

  • 通用代码模板

  • 各组件代码

  • 技术专题
  • Ambari Metrics
  • Ambari-Metrics解读【简写AMS】
  • AMS-Collector-普通指标写入-接口实战
JaneTTR
2025-09-17
目录
一、为什么需要 acceptMetric?
二、结论先行:acceptMetric 的设计原则
三、源码全景解读
逻辑拆解
四、名单初始化:Collector 启动加载逻辑
五、配置文件实战
1. 应用名单
2. 指标白名单
3. 指标黑名单
4. ams-hbase 特殊清单
六、通配符机制
七、运行时动态效果

[/metrics] — 拦截非法指标写入acceptMetric

# 一、为什么需要 acceptMetric?

在 Ambari-Metrics 的 Collector 中,数据写入 HBase 前必须经过 合法性校验。 这个校验的入口就是 acceptMetric 方法。

如果不加约束,Collector 会把 所有组件、所有主机、所有指标 都采集并存储。随着集群规模增长,这会导致:

  • HBase 表中产生大量无价值数据,存储成本上升;
  • Collector 写入压力骤增,影响整体监控性能;
  • Grafana 等前端 展示混乱,用户难以聚焦真正关心的指标。

于是,Ambari 提供了一个灵活机制:黑白名单过滤,让用户决定哪些指标值得上报。

核心思想

不是所有数据都值得存,通过 acceptMetric 过滤掉冗余指标,可以让 Collector 更轻、更快、更可控。

# 二、结论先行:acceptMetric 的设计原则

  • 黑名单优先级高:匹配黑名单即直接拦截。
  • 白名单控制更细:允许用户指定精确指标或通配符。
  • 特殊组件例外:ams-hbase 采用“只采集白名单”逻辑。
  • 默认宽松策略:若未配置名单,大多数指标允许通过。

这种设计确保了 Collector 在 默认开箱可用 与 高度可定制化 之间取得平衡。

# 三、源码全景解读

核心方法 acceptMetric 的代码如下:

public static boolean acceptMetric(TimelineMetric metric) {

  String appId = metric.getAppId();
  String metricName = metric.getMetricName();

  // 1. 应用黑名单
  if (CollectionUtils.isNotEmpty(blacklistedApps) && blacklistedApps.contains(appId)) {
    return false;
  }

  // 2. 指标黑名单(支持通配符)
  if (CollectionUtils.isNotEmpty(blacklistedMetrics) || CollectionUtils.isNotEmpty(blacklistedPatterns)) {
    if (blacklistedMetrics.contains(metricName)) {
      return false;
    }
    for (Pattern p : blacklistedPatterns) {
      Matcher m = p.matcher(metricName);
      if (m.find()) {
        blacklistedMetrics.add(metricName);
        return false;
      }
    }
  }

  // 3. ams-hbase 特殊白名单
  if ("ams-hbase".equals(appId) && CollectionUtils.isNotEmpty(amshbaseWhitelist)) {
    return amshbaseWhitelist.contains(metric.getMetricName());
  }

  // 4. 应用白名单
  if (CollectionUtils.isNotEmpty(whitelistedApps) && whitelistedApps.contains(appId)) {
    return true;
  }

  // 5. 指标白名单(若为空,则默认放行)
  if (CollectionUtils.isEmpty(whitelistedMetrics) && CollectionUtils.isEmpty(whitelistedMetricPatterns)) {
    return true;
  }

  if (whitelistedMetrics.contains(metricName)) {
    return true;
  }

  for (Pattern p : whitelistedMetricPatterns) {
    Matcher m = p.matcher(metricName);
    if (m.find()) {
      whitelistedMetrics.add(metricName);
      return true;
    }
  }

  return false;
}
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

# 逻辑拆解

  1. 应用黑名单 → 全拦截 避免某些应用全量噪音指标(如 MR Job 临时任务)。
  2. 指标黑名单 → 精确 / 模糊匹配 即使某应用通过了,也能按指标粒度再拦截。
  3. ams-hbase 白名单 → 仅采集定义指标 避免 HBase 自身暴露过多无意义指标。
  4. 应用白名单 → 快速放行 应用级控制更高效,不必逐个指标过滤。
  5. 指标白名单 → 精确 / 正则放行 常用于只关注某一类指标(如 cpu.*)。
  6. 缺省策略 → 宽松 没有白名单时,默认允许写入,保证 Collector 能跑起来。

运行机制

黑名单 → ams-hbase → 白名单 → 缺省策略 形成了一条优先级清晰的校验链。

# 四、名单初始化:Collector 启动加载逻辑

acceptMetric 的名单集合并不是运行时生成的,而是在 Collector 启动时,通过 initializeMetricFilter 方法完成初始化:

public static void initializeMetricFilter(TimelineMetricConfiguration configuration) {
  ...
  // 加载白名单
  if (configuration.isWhitelistingEnabled()) {
    String whitelistFile = metricsConf.get(
      TimelineMetricConfiguration.TIMELINE_METRICS_WHITELIST_FILE,
      TimelineMetricConfiguration.TIMELINE_METRICS_WHITELIST_FILE_LOCATION_DEFAULT);
    readMetricWhitelistFromFile(whitelistedMetrics, whitelistedMetricPatterns, whitelistFile);
  }

  // 加载黑名单
  String blacklistFile = metricsConf.get(TIMELINE_METRICS_BLACKLIST_FILE, "");
  if (!StringUtils.isEmpty(blacklistFile)) {
    readMetricWhitelistFromFile(blacklistedMetrics, blacklistedPatterns, blacklistFile);
  }

  // 应用级名单
  String appsBlacklist = metricsConf.get(TimelineMetricConfiguration.TIMELINE_METRICS_APPS_BLACKLIST, "");
  ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

image-20250918162441683

Collector 会从 ams-site.xml 中读取文件路径与应用名单,完成内存初始化。

# 五、配置文件实战

在 ams-site.xml 中,可以配置三类清单:

# 1. 应用名单


<property>
    <name>timeline.metrics.apps.whitelist</name>
    <value>HDFS,HBASE</value>
</property>

<property>
<name>timeline.metrics.apps.blacklist</name>
<value>SPARK,MAPREDUCE</value>
</property>
1
2
3
4
5
6
7
8
9
10

image-20250918162748036

# 2. 指标白名单


<property>
    <name>timeline.metrics.whitelist.file</name>
    <value>/etc/ambari-metrics-collector/conf/metrics_whitelist</value>
</property>
1
2
3
4
5

若未配置,默认路径为:

/etc/ambari-metrics-collector/conf/metrics_whitelist
1

# 3. 指标黑名单


<property>
    <name>timeline.metrics.blacklist.file</name>
    <value>/etc/ambari-metrics-collector/conf/metrics_blacklist</value>
</property>
1
2
3
4
5

黑名单没有默认值,必须显式配置。

# 4. ams-hbase 特殊清单

image-20250918163035724

配置路径:amshbase_metrics_whitelist 文件。 写法:每行一个指标名。

image-20250918163210707

代码对应:

if ("ams-hbase".equals(appId) && CollectionUtils.isNotEmpty(amshbaseWhitelist)) {
  return amshbaseWhitelist.contains(metric.getMetricName());
}
1
2
3

# 六、通配符机制

名单文件支持通配符,通过 ._p_ 前缀触发正则模式:

._p_kafka.log.Log.*
1

源码:

if (strLine.startsWith(patternPrefix)) {
  patternList.add(Pattern.compile(strLine.substring(patternPrefix.length())));
} else {
  metricList.add(strLine);
}
1
2
3
4
5

image-20250918165204983

image-20250918165008904

举例: 定义 ._p_kafka.log.Log.* 后,凡是匹配该正则的指标,都会动态补充到名单,并立即生效。

注意

通配符是 正则表达式,使用不当可能误拦截大量指标。 建议先在测试环境验证。

# 七、运行时动态效果

结合前文逻辑,当一个新指标进入 Collector 时:

  1. 先查应用黑名单 → 如果命中直接丢弃;
  2. 再查指标黑名单 → 若正则匹配上,立即加入黑名单缓存;
  3. ams-hbase 特例 → 只有白名单里的才能通过;
  4. 白名单判定 → 命中即放行,未配置白名单时默认全放行。

这个过程在高并发写入场景下执行非常快,因为:

  • 名单在内存中维护 HashSet / Pattern;
  • 正则匹配命中后,会 缓存结果,避免下次重复计算。
#Ambari-Metrics#源码解析#Ambari
[/metrics] — 数据写入代码整体逻辑
[/metrics] — 指标数据入库

← [/metrics] — 数据写入代码整体逻辑 [/metrics] — 指标数据入库→

最近更新
01
当前版本 2026/08
08-29
02
把 Ambari Server HA 稳稳地跑起来
08-17
03
从一次启用操作追到主备就绪
08-17
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式