Micrometer Observation中low/highCardinalityKeyValue的实际应用场景问询
Micrometer Observation:低/高基数KeyValue的业务场景示例
下面是几个区分使用lowCardinalityKeyValue和highCardinalityKeyValue的真实业务场景,帮你明确两者的适用边界:
低基数KeyValue(lowCardinalityKeyValue)适用场景
这类标签的值数量有限且固定,既可以作为监控指标的维度,也能在链路追踪中做筛选使用,典型场景包括:
- 业务操作类型:比如电商系统的订单操作(创建、支付、取消)、商品操作(上架、下架)
- 环境/集群标识:生产/测试/开发环境、服务部署的可用区
- 客户端渠道:APP、小程序、PC网页、第三方对接平台
代码示例:订单支付监控
// 初始化订单支付观测实例 Observation paymentObservation = Observation.start("order.payment", observationRegistry) .contextualName("订单支付") .lowCardinalityKeyValue("operation.type", "payment") // 操作类型,仅枚举值 .lowCardinalityKeyValue("deploy.env", "production") // 部署环境,固定值 .lowCardinalityKeyValue("client.channel", "mini_program"); // 客户端渠道,有限选项
说明:这些标签的取值不会随业务增长而爆炸,你可以用它们在Prometheus中统计「生产环境下小程序渠道的支付成功率」,也能在链路追踪系统中快速筛选出该渠道的所有支付请求链路。
高基数KeyValue(highCardinalityKeyValue)适用场景
这类标签的值数量可能无限增长,仅适合在链路追踪中定位单个请求或业务实例,绝对不能作为监控指标的维度(否则会导致指标基数爆炸,耗尽存储资源),典型场景包括:
- 业务唯一标识:用户ID、订单ID、商品SKU(如果SKU数量极大)
- 请求唯一标识:接口请求ID、第三方服务调用ID
- 动态路径参数:REST接口中的
userId、orderId路径变量
代码示例:带业务唯一标识的订单支付观测
// 初始化订单支付观测实例,加入高基数标签 Observation paymentObservation = Observation.start("order.payment", observationRegistry) .contextualName("订单支付") .lowCardinalityKeyValue("operation.type", "payment") .lowCardinalityKeyValue("deploy.env", "production") .highCardinalityKeyValue("user.id", "u_20240510_10001") // 用户唯一ID .highCardinalityKeyValue("order.id", "o_20240510_99999"); // 订单唯一ID
说明:当某用户反馈支付失败时,你可以通过user.id在链路追踪系统中精准定位到该用户的支付请求链路,排查具体问题;但如果把user.id作为监控指标标签,Prometheus会为每个用户生成一条独立的指标时间序列,短时间内就会导致存储过载,因此只能用highCardinalityKeyValue仅写入链路数据。
代码示例:API请求观测
// 初始化用户查询API的观测实例 Observation apiObservation = Observation.start("api.user.query", observationRegistry) .contextualName("用户信息查询") .lowCardinalityKeyValue("api.path", "/api/users") // 接口固定前缀,低基数 .lowCardinalityKeyValue("http.method", "GET") // HTTP方法,有限值 .highCardinalityKeyValue("request.trace.id", "trace_abc123456") // 请求唯一追踪ID .highCardinalityKeyValue("target.user.id", "u_20240510_10002"); // 目标用户ID
说明:api.path用来统计不同接口的请求量、响应耗时等指标;而request.trace.id和target.user.id仅用于在链路追踪中定位单个请求或特定用户的调用链路。
内容的提问来源于stack exchange,提问作者samshers
相关产品推荐
相关产品推荐

