Automatically convert JSON payloads into Prometheus metrics
Let's say your JSON Endpoint exposes information similar to:
{
"last_refresh_epoch": 1631046901,
"num_http_requests": 13
}This automatically gets transformed into:
last_refresh_epoch 1631046901,
num_http_requests: 13
If your JSON response contains properties with values other than numbers or booleans, json_exporter ignores them by default. It is possible, however, to leverage these properties to add additional context to a single metric.
$ json_exporter <HTTP Endpoint serving JSON Data> -c config.yml -e '<entry_point>'JSON properties with numeric or boolean values get converted automatically. JSON responses with a more complex structure require additional configuration.
Consider this JSON:
{
"environment": "production",
"id": "xyz",
"last_refresh_epoch": 1631046901,
"components": {
"network": {
"status": "OK",
"status_upstream": "active",
"has_ip_addresses": true,
"use_ip_v6": false,
"upstream_endpoints": 54
},
"router": {
"status": "Warning",
"num_active_uplinks": 1,
"num_uplinks": 2
}
}
}By default, only last_refresh_epoch gets transformed into a metric:
last_refresh_epoch 1631046901
To add more context, in your yaml configuration file, please add:
global_labels:
- name: environment
selector: .environment
- name: id
selector: .id
Which then will result in metrics with labels:
last_refresh_epoch{environment="production",id="xyz"} 1631046901
num_requests{environment="production",id="xyz"} 42
name defines the label name, selector must contain a valid jq filter.
It is possible to convert nested objects.
{
"environment": "production",
"id": "xyz",
"last_refresh_epoch": 1631046901,
"num_requests": 42,
"components": {
"network": {
"status": "OK",
"status_upstream": "active",
"has_ip_addresses": true,
"use_ip_v6": false,
"upstream_endpoints": 54
},
"router": {
"status": "Warning",
"num_active_uplinks": 1,
"num_uplinks": 2
}
}
}To convert network and router from the above example, your configuration file needs to look like this:
gauge_field: status
global_labels:
- name: environment
selector: .environment
- name: id
selector: .id
gauge_field_values:
- warning
- critical
- okgauge_field tells json_exporter which field to convert into a gauge value. Without any further configuration, if gauge_field contains a number, "OK" or "ERROR", will be automatically converted.
If gauge_field contains any other values, please configure gauge_field_values. For each entry in gauge_field_values, you will receive one metric:
router_status{environment="production",id="xyz",num_active_uplinks=1,num_uplinks=2,status="warning"} 1
router_status{environment="production",id="xyz",num_active_uplinks=1,num_uplinks=2,status="critical"} 0
router_status{environment="production",id="xyz",num_active_uplinks=1,num_uplinks=2,status="ok"} 0
network_status{environment="production",id="xyz",status_upstream="active",has_ip_addresses=true,use_ip_v6=false,upstream_endpoints=54,status="warning"} 0
network_status{environment="production",id="xyz",status_upstream="active",has_ip_addresses=true,use_ip_v6=false,upstream_endpoints=54,status="critical"} 0
network_status{environment="production",id="xyz",status_upstream="active",has_ip_addresses=true,use_ip_v6=false,upstream_endpoints=54,status="ok"} 1
If the values are nested, you need to provide an entry point (via -e flag) in jq notation:
$json_exporter http://localhost:8800/json -c config.yaml -e ".components"
If you'd like to include metrics for JSON objects that are nested and wouldn't otherwise be generated automatically, it's possible to configure json exporter to also fetch and convert those.
In your config file, please add:
includes:
- name: router_backend_status
label_name: backend
label_selector: .router.backend
selector:
- ".router.backend.back1"
- ".router.backend.back2"Explanation:
name: The resulting metric name
label_name: Since you can provide multiple selectors, each resulting metric will have an attribute indicating from which JSON Object it originated. label_name allows you to configure the name for that label.
label_selector: A valid jq selector to fetch the value for above-mentioned label.
selector: One or more valid jq selectors that specify paths for JSON objects to retrieve
If you'd like to add a prefix to all metrics so you can determine their origin, please add
global_prefix: my_prefixto your configuration file.
-
= Rust 1.54
brew install jq
System requirements:
jqneeds to be present in$PATH
MIT