{"id":23894,"date":"2021-09-26T17:52:05","date_gmt":"2021-09-26T17:52:05","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=23894"},"modified":"2021-09-26T17:52:06","modified_gmt":"2021-09-26T17:52:06","slug":"prometheus-promql-example-query","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/prometheus-promql-example-query\/","title":{"rendered":"Prometheus PromQL Example Query"},"content":{"rendered":"\n<p>This should return a number of different time series (along with the latest value recorded for each), all with the metric name promhttp_metric_handler_requests_total, but with different labels. These labels designate different requests statuses.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instant vector and Instant vector with Filter<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">promhttp_metric_handler_requests_total\r\nscrape_duration_seconds{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>}\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>}\r\nscrape_duration_seconds\r\nscrape_duration_seconds{instance=<span class=\"hljs-string\">\"172.31.20.76:9182\"<\/span>,job=<span class=\"hljs-string\">\"win-exporter\"<\/span>}\r\nnode_cpu_seconds_total\r\nnode_cpu_seconds_total{cpu=<span class=\"hljs-string\">\"0\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>,mode=<span class=\"hljs-string\">\"nice\"<\/span>}\r\n<span class=\"hljs-comment\"># If we were only interested in requests that resulted in HTTP code 200, we could use this query to retrieve that information:<\/span>\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>}\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Instant vector and Instant vector with Filter using regular Expresson<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">scrape_duration_seconds{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>}\r\nscrape_duration_seconds{instance=~<span class=\"hljs-string\">\".*9100\"<\/span>}\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>}\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=~<span class=\"hljs-string\">\".*exporter\"<\/span>}\r\nscrape_duration_seconds{instance=<span class=\"hljs-string\">\"172.31.20.76:9182\"<\/span>,job=<span class=\"hljs-string\">\"win-exporter\"<\/span>}\r\nscrape_duration_seconds{instance=<span class=\"hljs-string\">\"172.31.20.76:9182\"<\/span>,job=~<span class=\"hljs-string\">\"win.*\"<\/span>}\r\nnode_cpu_seconds_total\r\nnode_cpu_seconds_total{mode=<span class=\"hljs-string\">\"irq\"<\/span>}\r\nnode_cpu_seconds_total{mode=~<span class=\"hljs-string\">\".*irq\"<\/span>}\r\nprometheus_http_requests_total{job=~<span class=\"hljs-string\">\".*server\"<\/span>}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Range Vector with filter<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">promhttp_metric_handler_requests_total&#91;<span class=\"hljs-number\">10<\/span>m]\r\nscrape_duration_seconds{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>}&#91;<span class=\"hljs-number\">10<\/span>m]\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>}&#91;<span class=\"hljs-number\">200<\/span>s]\r\nscrape_duration_seconds&#91;<span class=\"hljs-number\">200<\/span>s]\r\nscrape_duration_seconds{instance=<span class=\"hljs-string\">\"172.31.20.76:9182\"<\/span>,job=<span class=\"hljs-string\">\"win-exporter\"<\/span>}&#91;<span class=\"hljs-number\">200<\/span>s]\r\nnode_cpu_seconds_total&#91;<span class=\"hljs-number\">3<\/span>h]\r\nnode_cpu_seconds_total{cpu=<span class=\"hljs-string\">\"0\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>,mode=<span class=\"hljs-string\">\"nice\"<\/span>}&#91;<span class=\"hljs-number\">3<\/span>h]\r\n<span class=\"hljs-comment\"># If we were only interested in requests that resulted in HTTP code 200, we could use this query to retrieve that information:<\/span>\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>}&#91;<span class=\"hljs-number\">1<\/span>d]\r\npromhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>}&#91;<span class=\"hljs-number\">1<\/span>d]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">offset example<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">prometheus_http_requests_total\r\nprometheus_http_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,handler=<span class=\"hljs-string\">\"\/metrics\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9090\"<\/span>,job=<span class=\"hljs-string\">\"prometheus\"<\/span>}\r\nprometheus_http_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>,handler=<span class=\"hljs-string\">\"\/metrics\"<\/span>,instance=<span class=\"hljs-string\">\"localhost:9090\"<\/span>,job=<span class=\"hljs-string\">\"prometheus\"<\/span>} offset <span class=\"hljs-number\">5<\/span>m\r\nprometheus_http_requests_total offset <span class=\"hljs-number\">5<\/span>m\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Scalar Example<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">sum<\/span>(<span class=\"hljs-selector-tag\">rate<\/span>(<span class=\"hljs-selector-tag\">prometheus_http_requests_total<\/span><span class=\"hljs-selector-attr\">&#91;5m]<\/span> <span class=\"hljs-selector-tag\">offset<\/span> 5<span class=\"hljs-selector-tag\">m<\/span>))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Sub Queries<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">node_netstat_Tcp_InSegs\r\nnode_netstat_Tcp_InSegs{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>}\r\nrate(node_netstat_Tcp_InSegs{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>,job=<span class=\"hljs-string\">\"node-exporter\"<\/span>}&#91;<span class=\"hljs-number\">5<\/span>m])\nrate(node_netstat_Tcp_InSegs&#91;<span class=\"hljs-number\">1<\/span>m])\r\nceil(rate(node_netstat_Tcp_InSegs&#91;<span class=\"hljs-number\">1<\/span>m]))\r\nderiv(ceil(rate(node_netstat_Tcp_InSegs&#91;<span class=\"hljs-number\">1<\/span>m]))&#91;<span class=\"hljs-number\">1<\/span>m:])<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">aggregation operators<\/h2>\n\n\n\n<p>To count the number of returned time series, you could write:<br>promhttp_metric_handler_requests_total<br>count(promhttp_metric_handler_requests_total)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Functions<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">rate(promhttp_metric_handler_requests_total)\t<span class=\"hljs-comment\">#Error<\/span>\r\nrate(promhttp_metric_handler_requests_total{code=<span class=\"hljs-string\">\"200\"<\/span>}&#91;<span class=\"hljs-number\">1<\/span>m])\r\n<span class=\"hljs-comment\"># The average amount of CPU time spent in system mode, per second, over the last minute (in seconds)<\/span>\r\nrate(node_cpu_seconds_total{mode=<span class=\"hljs-string\">\"system\"<\/span>}&#91;<span class=\"hljs-number\">1<\/span>m])\r\n\r\n<span class=\"hljs-comment\"># The average network traffic received, per second, over the last minute (in bytes)<\/span>\r\nrate(node_network_receive_bytes_total&#91;<span class=\"hljs-number\">1<\/span>m])\r\n\r\nrate(scrape_duration_seconds{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>}&#91;<span class=\"hljs-number\">1<\/span>m:<span class=\"hljs-number\">20<\/span>s])\r\n\r\n<span class=\"hljs-comment\"># Usability of such graphs is close to zero, because they show hard-to-interpret constantly growing counter values, while we need graphs for network bandwidth \u2014 see MB\/s on the left of the graph. PromQL has a magic function for this \u2014 rate(). It calculates per-second rate for all the matching time series:<\/span>\r\nrate(node_network_receive_bytes_total&#91;<span class=\"hljs-number\">5<\/span>m])<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">aggregation operatos with Functions<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">sum<\/span> <span class=\"hljs-selector-tag\">by<\/span> (<span class=\"hljs-selector-tag\">job<\/span>) (\r\n  <span class=\"hljs-selector-tag\">rate<\/span>(<span class=\"hljs-selector-tag\">prometheus_http_requests_total<\/span><span class=\"hljs-selector-attr\">&#91;5m]<\/span>)\r\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>A set of time series containing a range of data points over time for each time series. Return a whole range of scrape_duration_seconds (in this case 5 minutes) for the same vector, making it a range vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">promhttp_metric_handler_requests_total&#91;<span class=\"hljs-number\">5<\/span>m]\r\nnode_netstat_Tcp_InSegs{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>}&#91;<span class=\"hljs-number\">5<\/span>m] \r\nnode_netstat_Tcp_InSegs{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>}&#91;<span class=\"hljs-number\">1<\/span>m] \r\nnode_netstat_Tcp_InSegs{instance=<span class=\"hljs-string\">\"localhost:9100\"<\/span>}&#91;<span class=\"hljs-number\">30<\/span>s]\r\n\r\n<span class=\"hljs-keyword\">Return<\/span> all time series with the metric http_requests_total:\r\nprometheus_http_requests_total\r\n\r\n<span class=\"hljs-keyword\">Return<\/span> all time series with the metric http_requests_total <span class=\"hljs-keyword\">and<\/span> the given job <span class=\"hljs-keyword\">and<\/span> handler labels:\r\nprometheus_http_requests_total{job=<span class=\"hljs-string\">\"apiserver\"<\/span>, handler=<span class=\"hljs-string\">\"\/api\/comments\"<\/span>}\r\n\r\n<span class=\"hljs-keyword\">Return<\/span> a whole range of time (in this <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-number\">5<\/span> minutes) <span class=\"hljs-keyword\">for<\/span> the same vector, making it a range vector:\r\nprometheus_http_requests_total{job=<span class=\"hljs-string\">\"apiserver\"<\/span>, handler=<span class=\"hljs-string\">\"\/api\/comments\"<\/span>}&#91;<span class=\"hljs-number\">5<\/span>m]\r\n\r\nNote that an expression resulting in a range vector cannot be graphed directly, but viewed in the tabular (<span class=\"hljs-string\">\"Console\"<\/span>) view of the expression browser.\r\n\r\nUsing regular expressions, you could select time series only <span class=\"hljs-keyword\">for<\/span> jobs whose name match a certain pattern, in this <span class=\"hljs-keyword\">case<\/span>, all jobs that end with server:\r\n\r\n\r\nTo select all HTTP status codes except <span class=\"hljs-number\">4<\/span>xx ones, you could run:\r\nprometheus_http_requests_total{status!~<span class=\"hljs-string\">\"4..\"<\/span>}\r\n\r\nSubquery- <span class=\"hljs-keyword\">Return<\/span> the <span class=\"hljs-number\">5<\/span>-minute rate of the http_requests_total metric <span class=\"hljs-keyword\">for<\/span> the past <span class=\"hljs-number\">30<\/span> minutes, with a resolution of <span class=\"hljs-number\">1<\/span> minute.\r\nrate(prometheus_http_requests_total&#91;<span class=\"hljs-number\">5<\/span>m])&#91;<span class=\"hljs-number\">30<\/span>m:<span class=\"hljs-number\">1<\/span>m]\r\n\r\nThis is an example of a nested subquery. The subquery <span class=\"hljs-keyword\">for<\/span> the deriv <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">uses<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">default<\/span> <span class=\"hljs-title\">resolution<\/span>. <span class=\"hljs-title\">Note<\/span> <span class=\"hljs-title\">that<\/span> <span class=\"hljs-title\">using<\/span> <span class=\"hljs-title\">subqueries<\/span> <span class=\"hljs-title\">unnecessarily<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">unwise<\/span>.\r\n<span class=\"hljs-title\">max_over_time<\/span><span class=\"hljs-params\">(deriv<span class=\"hljs-params\">(rate<span class=\"hljs-params\">(distance_covered_total&#91;<span class=\"hljs-number\">5<\/span>s])<\/span>&#91;<span class=\"hljs-number\">30<\/span>s:<span class=\"hljs-number\">5<\/span>s])<\/span>&#91;<span class=\"hljs-number\">10<\/span>m:])<\/span>\r\n\r\n<span class=\"hljs-title\">Using<\/span> <span class=\"hljs-title\">functions<\/span>, <span class=\"hljs-title\">operators<\/span>, <span class=\"hljs-title\">etc<\/span> - <span class=\"hljs-title\">Return<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">per<\/span>-<span class=\"hljs-title\">second<\/span> <span class=\"hljs-title\">rate<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">all<\/span> <span class=\"hljs-title\">time<\/span> <span class=\"hljs-title\">series<\/span> <span class=\"hljs-title\">with<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">http_requests_total<\/span> <span class=\"hljs-title\">metric<\/span> <span class=\"hljs-title\">name<\/span>, <span class=\"hljs-title\">as<\/span> <span class=\"hljs-title\">measured<\/span> <span class=\"hljs-title\">over<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">last<\/span> 5 <span class=\"hljs-title\">minutes<\/span>:\r\n<span class=\"hljs-title\">rate<\/span><span class=\"hljs-params\">(prometheus_http_requests_total&#91;<span class=\"hljs-number\">5<\/span>m])<\/span>\r\n\r\n<span class=\"hljs-title\">Assuming<\/span> <span class=\"hljs-title\">that<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">http_requests_total<\/span> <span class=\"hljs-title\">time<\/span> <span class=\"hljs-title\">series<\/span> <span class=\"hljs-title\">all<\/span> <span class=\"hljs-title\">have<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">labels<\/span> <span class=\"hljs-title\">job<\/span> <span class=\"hljs-params\">(fanout by job name)<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">instance<\/span> <span class=\"hljs-params\">(fanout by instance of the job)<\/span>, <span class=\"hljs-title\">we<\/span> <span class=\"hljs-title\">might<\/span> <span class=\"hljs-title\">want<\/span> <span class=\"hljs-title\">to<\/span> <span class=\"hljs-title\">sum<\/span> <span class=\"hljs-title\">over<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">rate<\/span> <span class=\"hljs-title\">of<\/span> <span class=\"hljs-title\">all<\/span> <span class=\"hljs-title\">instances<\/span>, <span class=\"hljs-title\">so<\/span> <span class=\"hljs-title\">we<\/span> <span class=\"hljs-title\">get<\/span> <span class=\"hljs-title\">fewer<\/span> <span class=\"hljs-title\">output<\/span> <span class=\"hljs-title\">time<\/span> <span class=\"hljs-title\">series<\/span>, <span class=\"hljs-title\">but<\/span> <span class=\"hljs-title\">still<\/span> <span class=\"hljs-title\">preserve<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">job<\/span> <span class=\"hljs-title\">dimension<\/span>:\r\n<span class=\"hljs-title\">sum<\/span> <span class=\"hljs-title\">by<\/span> <span class=\"hljs-params\">(job)<\/span> <span class=\"hljs-params\">(\r\n  rate<span class=\"hljs-params\">(prometheus_http_requests_total&#91;<span class=\"hljs-number\">5<\/span>m])<\/span>\r\n)<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">The filesystem space available to non-root users (in bytes)<\/h2>\n\n\n\n<p>node_filesystem_avail_bytes<\/p>\n\n\n\n<p>Filtering by label- A single metric name may correspond to multiple time series with distinct label sets as in the example above. How to select time series matching only {device=&#8221;eth1&#8243;}? Just mention the required label in the query:<br>node_network_receive_bytes_total{device=&#8221;eth1&#8243;}<\/p>\n\n\n\n<p>If you want selecting all the time series for devices other than eth1, then just substitute = with != in the query:<br>node_network_receive_bytes_total{device!=&#8221;eth1&#8243;}<\/p>\n\n\n\n<p>How to select time series for devices starting with eth? Just use regular expressions:<br>node_network_receive_bytes_total{device=~&#8221;eth.+&#8221;}<\/p>\n\n\n\n<p>For selecting all the time series for devices not starting with eth, the =~ must be substituted with !~:<br>node_network_receive_bytes_total{device!~&#8221;eth.+&#8221;}<\/p>\n\n\n\n<p>Filtering by multiple labels<br>Label filters may be combined. For instance, the following query would return only time series on the instance node42:9100 for devices starting with eth:<br>node_network_receive_bytes_total{instance=&#8221;node42:9100&#8243;, device=~&#8221;eth.+&#8221;}<\/p>\n\n\n\n<p>Filtering by regexps on metric name<br>Sometimes it is required returning all the time series for multiple metric names. Metric name is just an ordinary label with a special name \u2014 <strong>name<\/strong>. So filtering by multiple metric names may be performed by applying regexps on metric names. For instance, the following query returns all the time series with node_network_receive_bytes_total or node_network_transmit_bytes_total metric names:<br>{<strong>name<\/strong>=~&#8221;node_network_(receive|transmit)_bytes_total&#8221;}<\/p>\n\n\n\n<p>Comparing current data with historical data<br>PromQL allows querying historical data and combining \/ comparing it to the current data. Just add offset to the query. For instance, the following query would return week-old data for all the time series with node_network_receive_bytes_total name:<br>node_network_receive_bytes_total offset 7d<\/p>\n\n\n\n<p>If we have two different metrics with the same dimensional labels, we can apply binary operators to them and elements on both sides with the same label set will get matched and propagated to the output. For example, this expression returns the unused memory in MiB for every instance (on a fictional cluster scheduler exposing these metrics about the instances it runs):<br>(instance_memory_limit_bytes &#8211; instance_memory_usage_bytes) \/ 1024 \/ 1024<\/p>\n\n\n\n<p>The same expression, but summed by application, could be written like this:<br>sum by (app, proc) (<br>instance_memory_limit_bytes &#8211; instance_memory_usage_bytes<br>) \/ 1024 \/ 1024<\/p>\n\n\n\n<p>we could get the top 3 CPU users grouped by application (app) and process type (proc) like this:<br>topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))<\/p>\n\n\n\n<p>Assuming this metric contains one time series per running instance, you could count the number of running instances per application like this:<br>count by (app) (instance_cpu_time_ns)<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Reference<\/h1>\n\n\n\n<ul class=\"wp-block-list\"><li>https:\/\/prometheus.io\/docs\/prometheus\/latest\/querying\/examples\/<\/li><li>https:\/\/timber.io\/blog\/promql-for-humans\/<\/li><li>https:\/\/prometheus.io\/docs\/introduction\/first_steps\/<\/li><li>https:\/\/medium.com\/@valyala\/promql-tutorial-for-beginners-9ab455142085<\/li><li>https:\/\/prometheus.io\/docs\/prometheus\/latest\/querying\/basics\/<\/li><li>https:\/\/sbcode.net\/prometheus\/example-queries\/<\/li><li>https:\/\/files.timber.io\/pdfs\/PromQL+Cheatsheet.pdf<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This should return a number of different time series (along with the latest value recorded for each), all with the metric name promhttp_metric_handler_requests_total, but with different labels. These labels designate&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-23894","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=23894"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23894\/revisions"}],"predecessor-version":[{"id":23895,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23894\/revisions\/23895"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=23894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=23894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=23894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}