【问题标题】:Istio Distributed Tracing shows just 1 spanIstio 分布式跟踪仅显示 1 个跨度
【发布时间】:2018-07-29 03:47:11
【问题描述】:

我正在使用 Zipkin 关注 this 指南。 我有 3 个微服务,A -> B -> C,我正在将标头从 A 传播到 B,从 B 传播到 C。 但在 Zipkin 仪表板中,我只看到 A -> BB -> 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


【解决方案1】:

Object.keys(headers).filter((key) =&gt; TRACING_HEADERS.includes(key)).map((key) =&gt; headers[key]) 返回一个数组

你想要的是:

Object.keys(headers)                                                                                                                                                                              
  .filter(key => TRACING_HEADERS.includes(key))                                                                                                                                                                    
  .reduce((obj, key) => {                                                                                                                                                                                          
    obj[key] = headers[key];                                                                                                                                                                                       
    return obj;                                                                                                                                                                                                    
  }, {})

我很确定这不是 istio / 分布式跟踪问题 ;-)

【讨论】:

    【解决方案2】:

    可以在 application.yml 中配置 x-b3-parentspanid (https://github.com/openzipkin/b3-propagation) 的 b3-propagation:

    opentracing:
      jaeger:
        enable-b3-propagation: true
    

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 2019-02-01
      • 2020-06-11
      • 2017-09-28
      • 2020-02-21
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      相关资源
      最近更新 更多