[/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
2
3
4
5
6
7
8
9
10
11
12
13
这里的 transientMetricNames
就是容器:
凡是被识别为 临时指标 的 metricName,都会被塞进这个 list。
调用链如下图所示:
提示
也就是说:常规指标走 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
2
3
4
5
6
7
8
9
10
11
# 拆解逻辑
优先检查 uuid
- 如果在
METRICS_METADATA_UUID
中能找到,就走常规指标。 - 如果有 hostnames,还要拼接 hostUuid。
- 如果在
查不到 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
2
3
4
5
6
7
8
这里 list 初始为空,真正的“塞值点”一定在 getUuidsForGetMetricQuery
内部。
# 2、唯一塞值点
else if (isTransientMetric(matchedEntry.getMetricName(), matchedEntry.getAppId())) {
transientMetricNames.add(matchedEntry.getMetricName());
}
1
2
3
2
3
- 条件一:uuid 为空
- 条件二:
isTransientMetric(...)
返回 true - 结果:metricName 被 add 进
transientMetricNames
提示
这就是唯一的“塞值点”,它决定了哪些指标被认定为临时指标。
# 3、isTransientMetric 的数据来源
源码里 isTransientMetric
依赖一个 transientMetricPatterns
列表:
关键常量:
public static final String TRANSIENT_METRIC_PATTERNS =
"timeline.metrics.transient.metric.patterns";
1
2
2
这些模式在 Collector 启动时从配置文件中加载:
/etc/ambari-metrics-collector/conf/ams-site.xml
1
配置项截图如下:
# 4、模式值长什么样?
展开后,可以看到配置值是一长串以逗号分隔的字符串,最终解析为 transientMetricPatterns
列表:
典型示例:
topology.%,
dfs.NNTopUserOpCounts.windowMs=60000.op=__%.user=%,
dfs.NNTopUserOpCounts.windowMs=300000.op=__%.user=%,
dfs.NNTopUserOpCounts.windowMs=1500000.op=__%.user=%
1
2
3
4
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。
- 01
- [/metrics/aggregated] — 聚合数据范围 检查点09-19
- 02
- [/metrics] — 反向分析接口参数 请求抓包09-17
- 03
- [/metrics] — 普通指标写入方法 POST09-17