xObserve

  1. 变量 Variable
  2. Http

有时,我们需要从已提供的数据源之外的地方查询变量,例如从某个 HTTP API。

在这种情况下,你需要发起一个 HTTP 请求,并解析返回的数据,以获取你想要的变量值。

在这篇文档中,我们将发起一个 HTTP 请求,从 Jaeger 中获取 frontend 服务的 operation 变量值。

在开始之前,你需要有一个运行中的 Jaeger 实例,参考 https://www.jaegertracing.io/ 了解更多信息。

创建 HTTP 数据源

http-datasource

创建 HTTP 变量

我们将创建一个变量,用于从 jaeger http api 查询数据:

http://localhost:16686/api/services/frontend/operations

我们将使用 Jaeger 文档中创建的 service 变量,请确保它仍然存在。

基本信息

如下所示,填写变量基本信息:

basic-http

大家应该有注意到,在 Query values 字段中,我们使用了 service 变量:

http://localhost:16686/api/services/${service}/operations

这意味着我们可以在 HTTP 请求 url 中使用变量

编辑 HTTP 请求

Request transform 部分,我们可以设置 HTTP 请求的参数,例如 start timeend time 等。

不能function body 中使用变量格式 ${var1},但是你可以使用它的 variables 参数作为替代。

由于我们不需要任何参数,所以保持默认即可。

如果你查看 Request transform 函数,你应该看到它默认为你的请求添加了 startend 参数。

编辑 HTTP 响应

这是 HTTP 数据源最重要的部分,我们需要解析响应数据,以获取我们想要的变量值,下面是 HTTP 数据源的返回格式:

{
    "error": null,
    "data": ['value1', 'value2']
}

而发起到 Jaeger 的 HTTP 请求返回格式如下:

{
  "data": [
    "/logproto.Querier/Label",
  ],
  "total": 31,
  "limit": 0,
  "offset": 0,
  "errors": null
}

因此我们需要对返回格式进行一下简单转换:

function transformResult(httpResult) {
    return {
        error: httpResult.errors,
        data: httpResult.data
    }
}

现在我们可以成功获取到 frontend service 的 operation 变量值。

http-variable

最终效果

上面的代码很简单,原因只有一个: Jaeger 的 API 返回格式跟我们需要的几乎一致,但是大多数情况下,你都需要做一些额外的工作来确保数据格式被正确转换。

如上所示,由于我们在 http 请求的 url 中使用了 service 变量,因此当改变 service 变量值时,operation 变量的值也会随之变化,666.