Kamon broadcast Context无法读取HTTP头问题及配置方法咨询
问题根因
你遇到的问题由两个常见配置不匹配导致:
- 上下文key配置和代码取值不匹配:
kamon.context.codecs.string-keys配置项的规则是左侧为Kamon上下文内的键名,右侧为对应HTTP请求头名称,你配置的上下文键名为request-id,但代码中尝试读取X-Request-ID键,自然无法拿到值。 - 未启用Kamon HTTP过滤器:自定义Play路由没有被Kamon的请求拦截逻辑处理,不会自动从请求头解析值写入上下文。
解决方案
按以下步骤调整即可正常读取:
1. 对齐上下文键名
二选一即可:
- 方案A:修改代码中读取的键名,和配置保持一致
- 方案B:修改
application.conf配置,和代码读取的键名保持一致:
kamon.context.codecs { string-keys { "X-Request-ID" = "X-Request-ID" } }
2. 启用Kamon HTTP过滤器
在application.conf中添加Play过滤器配置,确保所有请求都会被Kamon预处理:
play.http.filters = kamon.instrumentation.play.KamonPlayFilters
如果你有自定义过滤器链,将KamonPlayFilters放在过滤器链的最前端即可。
3. 确认依赖完整性
确保你已经引入了对应框架版本的Kamon集成依赖:
- Lagom项目添加
kamon-lagom依赖 - Play部分添加
kamon-play依赖
依赖版本需要和你使用的Kamon核心版本完全匹配。
修正后代码示例
如果你保留原有配置不变,调整代码读取逻辑即可:
case GET(p"/helloWorld") => action(parser.default) { request => // 键名和配置中string-keys左侧的键完全一致 val xrequestKeyID = Context.key[String]("request-id", null) val requestID1: String = Kamon.currentContext().get(xrequestKeyID) println(s"requestID1=$requestID1") val headers = request.headers.toString() println(s"Header=${headers}") Results.Accepted }
内容的提问来源于stack exchange,提问作者German Palacios
相关产品推荐
相关产品推荐

