请求 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
LAB14 events=2001 rawPoints=2000 overflow=2 filteredPoints=2 routeSums=1001+1000

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 属性不受影响。

  1. 把 View 的保留集合改成 Set.of("route", "request.id"),重新断言过滤侧也有 2000 点和溢出点;不要只检查 warning。
  2. 将输入改为只保留十个不同 ID 并循环使用,先预测每路由有几个键,再断言无溢出及总值 2001;解释为什么 ID 重用本身并不意味着业务请求相同。

参考资料:固定 SHA 的 InstrumentSelectorBuilder、ViewBuilder、ViewRegistry、DefaultSynchronousMetricStorage、MetricStorage 和上游溢出测试(链接见正文);本地 examples/opentelemetry-java/evidence/14/RUN.md。

导航:13 记录与聚合 · 当前篇:14 View 与基数 · 15 Reader 与 Temporality。