深入 OpenTelemetry 14:View 在聚合前改变哪些维度
请求 ID 应该进入指标点吗?
两条路由交替处理 2001 次请求:/orders 1001 次、/stock 1000 次。如果每次事件都附带唯一 request.id,不筛选时理论上出现 2001 个属性集合。路由有聚合意义,单次请求 ID 没有:它让每次写入都新建数据点,且超过 SDK 默认上限。View 可以在聚合前保留 route,去掉 ID;这和“导出时遮盖 ID”不是同一个步骤。
| 配置 | 进入存储的属性键 | 采集结果 |
|---|---|---|
| 默认 | route + request.id | 2000 点:1999 个独立键、1 个溢出键(值 2) |
| 匹配 View | route | 2 点:/orders=1001、/stock=1000 |
固定源码中的选择与上限
下面是对 SDK 完整 SHA c25c0a0ee0da01ab2f74ba83052d1c249ed57020 的源码与上游测试阅读。SdkMeterProviderBuilder.registerView 注册 selector 与 View;InstrumentSelectorBuilder.setName 接受名称匹配;ViewRegistry.findViews 匹配并检查聚合兼容性,匹配成功时并非无条件再附加一份默认 View。View.builder().setAttributeFilter(Set.of("route")) 的键筛选定义见 ViewBuilder;空集合并非“使用所有属性”。
DefaultSynchronousMetricStorage.getAggregatorHandle 在查询 handle 前先处理属性,因此丢弃 ID 会把 2001 次写入归并到两个 route 键。MetricStorage.DEFAULT_MAX_CARDINALITY 为 2000;此版本的同步存储在初始化时留出一个溢出槽,getAggregatorHandle 达阈值后写入特殊属性 otel.metric.overflow=true。超过上限会损失原始维度,而不是自动停止累加。上游 SynchronousMetricStorageTest 使用更小的上限断言这一溢出路径;不能由此推断所有版本都固定 2000。
固定输入的对照
Lab14Test 用两个独立 provider 重放完全一样的事件,一方没有 View,另一方给同名 Counter 注册属性过滤 View。每次写入只有 route 和 request.id 两个字符串属性;全部写入结束后分别采集。在 examples/opentelemetry-java/ 用完整 JDK 21 运行 JAVA_HOME=/tmp/otel-20260930/jdk-extract/usr/lib/jvm/java-21-openjdk-amd64 ./mvnw -q -pl sdk-labs -Dtest=Lab14Test test,退出码 0;stdout 原文:
1 | |
stderr 同时出现两次 has exceeded the maximum allowed cardinality (1999) 警告;完整运行摘录见 examples/opentelemetry-java/evidence/14/RUN.md。测试断言实际点数、溢出值、保留键和值,而非只看日志。这里的独立 provider 不是在同一个 provider 下注册两个 View;后者可能生成多条指标流,需要另行检查。
误解与练习
“有 2000 个点就是丢失了一个请求”不成立:最后两次写入合并在溢出点。反过来,溢出点值为 2 也无法找回两个 request ID。View 改变 SDK 内的聚合键;不能用它证明 Collector、后端索引或脱敏政策已经生效。属性过滤仅针对此匹配 instrument 与 View,其他 Span/Log 属性不受影响。
- 把 View 的保留集合改成
Set.of("route", "request.id"),重新断言过滤侧也有 2000 点和溢出点;不要只检查 warning。 - 将输入改为只保留十个不同 ID 并循环使用,先预测每路由有几个键,再断言无溢出及总值 2001;解释为什么 ID 重用本身并不意味着业务请求相同。
参考资料:固定 SHA 的 InstrumentSelectorBuilder、ViewBuilder、ViewRegistry、DefaultSynchronousMetricStorage、MetricStorage 和上游溢出测试(链接见正文);本地 examples/opentelemetry-java/evidence/14/RUN.md。
导航:13 记录与聚合 · 当前篇:14 View 与基数 · 15 Reader 与 Temporality。
