TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件专题

    • 安装教程
    • 魔改分享
  • 版本专题

    • 更新说明
    • BUG临时处理
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • APT仓库增量更新
    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Ambari-Metrics
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • Grafana监控方案

    • Ambari-Metrics插件
    • Infinity插件
  • 支持&共建

    • 蓝图愿景
    • 合作共建
登陆
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件专题

    • 安装教程
    • 魔改分享
  • 版本专题

    • 更新说明
    • BUG临时处理
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • APT仓库增量更新
    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Ambari-Metrics
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • Grafana监控方案

    • Ambari-Metrics插件
    • Infinity插件
  • 支持&共建

    • 蓝图愿景
    • 合作共建
登陆
GitHub (opens new window)
  • 试读&介绍

  • Ambari-Metrics解读【简写AMS】

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

    • AMS-Collector表结构实战

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

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

      • [/metrics] — 监控数据接口查询方法
      • [/metrics] — 请求参数概括及详解索引
      • [/metrics] — Service 代码整体逻辑概览
      • [/metrics] — metricNames 生命周期
      • [/metrics] — seriesAggregateFunc生命周期
      • [/metrics] — getUuidsForGetMetricQuery精讲
      • [/metrics] — applyTopNCondition精讲
      • [/metrics] — getAggregateMetricRecords精讲
      • [/metrics] — getMetricRecords精讲
      • [/metrics] — 临时指标精讲
        • 一、入口:HBaseTimelineMetricsService 的临时指标逻辑
        • 二、判定逻辑:uuid vs transient
          • 拆解逻辑
        • 三、精讲:从 transientMetricNames 的“塞值点”反向溯源
          • 1、起点:list 被 new 出来并传下去
          • 2、唯一塞值点
          • 3、isTransientMetric 的数据来源
          • 4、模式值长什么样?
        • 四、配置值解读与应用场景
          • 应用场景
          • 对比总结
    • AMS-Collector-普通指标写入-接口实战

    • AMS-Collector-聚合指标写入-接口实战

  • GOD-Ambari-Metrics
  • Ambari-Metrics解读【简写AMS】
  • AMS-Collector-指标查询-接口实战
JaneTTR
2025-09-16
目录

[/metrics] — 临时指标精讲transient指标

# 一、入口:HBaseTimelineMetricsService 的临时指标逻辑

临时指标并不是单独定义的接口,而是隐藏在 uuid 获取阶段。代码片段如下:

List<String> transientMetricNames = new ArrayList<>();

List<byte[]> uuids = metricMetadataManager.getUuidsForGetMetricQuery(
  metricFunctions.keySet(),
  hostnames,
  applicationId,
  instanceId,
  transientMetricNames);

