Go to file
ngrebels ca1304003c
Support Value Conversions (#172)
* Bump k8s.io/client-go from 0.24.2 to 0.24.3 (#171)

Bumps [k8s.io/client-go](https://github.com/kubernetes/client-go) from 0.24.2 to 0.24.3.
- [Release notes](https://github.com/kubernetes/client-go/releases)
- [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kubernetes/client-go/compare/v0.24.2...v0.24.3)

---
updated-dependencies:
- dependency-name: k8s.io/client-go
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: ngrebels <ngrebels@mathworks.com>
Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>

* Bump github.com/prometheus/common from 0.35.0 to 0.37.0 (#170)

Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.35.0 to 0.37.0.
- [Release notes](https://github.com/prometheus/common/releases)
- [Commits](https://github.com/prometheus/common/compare/v0.35.0...v0.37.0)

---
updated-dependencies:
- dependency-name: github.com/prometheus/common
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: ngrebels <ngrebels@mathworks.com>
Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>

* Added a value converter for dynamic values and associated tests

Signed-off-by: ngrebels <ngrebels@mathworks.com>
Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>

* Refactored into functions and created a type

Signed-off-by: ngrebels <ngrebels@mathworks.com>
Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>

* value converter: added example

Signed-off-by: ngrebels <ngrebels@mathworks.com>
Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>

* Remove underscore from variable name

Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>

* Fix formatting error from merging

Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>

Signed-off-by: ngrebels <ngrebels@mathworks.com>
Signed-off-by: Yao Hong Kok <yaokok@mathworks.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yao Hong Kok <yaokok@mathworks.com>
2022-10-05 18:32:05 +02:00
.circleci Update build (#154) 2022-05-23 22:05:45 +09:00
.github Update common Prometheus files (#156) 2022-06-14 00:32:32 +02:00
cmd Support modules configuration (#146) 2022-05-27 14:47:32 +09:00
config Support Value Conversions (#172) 2022-10-05 18:32:05 +02:00
examples Support Value Conversions (#172) 2022-10-05 18:32:05 +02:00
exporter Support Value Conversions (#172) 2022-10-05 18:32:05 +02:00
scripts Refactor FetchJson 2021-10-03 13:30:18 +02:00
test Support Value Conversions (#172) 2022-10-05 18:32:05 +02:00
.gitignore Initial import 2016-02-08 22:55:40 +09:00
.golangci.yml Release 0.4.0 (#136) 2022-01-18 14:46:03 +09:00
.promu.yml Update build (#154) 2022-05-23 22:05:45 +09:00
CHANGELOG.md Release v0.5.0 (#166) 2022-07-11 09:54:10 +02:00
CODE_OF_CONDUCT.md Update common Prometheus files 2022-05-22 19:50:52 +00:00
Dockerfile Fix dockerfile 2020-06-12 00:01:42 +02:00
go.mod Bump k8s.io/client-go from 0.24.3 to 0.25.2 (#181) 2022-10-01 11:37:23 +02:00
go.sum Bump k8s.io/client-go from 0.24.3 to 0.25.2 (#181) 2022-10-01 11:37:23 +02:00
LICENSE Update common Prometheus files 2020-06-22 00:09:16 +00:00
main.go Switch to kingpin 2020-08-06 07:32:11 +09:00
MAINTAINERS.md Add maintainers file (#60) 2020-11-04 13:01:09 +01:00
Makefile Add Docker 2020-04-17 10:06:54 +02:00
Makefile.common Update common Prometheus files (#157) 2022-07-03 10:48:26 +02:00
README.md Support Value Conversions (#172) 2022-10-05 18:32:05 +02:00
SECURITY.md Update common Prometheus files 2022-05-22 19:50:52 +00:00
VERSION Release v0.5.0 (#166) 2022-07-11 09:54:10 +02:00

json_exporter

CircleCI

A prometheus exporter which scrapes remote JSON by JSONPath. For checking the JSONPath configuration supported by this exporter please head over here.
Checkout the examples directory for sample exporter configuration, prometheus configuration and expected data format.

⚠️ The configuration syntax has changed in version 0.3.x. If you are migrating from 0.2.x, then please use the above mentioned JSONPath guide for correct configuration syntax.

Example Usage

$ cat examples/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"
}

$ cat examples/config.yml
---
modules:
  default:
    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}'
      
    - name: example_convert
      type: object
      path: '{.values[0,1]}'
      labels:
        state: '{.state}'
      values:
        state: '{.state}'
      valueconverter:
        '{.state}': #convert value 'state' into a number
          active: 1
          inactive: 2

    headers:
      X-Dummy: my-test-header

$ python -m SimpleHTTPServer 8000 &
Serving HTTP on 0.0.0.0 port 8000 ...

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

$ curl "http://localhost:7979/probe?module=default&target=http://localhost:8000/examples/data.json" | grep ^example
example_convert_state{state="ACTIVE"} 1
example_convert_state{state="INACTIVE"} 2
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

# To test through prometheus:
$ docker run --rm -it -p 9090:9090 -v $PWD/examples/prometheus.yml:/etc/prometheus/prometheus.yml --network host prom/prometheus

Then head over to http://localhost:9090/graph?g0.range_input=1h&g0.expr=example_value_active&g0.tab=1 or http://localhost:9090/targets to check the scraped metrics or the targets.

Using custom timestamps

This exporter allows you to use a field of the metric as the (unix/epoch) timestamp for the data as an int64. However, this may lead to unexpected behaviour, as the prometheus implements a Staleness mechanism. Including timestamps in metrics disabled this staleness handling and can make data visible for longer than expected.

Exposing metrics through HTTPS

TLS configuration supported by this exporter can be found at exporter-toolkit/web

Build

make build

Sending body content for HTTP POST

If body paramater is set in config, it will be sent by the exporter as the body content in the scrape request. The HTTP method will also be set as 'POST' in this case.

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

The body content can also be a Go Template. All the functions from the Sprig library can be used in the template. All the query parameters sent by prometheus in the scrape query to the exporter, are available as values while rendering the template.

Example using template functions:

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

Example using template functions with values from the query parameters:

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

Then curl "http://exporter:7979/probe?target=http://scrape_target:8080/test/data.json&myVal=something", would result in sending the following body as the HTTP POST payload to http://scrape_target:8080/test/data.json:

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

Docker

docker run \
  -v $PWD/examples/config.yml:/config.yml \
  quay.io/prometheuscommunity/json-exporter \
  --config.file=/config.yml