You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Björn Rabenstein 9180c89ee6
Merge pull request #73 from prometheus/beorn7/release
1 month ago
.circleci *: bump Go version to 1.13 4 months ago
cmd/prom2json Use DefaultTransport as baseline and set ResponseHeaderTimeout 1 month ago
vendor Update dependencies 1 month ago
.gitignore Add Makefile 4 years ago
.golangci.yml Add .golangci.yml 9 months ago
.promu.yml *: bump Go version to 1.13 4 months ago Cut v1.3.0 1 month ago Remove reference from 2 years ago
Dockerfile Fix typo in Dockerfile (#62) 6 months ago
LICENSE License cleanup 5 years ago Update beorn's e-mail and add GH handle 5 months ago
Makefile Build ARM container images (#61) 6 months ago
Makefile.common makefile: update Makefile.common with newer version 4 months ago
NOTICE License cleanup 5 years ago allow reading from stdin and file (#35) 1 year ago
VERSION Cut v1.3.0 1 month ago
go.mod Update dependencies 1 month ago
go.sum Update dependencies 1 month ago
prom2json.go Close metric family channel in case of errors 2 months ago
prom2json_test.go Fix test so it exposes bug #64 6 months ago


A tool to scrape a Prometheus client and dump the result as JSON.


(Pre-)historically, Prometheus clients were able to expose metrics as JSON. For various reasons, the JSON exposition format was deprecated.

Usually, scraping of a Prometheus client is done by the Prometheus server, which preferably happens with the protocol buffer format. Sometimes, a human being needs to inspect what a Prometheus clients exposes. In that case, the text format is used (which is otherwise meant to allow simplistic clients like shell scripts to expose metrics to a Prometheus server).

However, some users wish to scrape Prometheus clients with programs other than the Prometheus server. Those programs would usually use the protocol buffer format, but for small ad hoc programs, that is too much of an (programming) overhead. JSON comes in handy for these use-cases, as many languages offer tooling for JSON parsing.

To avoid maintaining a JSON format in all client libraries, the prom2json tool has been created, which scrapes a Prometheus client in protocol buffer or text format and dumps the result as JSON to stdout.


Installing and building:

$ go get


$ prom2json
$ curl | prom2json
$ prom2json /tmp/metrics.prom

Running with TLS client authentication:

$ prom2json --cert=/path/to/certificate --key=/path/to/key

Running without TLS validation (insecure, do not use in production!):

$ prom2json --accept-invalid-cert

Advanced HTTP through curl:

$ curl -XPOST -H 'X-CSRFToken: 1234567890abcdef' --connect-timeout 60 '' | prom2json

This will dump the JSON to stdout. Note that the dumped JSON is not using the deprecated JSON format as specified in the Prometheus exposition format reference. The created JSON uses a format much closer in structure to the protocol buffer format. It is only used by the prom2json tool and has no significance elsewhere. See below for a description.

A typical use-case is to pipe the JSON format into a tool like jq to run a query over it. That looked like the following when the clients still supported the deprecated JSON format:

$ curl | jq .

Now simply use prom2json instead of curl (and change the query syntax according to the changed JSON format generated by prom2json):

$ prom2json | jq .

Example query to retrieve the number of metrics in the http_requests_total metric family (only works with the new format):

$ prom2json | jq '.[]|select(.name=="http_requests_total")|.metrics|length'

JSON format

Note that all numbers are encoded as strings. Some parsers want it that way. Also, Prometheus allows sample values like NaN or +Inf, which cannot be encoded as JSON numbers.

    "name": "http_request_duration_microseconds",
    "help": "The HTTP request latencies in microseconds.",
    "type": "SUMMARY",
    "metrics": [
        "labels": {
          "method": "get",
          "handler": "prometheus",
          "code": "200"
        "quantiles": {
          "0.99": "67542.292",
          "0.9": "23902.678",
          "0.5": "6865.718"
        "count": "743",
        "sum": "6936936.447000001"
        "labels": {
          "method": "get",
          "handler": "prometheus",
          "code": "400"
        "quantiles": {
          "0.99": "3542.9",
          "0.9": "1202.3",
          "0.5": "1002.8"
        "count": "4",
        "sum": "345.01"
    "name": "roshi_select_call_count",
    "help": "How many select calls have been made.",
    "type": "COUNTER",
    "metrics": [
        "value": "1063110"

Using Docker

You can deploy this tool using the prom/prom2json Docker image.

For example:

docker pull prom/prom2json

docker run --rm -ti prom/prom2json