Prometheus PromQL Tutorial with Examples

In this article we are going to learn Prometheus PromQL(Prometheus Query Language) Tutorial with examples,Prometheus Data Types, Prometheus selectors and matchers , Prometheus comparison binary operators.

What is Prometheus PromQL(Prometheus Query language)

PromQL is a query language for Prometheus monitoring system. It is designed for building powerful yet simple queries for graphs, alerts or derived time series.

PromQL is the querying language that is part of Prometheus. In addition to PromQL, Prometheus provides a scraper that fetches metrics from instances (any application providing metrics) and a time series database, which stores these metrics over time.

The result of an expression can either be shown as a graph, viewed as tabular data in Prometheus’s expression browser, or consumed by external systems via the HTTP API.

Here we can run the expressions

Prometheus PromQL Tutorial with Examples 1
img 1

#1.Data Types of PromQL

PromQL uses four data types

  • Scalar
  • Range vector
  • Instant vector
  • String

Let’s understand one by one with examples

Scalar : The expressions resulting in a single constant numeric floating number is scalar.

 e.g, 11.99

String: The expressions whose output is a string literal is a part of this category. It is currently unused in Prometheus.

e.g, welcome

Instant vectors: These vectors have a single value corresponding to each timestamp in the time series.

Now you can run the below expression on your expression browser 

E.g, prometheus_http_requests_total
Prometheus PromQL Tutorial with Examples 2
instant vector

So you can see above image it has return all the time series with the name prometheus_http_request_total and it has return one value of the given time series.

Range Vectors: These vectors have a list of values corresponding to each timestamp in the time series.

Now you can run the below expression on your expression browser 

E.g, prometheus_http_requests_total[1m]
Prometheus PromQL Tutorial with Examples 3
range vector

You can see in the above image Range vector can return many samples for each time series. We have four samples for each time series

Time durations are specified as a number, followed immediately by one of the following units:

  • ms – milliseconds
  • s – seconds
  • m – minutes
  • h – hours
  • d – days – assuming a day has always 24h
  • w – weeks – assuming a week has always 7d
  • y – years – assuming a year has always 365d

#2.Prometheus Selectors and Matchers

What are Selectors in Prometheus?

Selectors help users to narrow down the results of an expression. For example, prometheus_http_requests_total{handler=”/alerts”} is a selector.

In PromQL there are four types of Matchers

  • Equality matcher(=)
  • Negative Equality matcher(!=)
  • Regular expression matcher(=~)
  • Negative Regular expression matcher(!~)

Lets understand one by on with examples

Firstly we will run new expression 

process_cpu_seconds_total 
Prometheus PromQL Tutorial with Examples 4
selector

You can see in the above image this expression returns total user and system cpu time on execution. It will return all the time series.

Equality matcher (=) :

Select labels that are exactly equal to the provided string. And it is case sensitive.

Suppose if you are working on any specific target like node exporter and you don’t want to see the metric coming from any target job other than node exporter.

And here we have only 2 target jobs and in real time use cases there are a number of unwanted time series.

In that situation you will always want to narrow down the time series. And you want to see only those instances which you are working on 

For filtering time series job node exporter so the query like this

e.g, process_cpu_seconds_total{job="Node Exporter"}
Prometheus PromQL Tutorial with Examples 5
matcher 1

As you can see here only node exporter series show

Negative Equality matcher (!=) :

Select labels that are not equal to the provided string.

In easy language it means if you don’t want to see any specific time series 

e.g, process_cpu_seconds_total{job!="Node Exporter"}

Here we have only 2 jobs so now I don’t wants to see node exporter series

Prometheus PromQL Tutorial with Examples 6
matcher 2
Regular expression matcher (=~) :

Select labels that regex-match the provided string.

e.g, prometheus_http_requests_total{handler=~"/api.*"}
Prometheus PromQL Tutorial with Examples 7
matcher 3

Here .* for after /api there can be any laters 

We got an output whose label handle starts with api{handler=~”/api.*”}

Negative Regular expression matcher (!~) :

Select labels that do not regex-match the provided string.

e.g, prometheus_http_requests_total{handler!~"/api.*"}
Prometheus PromQL Tutorial with Examples 8
matcher 4

This matcher is totally opposite of Regular expression matcher  

And there is no any time series starts with api

#3.Prometheus Operators in PromQL

  • Binary Operators
  • Aggregation operators

Binary Operators:

Binary Operators are the operators that take two operands and performs the specified calculations on them.

Types of Binary Operators

There are three types of Binary Operators

  • Arithmetic binary operators
  • Comparison binary operators
  • Logical/set binary operators

Arithmetic binary operators

