#prometheus #nushell-plugin #plugin #nu

app nu_plugin_prometheus

A nushell plugin for querying prometheus

2 unstable releases

0.2.0 Jun 15, 2024
0.1.0 Jun 2, 2024

#113 in Command line utilities

Download history 162/week @ 2024-05-31 17/week @ 2024-06-07 178/week @ 2024-06-14

357 downloads per month

MIT and maybe CC-PDDC

76KB
2K SLoC

nu_plugin_prometheus

A nushell plugin for querying prometheus

Supports:

  • nushell 0.94.0
  • Prometheus API
    • Instant queries
    • Range queryies
    • Target status
    • Series
    • Label names
    • Label values
  • Saved sources for convenience or mutual TLS authentication

Usage

Sources

A prometheus plugin can be queried directly with --url:

"up" | prometheus query --source https://test.prometheus.example/

Nushell plugin configuration can be used to save configure prometheus sources including mTLS.

$env.config.plugins.prometheus = {
  sources: {
    prod: {
      url: "https://prod.prometheus.example/"
      cert: ( $env.HOME | path join ".config/nu_plugin_prometheus/user.crt" )
      key: ( $env.HOME | path join ".config/nu_plugin_prometheus/user.pk8.key" )
      cacert: ( $env.HOME | path join ".config/nu_plugin_prometheus/ca.crt" )
    }
  }
}

The key must be in PKCS#8 format. You can convert a PEM key with:

openssl pkcs8 -topk8 -inform PEM -outform DER -in user.key -out user.pk8.key

Use --source or -s to use a configured source:

"up" | prometheus query --source prod

Queries

Instant

Pipe a prometheus query to prometheus query for an instant query:

"up" | prometheus query --url https://prometheus.example:9090/

This will output a table:

name labels value timestamp
up {job: prometheus, instance: prometheus.example:9090} 1 1435781451
up {job: node, instance: prometheus.example:9100} 0 1435781451

Range

A range query requires --start, --end and --step arguments:

"up" | prometheus query range --url https://prometheus.example:9090/ --start ((date now) - 30sec) --end (date now) --step 15sec
name labels values
up {job: prometheus, instance: prometheus.example:9090} [{value: 1, timestamp: 1435781430}, {value: 1, timestamp: 1435781445} {value: 1, timestamp: 1435781460}]
up {job: node, instance: prometheus.example:9100} [{value: 0, timestamp: 1435781430}, {value: 0, timestamp: 1435781445} {value: 1, timestamp: 1435781460}]

Flattening labels

Adding --flatten will flatten labels into each row.

"up" | prometheus query --url https://prometheus.example:9090/ --flatten

Outputs:

name instance job value timestamp
up prometheus.example:9090 prometheus 1 1435781451
up prometheus.example:9100 job 0 1435781451

If a metric uses "name" as a label it will overwrite the "name" column.

For a range query the values are not flattened.

Label names

Retrieve labels names with:

prometheus label names --url https://prometheus.example:9090/

Label names can be filtered by selector as input, and by time with --start and --end.

To query "up" label names:

"up" | prometheus label names --url https://prometheus.example:9090/

Label values

Retrieve labels values with:

"version" | prometheus label values --url https://prometheus.example:9090/

Label values can be filtered by name as input, by time with --start and --end, and by selector as extra arguments.

To query "version" label values for the "postgres" job:

"version" | prometheus label values --url https://prometheus.example:9090/ 'job="postgres"'

Series

Retrieve series matching the given label set with:

[up process_start_time_seconds{job="prometheus"}] |
prometheus series -s home

Series are retrieved using a selector given as input. Series retrived may be filtered by time with --start and --end.

Targets

Retreive prometheus target discovery with:

prometheus targets --url https://prometheus.example:9090/

This retrives targets in either the active or dropped states. The any argument alse retrieves both states.

Use active, or dropped to directly filter active or dropped targets. This will output only the selected state.

Dependencies

~30–66MB
~1M SLoC