if (uuids.isEmpty() && transientMetricNames.isEmpty()) {
  LOG.trace("No metrics satisfy the query: " + Arrays.asList(metricNames).toString());
  return metrics;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

这里的 transientMetricNames 就是容器: 凡是被识别为 临时指标 的 metricName,都会被塞进这个 list。

调用链如下图所示:

image-20250916195836033

提示

也就是说:常规指标走 uuid → HBase 查询;临时指标走 transientMetricNames → TransientMetricCondition。

# 二、判定逻辑:uuid vs transient

在 getUuidsForGetMetricQuery 内部,关键分支如下:

if (matchedEntry.getUuid() != null) {
  if (CollectionUtils.isNotEmpty(hostnames)) {
    for (byte[] hostUuidEntry : hostUuidsFromStore) {
      uuids.add(ArrayUtils.addAll(matchedEntry.getUuid(), hostUuidEntry));
    }
  } else {
    uuids.add(matchedEntry.getUuid());
  }
} else if (isTransientMetric(matchedEntry.getMetricName(), matchedEntry.getAppId())) {
  transientMetricNames.add(matchedEntry.getMetricName());
}
1
2
3
4
5
6
7
8
9
10
11

# 拆解逻辑

  1. 优先检查 uuid

    • 如果在 METRICS_METADATA_UUID 中能找到,就走常规指标。
    • 如果有 hostnames,还要拼接 hostUuid。
  2. 查不到 uuid,再判定临时指标

    • 调用 isTransientMetric(metricName, appId)。
    • 命中 → 把 metricName 塞进 transientMetricNames。
    • 未命中 → 直接丢弃。

警告

重点:查不到 uuid ≠ 临时指标。 必须满足配置规则才会进入临时指标集合。

# 三、精讲:从 transientMetricNames 的“塞值点”反向溯源

# 1、起点:list 被 new 出来并传下去

List<String> transientMetricNames = new ArrayList<>();

List<byte[]> uuids = metricMetadataManager.getUuidsForGetMetricQuery(
  metricFunctions.keySet(),
  hostnames,
  applicationId,
  instanceId,
  transientMetricNames); // ← 空 list 传入
1
2
3
4
5
6
7
8

这里 list 初始为空,真正的“塞值点”一定在 getUuidsForGetMetricQuery 内部。

# 2、唯一塞值点

else if (isTransientMetric(matchedEntry.getMetricName(), matchedEntry.getAppId())) {
  transientMetricNames.add(matchedEntry.getMetricName());
}
1
2
3
  • 条件一:uuid 为空
  • 条件二:isTransientMetric(...) 返回 true
  • 结果:metricName 被 add 进 transientMetricNames

提示

这就是唯一的“塞值点”,它决定了哪些指标被认定为临时指标。

# 3、isTransientMetric 的数据来源

源码里 isTransientMetric 依赖一个 transientMetricPatterns 列表:

image-20250916200819254

关键常量:

public static final String TRANSIENT_METRIC_PATTERNS =
  "timeline.metrics.transient.metric.patterns";
1
2

这些模式在 Collector 启动时从配置文件中加载:

/etc/ambari-metrics-collector/conf/ams-site.xml
1

配置项截图如下:

image-20250916200959672

# 4、模式值长什么样?

展开后,可以看到配置值是一长串以逗号分隔的字符串,最终解析为 transientMetricPatterns 列表:

image-20250916200819254

典型示例:

topology.%,
dfs.NNTopUserOpCounts.windowMs=60000.op=__%.user=%,
dfs.NNTopUserOpCounts.windowMs=300000.op=__%.user=%,
dfs.NNTopUserOpCounts.windowMs=1500000.op=__%.user=%
1
2
3
4
  • topology.%:所有以 topology. 开头的指标 → 临时指标。
  • NNTopUserOpCounts...:HDFS NameNode 用户操作 TopN 的统计,三种窗口(60s/300s/1500s)。

笔记

这些指标多为秒级、短周期展示,不需要长期落盘。 设计初衷就是避免 Collector 把瞬时数据全部写入 HBase,减少存储压力。

# 四、配置值解读与应用场景

通过 timeline.metrics.transient.metric.patterns 配置,可以精确控制哪些指标走临时表。

# 应用场景

  • YARN Topology:展示 DAG / Task 实时状态。
  • NNTopUserOpCounts:HDFS 用户操作 TopN 秒级刷新。
  • 临时调试指标:测试阶段生成的实验性 metric。

# 对比总结

类型 uuid 来源 存储表 特点
常规指标 METRICS_METADATA_UUID METRIC_RECORD / METRIC_AGGREGATE 可查历史,长期存储
临时指标 无 uuid + transientPatterns TransientMetricCondition / 临时表 秒级展示,不保留历史,减轻存储压力

提示

如果你在 UI 上能看到指标秒跳,但 REST 查询不到历史数据,很可能就是它被判定成了 Transient Metric。

#Ambari#Ambari-Metrics#TimelineService#TransientMetric#Controller#Condition
[/metrics] — getMetricRecords精讲
[/metrics] — 反向分析接口参数

← [/metrics] — getMetricRecords精讲 [/metrics] — 反向分析接口参数→

最近更新
01
[/metrics/aggregated] — 聚合数据范围 检查点
09-19
02
[/metrics] — 反向分析接口参数 请求抓包
09-17
03
[/metrics] — 普通指标写入方法 POST
09-17
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式