Prometheus
The Prometheus plugin can be used to retrieve metrics from a configured Prometheus instance.
Configuration
The Prometheus plugin can be used within the hub
or cluster
. To use the Prometheus plugin the following configuration is needed:
Field |
Type |
Description |
Required |
name |
string |
The name of the Prometheus plugin instance. |
Yes |
type |
prometheus |
The type for the Prometheus plugin. |
Yes |
options.address |
string |
Address of the Prometheus instance. |
Yes |
options.username |
string |
Username to access a Prometheus instance via basic authentication. |
No |
options.password |
string |
Password to access a Prometheus instance via basic authentication. |
No |
options.token |
string |
Token to access a Prometheus instance via token based authentication. |
No |
plugins:
- name: prometheus
type: prometheus
options:
address:
username:
password:
token:
Insight Options
Field |
Type |
Description |
Required |
query |
string |
The PromQL query. |
Yes |
Variable Options
Field |
Type |
Description |
Required |
type |
string |
The query type to get the values for the variable. At the moment this must be labelValues |
Yes |
label |
string |
The Prometheus label which should be used to get the values for the variable. |
Yes |
query |
string |
The PromQL query. |
Yes |
Example
variables:
- name: var_pod
label: Pod
includeAllOption: false
plugin:
name: prometheus
type: prometheus
options:
type: labelValues
label: pod
query: container_cpu_usage_seconds_total{namespace="{% .namespace %}", image!="", pod=~"{% .pod %}", container!="POD", container!=""}
Panel Options
The following options can be used for a panel with the Prometheus plugin:
Field |
Type |
Description |
Required |
type |
string |
The type of the chart. Must be sparkline , line , area , bar or table . |
Yes |
unit |
string |
An optional unit for the y axis of the chart. |
No |
stacked |
boolean |
When this is true all time series in the chart will be stacked. |
No |
legend |
string |
The type which should be used for the legend. Currently only table and table-large is supported as legend. If the value is not set, no legend will be shown. |
No |
yAxis |
yAxis |
Set the scale of the y axis. |
No |
mappings |
map |
Specify value mappings for your data. Note: The value must be provided as string (e.g. "1": "Green" ). |
No |
queries |
[]Query |
A list of queries, which are used to get the data for the chart. |
Yes |
columns |
[]Column |
A list of columns, which must be provided, when the type of the chart is table |
No |
yAxis
Field |
Type |
Description |
Required |
min |
auto , min , number |
The minimum value for the y axis. This could be auto , min (minimum value accross all displayed metrics) or a custom number. The default is auto . |
No |
max |
auto , max , number |
The minimum value for the y axis. This could be auto , max (maximum value accross all displayed metrics) or a custom number. The default is auto . |
No |
Query
Field |
Type |
Description |
Required |
query |
string |
The PromQL query. |
Yes |
label |
string |
The label the results. The label can use the value of a variable or a label of the returned time series, e.g. {% .<prometheus-label> %} . If you want to use a Prometheus label make sure that the label name doesn't conflict with a variable name. |
Yes |
Note
In sparkline
charts the label must not be provided. If the label is provided in a sparkline
chart the label will be displayed instead of the current value.
Column
Field |
Type |
Description |
Required |
name |
string |
The name of a column must be a returned label from the specified queries. To get the result of a query the special column value-N , where N is the index of the query. |
Yes |
header |
string |
An optional value for the header of the column. When this is not specified the name will be used as header for the column. |
No |
unit |
string |
An optional unit for the column values. |
No |
mappings |
map |
Specify value mappings for the column. Note: The value must be provided as string (e.g. "1": "Green" ). |
No |
Usage
The following dashboard, shows the CPU and Memory usage of a selected Pod. When this dashboard is used in via a team or application, it is possible to set the namespace and a regular expression to pre select all the Pods. These values are then used to get the names of all Pods and a user can then select the name of a Pod via the var_pod
variable.
---
apiVersion: kobs.io/v1
kind: Dashboard
metadata:
name: resource-usage
namespace: kobs
spec:
description: Resources Usage of Pods
placeholders:
- name: namespace
description: |
The namespace of the application, e.g.
namespace: "<% $.namespace %>"
- name: pod
description: |
A selector for the Pods of the application,
must be a valid PromQL selector, e.g.
pod: "<% $.name %>-.*"
- name: verticalpodautoscaler
description: |
The identifier for the VerticalPodAutoscaler,
must be a valid PromQL selector, e.g.
verticalpodautoscaler: "<% $.name %>"
variables:
- name: var_pod
label: Pod
includeAllOption: false
plugin:
name: prometheus
type: prometheus
options:
type: labelValues
label: pod
query: container_cpu_usage_seconds_total{namespace="{% .namespace %}", image!="", pod=~"{% .pod %}", container!="POD", container!=""}
- name: var_container
label: Container
includeAllOption: true
plugin:
name: prometheus
type: prometheus
options:
type: labelValues
label: container
query: container_cpu_usage_seconds_total{namespace="{% .namespace %}", image!="", pod=~"{% .var_pod %}", container!="POD", container!=""}
rows:
- panels:
- title: CPU Usage
plugin:
type: prometheus
name: prometheus
options:
queries:
- query: >-
sum(rate(container_cpu_usage_seconds_total{namespace="{%
.namespace %}", image!="", pod=~"{% .var_pod %}",
container!="POD", container!="", container=~"{%
.var_container %}"}[2m]))
type: sparkline
unit: Cores
h: 4
w: 4
x: 0
'y': 0
- title: Memory Usage
plugin:
type: prometheus
name: prometheus
options:
queries:
- query: >-
sum(container_memory_working_set_bytes{namespace="{%
.namespace %}", pod=~"{% .var_pod %}", container!="POD",
container!="", container=~"{% .var_container %}"}) /
1024 / 1024
type: sparkline
unit: MiB
h: 4
w: 4
x: 4
'y': 0
- title: Restarts
plugin:
type: prometheus
name: prometheus
options:
queries:
- query: >-
kube_pod_container_status_restarts_total{namespace="{%
.namespace %}", pod=~"{% .var_pod %}", container=~"{%
.var_container %}"}
type: sparkline
h: 4
w: 4
x: 8
'y': 0
- panels:
- title: CPU Usage
plugin:
type: prometheus
name: prometheus
options:
legend: table
queries:
- label: 'Usage: {% .container %}'
query: >-
sum(rate(container_cpu_usage_seconds_total{namespace="{%
.namespace %}", image!="", pod=~"{% .var_pod %}",
container!="POD", container!="", container=~"{%
.var_container %}"}[2m])) by (container)
- label: 'Request: {% .container %}'
query: >-
sum(kube_pod_container_resource_requests{namespace="{%
.namespace %}", resource="cpu", pod=~"{% .var_pod %}",
container!="POD", container!="", container=~"{%
.var_container %}"}) by (container)
type: line
unit: Cores
h: 9
w: 6
x: 0
'y': 0
- title: Memory Usage
plugin:
type: prometheus
name: prometheus
options:
legend: table
queries:
- label: 'Usage: {% .container %}'
query: >-
sum(container_memory_working_set_bytes{namespace="{%
.namespace %}", pod=~"{% .var_pod %}", container!="POD",
container!="", container=~"{% .var_container %}"}) by
(container) / 1024 / 1024
- label: 'Request: {% .container %}'
query: >-
sum(kube_pod_container_resource_requests{namespace="{%
.namespace %}", resource="memory", pod=~"{% .var_pod
%}", container!="POD", container!="", container=~"{%
.var_container %}"}) by (container) / 1024 / 1024
- label: 'Limits: {% .container %}'
query: >-
sum(kube_pod_container_resource_limits{namespace="{%
.namespace %}", resource="memory", pod=~"{% .var_pod
%}", container!="POD", container!="", container=~"{%
.var_container %}"}) by (container) / 1024 / 1024
type: line
unit: MiB
h: 9
w: 6
x: 6
'y': 0
- panels:
- title: Ressource Recommendations
plugin:
type: prometheus
name: prometheus
options:
columns:
- name: target_name
title: Target
- name: container
title: Container
- name: value-1
title: Recommended CPU
unit: m
- name: value-2
title: Recommended Memory
unit: Mi
queries:
- label: '{% .target_name %} - {% .container %}'
query: >-
max(max_over_time(kube_verticalpodautoscaler_status_recommendation_containerrecommendations_target{namespace="{%
.namespace %}", container!="POD", container!="", container=~"{% .var_container %}",
resource="cpu", verticalpodautoscaler=~"{%
.verticalpodautoscaler %}"}[7d]) * 1000) by
(target_name, container)
- label: '{% .target_name %} - {% .container %}'
query: >-
max(round(max_over_time(kube_verticalpodautoscaler_status_recommendation_containerrecommendations_target{namespace="{%
.namespace %}", container!="POD", container!="", container=~"{% .var_container %}",
resource="memory", verticalpodautoscaler=~"{%
.verticalpodautoscaler %}"}[7d]) / 1000 / 1000)) by
(target_name, container)
type: table
h: 9
w: 12
x: 0
'y': 0
autoHeight: true
description: ''
if: '"{% .verticalpodautoscaler %}" !== ""'
- title: Network
panels:
- title: Bandwidth
plugin:
type: prometheus
name: prometheus
options:
queries:
- label: Received
query: >-
sum(irate(container_network_receive_bytes_total{namespace="{%
.namespace %}", pod="{% .var_pod %}"}[2m])) by (pod)
- label: Transmitted
query: >-
-sum(irate(container_network_transmit_bytes_total{namespace="{%
.namespace %}", pod="{% .var_pod %}"}[2m])) by (pod)
type: area
unit: bytes/s
h: 9
w: 12
x: 0
'y': 0
- title: Rate of Packets
plugin:
type: prometheus
name: prometheus
options:
queries:
- label: Received
query: >-
sum(irate(container_network_receive_packets_total{namespace=~"{%
.namespace %}", pod=~"{% .var_pod %}"}[2m])) by (pod)
- label: Transmitted
query: >-
-sum(irate(container_network_transmit_packets_total{namespace=~"{%
.namespace %}", pod=~"{% .var_pod %}"}[2m])) by (pod)
type: area
unit: p/s
h: 9
w: 6
x: 0
'y': 9
- title: Rate of Packets Dropped
plugin:
type: prometheus
name: prometheus
options:
queries:
- label: Received
query: >-
sum(irate(container_network_receive_packets_dropped_total{namespace=~"{%
.namespace %}", pod=~"{% .var_pod %}"}[2m])) by (pod)
- label: Transmitted
query: >-
-sum(irate(container_network_transmit_packets_dropped_total{namespace=~"{%
.namespace %}", pod=~"{% .var_pod %}"}[2m])) by (pod)
type: area
unit: p/s
h: 9
w: 6
x: 6
'y': 9