【发布时间】:2018-07-29 03:47:11
【问题描述】:
我正在使用 Zipkin 关注 this 指南。
我有 3 个微服务,A -> B -> C,我正在将标头从 A 传播到 B,从 B 传播到 C。
但在 Zipkin 仪表板中,我只看到 A -> B 和 B -> C 的条目,而不是 A -> B -> C。
这些是标题:
[
"x-request-id",
"x-b3-traceid",
"x-b3-spanid",
"x-b3-parentspanid",
"x-b3-sampled",
"x-b3-flags",
"x-ot-span-context"
]
我可以在 B 中看到 x-b3-parentspanid 为空,我想这是错误的,但我认为另一个正在工作......这怎么可能?
编辑: 添加代码 sn-ps 以显示标头传播
A -> B传播:
app.post("/job", (req, res) => postJob(req.body, req.headers).then((response) => res.send(response)))
...
const postJob = (job, headers) => rp({
method: "POST",
uri: `${API_ENDPOINT}/api/job`,
json: true,
body: job,
headers: Object.keys(headers).filter((key) => TRACING_HEADERS.includes(key)).map((key) => headers[key])
})
B -> C传播:
@PostMapping("/api/job")
@ResponseBody
fun publish(
@RequestBody job: Job,
@RequestHeader("x-request-id") xreq: String?,
@RequestHeader("x-b3-traceid") xtraceid: String?,
@RequestHeader("x-b3-spanid") xspanid: String?,
@RequestHeader("x-b3-parentspanid") xparentspanid: String?,
@RequestHeader("x-b3-sampled") xsampled: String?,
@RequestHeader("x-b3-flags") xflags: String?,
@RequestHeader("x-ot-span-context") xotspan: String?
): JobResponse = jobsService.publishJob(
job, mapOf(
"x-request-id" to xreq,
"x-b3-traceid" to xtraceid,
"x-b3-spanid" to xspanid,
"x-b3-parentspanid" to xparentspanid,
"x-b3-sampled" to xsampled,
"x-b3-flags" to xflags,
"x-ot-span-context" to xotspan
)
)
...
fun publishJob(job: Job, headers: Map<String, String?>): JobResponse {
val enabled = restTemplate.exchange(
"${gatekeeperConfiguration.endpoint}/",
HttpMethod.GET,
HttpEntity(headers),
EnabledResponse::class.java
).body
if (!enabled!!.isEnabled) // TODO we intentionally want this to crash if body is null
return JobResponse(JobRequestStatus.REJECTED)
return if (this.queue.publish(job)) JobResponse(JobRequestStatus.OK)
else throw RuntimeException("I don't know what to do, yet")
}
【问题讨论】:
-
您确定您的服务传播所有标头吗?
-
@LukasEichler 用一些代码更新了答案
-
给它一个 kotlin 标签可能会更好(那是 kotlin,对吗?)我不知道 kotlin,但很多事情看起来很可疑。最可疑的是 HttpEntity(),显然是为了传播标头。术语“实体”在 HTTP 领域具有特定含义。从这个意义上我会推断,标头映射实际上被写入 B->C 请求的主体,而不是呈现为单独的请求标头。但是你应该问那些了解 kotlin 的人。
-
我也遇到过类似的问题,不确定是否相同,但请看这里的答案:stackoverflow.com/questions/52038025/…
-
您确认接头在电线上吗?
标签: kubernetes zipkin istio