Json Exporter

JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。这是我们经常使用的一种格式,针对这种格式 Prometheus 社区开发提供了 JSON Exporter 通过 JSONPath 来获取远端的 JSON 数据。官方仓库地址是 https://github.com/prometheus-community/json_exporter ,最新版本是 v0.3.0 ,发布于 2021 年 2 月 12 日。

JSON Exporter 通过 JSONPath 来获取远端的 JSON 数据,要查看这个导出器支持的 JSON Path 配置,请访问这里 https://kubernetes.io/docs/reference/kubectl/jsonpath/

查看示例导出器配置、Prometheus 配置和预期数据格式的示例目录。

配置语法在 0.3.x 版本中已经更改。如果从0.2.x 迁移,那么请使用上面提到的 JSONPath 指导正确的配置语法。

安装运行

我们来看个例子,假设要采集的 JSON 数据文件 data.json 内容如下:

{
    "counter": 1234,
    "values": [
        {
            "id": "id-A",
            "count": 1,
            "some_boolean": true,
            "state": "ACTIVE"
        },
        {
            "id": "id-B",
            "count": 2,
            "some_boolean": true,
            "state": "INACTIVE"
        },
        {
            "id": "id-C",
            "count": 3,
            "some_boolean": false,
            "state": "ACTIVE"
        }
    ],
    "location": "mars"
}

那么 JSON Exporter 的配置文件config.yml 内容如下:

---
metrics:
- name: example_global_value
  path: "{ .counter }"
  help: Example of a top-level global value scrape in the json
  labels:
    environment: beta # static label
    location: "planet-{.location}"          # dynamic label

- name: example_value
  type: object
  help: Example of sub-level value scrapes from a json
  path: '{.values[?(@.state == "ACTIVE")]}'
  labels:
    environment: beta # static label
    id: '{.id}'          # dynamic label
  values:
    active: 1      # static value
    count: '{.count}' # dynamic value
    boolean: '{.some_boolean}'

headers:
  X-Dummy: my-test-header

我们来启动一个简单的 Web 服务 python -m SimpleHTTPServer 8000 &

这个时候 JSON Exporter 的启动方式如下:

./json_exporter --config.file examples/config.yml

JSON Exporter 启动以后默认会在 7979 暴露自己的监控数据,和其它 Exporter 一样,可以通过 Curl 来查看指标内容

$ curl "http://localhost:7979/probe?target=http://localhost:8000/examples/data.json" | grep ^example


example_global_value{environment="beta",location="planet-mars"} 1234
example_value_active{environment="beta",id="id-A"} 1
example_value_active{environment="beta",id="id-C"} 1
example_value_boolean{environment="beta",id="id-A"} 1
example_value_boolean{environment="beta",id="id-C"} 0
example_value_count{environment="beta",id="id-A"} 1
example_value_count{environment="beta",id="id-C"} 3

这个时候可以配置 Prometheus 来收集数据,Prometheus 的配置文件 prometheus.yml 内容可以参考

scrape_configs:

  ## gather metrics of prometheus itself
- job_name: prometheus
  static_configs:
    - targets:
      - localhost:9090

  ## gather the metrics of json_exporter application itself
- job_name: json_exporter
  static_configs:
    - targets:
      - localhost:7979 ## Location of the json exporter's real <hostname>:<port>

  ## gather the metrics from third party json sources, via the json exporter
- job_name: json
  metrics_path: /probe
  static_configs:
    - targets:
      - http://host-1.foobar.com/dummy/data.json
      - http://host-2:8000/other-examples/data.json
      - http://localhost:8000/examples/data.json ## Used from the example steps in Readme
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: localhost:7979 ## Location of the json exporter's real <hostname>:<port>

通过 HTTP POST 发送 body 内容

如果在配置中设置了 body 参数,它将作为刮擦请求中的 body 内容由Exporter 发送。在本例中,HTTP方法也将被设置为“POST”。

body:
  content: |
    My static information: {"time_diff": "1m25s", "anotherVar": "some value"}

Body 内容也可以是一个Go模板,模板中可以使用 Sprig 库中的所有函数。在呈现模板时,prometheus 在刮擦查询中发送给 Exporter 的所有查询参数都可以作为值使用。

使用模板函数的例子

body:
  content: |
    {"time_diff": "{{ duration `95` }}","anotherVar": "{{ randInt 12 30 }}"}
  templatize: true

使用查询参数赋值的模板函数示例:

body:
  content: |
    {"time_diff": "{{ duration `95` }}","anotherVar": "{{ .myVal | first }}"}
  templatize: true

使用 curl 请求 "http://exporter:7979/probe?target=http://scrape_target:8080/test/data.json&myVal=something",

会导致将下面的 body 作为HTTP POST有效负载发送到 http://scrape_target:8080/test/data.json:

{"time_diff": "1m35s","anotherVar": "something"}.

results matching ""

    No results matching ""