Arithmetic operators are the symbols that represent arithmetic math operations.

The following binary arithmetic operators exist in Prometheus:

  • + (addition)
  • – (subtraction)
  • * (multiplication)
  • / (division)
  • % (modulo)
  • ^ (power/exponentiation)

Binary arithmetic operators are defined between scalar/scalar, vector/scalar, and vector/vector value pairs.

e.g, prometheus_http_requests_total*2

This is a valid example of arithmetic operators between vector data type and scalar data type where prometheus_http_requests_total is vector type and 2 is a scalar.

Before multiply by 2

Prometheus PromQL Tutorial with Examples 9
arithmetic 1

It is giving this many time series when I multiply this instance vector with 2. And it will multiply all the sample values with 2.

After multiplied by 2

Prometheus PromQL Tutorial with Examples 10
arithmetic 2

You can use the remaining arithmetical operation in same way.

Prometheus Comparison binary operators

A Comparison operator is a mathematical symbol which is used for comparison

The following binary comparison operators exist in Prometheus:

  • == (equal)
  • != (not-equal)
  • > (greater-than)
  • < (less-than)
  • >= (greater-or-equal)
  • <= (less-or-equal)

Comparison operators are defined between scalar/scalar, vector/scalar, and vector/vector value pairs.

e.g, node_cpu_seconds_total>300

This many time series are giving me time that my CPU spends in each many different mode 

Before performing Comparison Operator

Prometheus PromQL Tutorial with Examples 11
comparison 1

Now suppose if you want to get the data in which CPU spending more than 300 sec so for you can use comparison operators like this

e.g, node_cpu_seconds_total>300

After performing comparison operator

Prometheus PromQL Tutorial with Examples 12
comparison 2

Here we got time series CPU spends more than 300 sec

This comparison operator is used for alert rules so you can generate alerts. 

Prometheus Logical/Set Binary Operators:

The logical operators are used to combine simple relational expressions into more complex expressions.

It is only define instant vector 

These logical/set binary operators are only defined between instant vectors:

  • and (intersection)
  • or (union)
  • unless (complement)

e.g, vector 1 and vector 2, vector 1 or vector 2, vector 1 unless vector 2

Here let me run two expressions here 

prometheus_http_request_total and node_cpu_seconds_total
Prometheus PromQL Tutorial with Examples 13
logical 1

In this you can see no data because and operator while vector to vector matching.

And here you can see there is no matching.

On execution it will check labels and values of left side and it different so thet’s why there is no data 

And it returns a matching time series on the left side.

prometheus_http_request_total or node_cpu_seconds_total
Prometheus PromQL Tutorial with Examples 14
logical 2

Now for or operator 

This operator returns all the non-matching elements of both left or right sides or matching elements of the left side.

Prometheus Aggregation Operators

Aggregation operators calculate mathematical values over a time range.

Types of Aggregation operators :

  • sum (calculate sum over dimensions)
  • min (select minimum over dimensions)
  • max (select maximum over dimensions)
  • avg (calculate the average over dimensions)
  • group (all values in the resulting vector are 1)
  • stddev (calculate population standard deviation over dimensions)
  • stdvar (calculate population standard variance over dimensions)
  • count (count number of elements in the vector)
  • count_values (count number of elements with the same value)
  • bottomk (smallest k elements by sample value)
  • topk (largest k elements by sample value)
  • quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions)

Let’s start so run expression like this

sum(node_cpu_seconds_total) 
Prometheus PromQL Tutorial with Examples 15
aggigration 1

On execution it had added all sample value

Now if you want to see some time series based on labels  then you can do it using by keyword like this

sum(prometheus_http_requests_total) by (code)
Prometheus PromQL Tutorial with Examples 16
aggigration2

Now the Aggregate time series classified with code labels

Let’s try one more example topk 

topk elements returns largest k elements of time series so run below expression 

topk(3,sum(node_cpu_seconds_total) by (mode))
Prometheus PromQL Tutorial with Examples 17
aggigration 3

So you can see here top 3 mode that your CPU spending most of the time

Let’s try one more example bottomk 

topk elements returns smallest k elements of time series so run below expression 

bottomk(3,sum(node_cpu_seconds_total) by (mode))
Prometheus PromQL Tutorial with Examples 18
aggrigation 4

So you can see here top 3 mode that your CPU spending less time

Conclusion:

In this article we have covered Prometheus PromQL( Prometheus Query Language) Tutorial with examples.

Related Articles:

Reference:

Prometheus PromQL Official page

Shweta Mamidwar

I am Shweta Mamidwar working as a Intern in Product Company. Likes to share knowledge.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Share via
Copy link
Powered by Social Snap