diff --git a/assets/grafana/statefulset.dashboard.py b/assets/grafana/statefulset.dashboard.py
new file mode 100644
index 0000000000000000000000000000000000000000..a28d70fdf9f5ffb4b6eeb052d34fe19dc62e352f
--- /dev/null
+++ b/assets/grafana/statefulset.dashboard.py
@@ -0,0 +1,440 @@
+import sys
+import os.path
+sys.path.insert(0, os.path.dirname(__file__))
+from _grafanalib import *
+
+
+dashboard = Dashboard(
+    title='StatefulSet',
+    version=1,
+    graphTooltip=1,
+    time=Time(start='now-6h'),
+    templating=Templating(list=[
+        {
+            'allValue': '.*',
+            'current': {},
+            'datasource': '${DS_PROMETHEUS}',
+            'hide': 0,
+            'includeAll': False,
+            'label': 'Namespace',
+            'multi': False,
+            'name': 'statefulset_namespace',
+            'options': [],
+            'query': 'label_values(kube_statefulset_metadata_generation, '
+            'namespace)',
+            'refresh': 1,
+            'regex': '',
+            'sort': 0,
+            'tagValuesQuery': None,
+            'tags': [],
+            'tagsQuery': '',
+            'type': 'query',
+            'useTags': False,
+        },
+        {
+            'allValue': None,
+            'current': {},
+            'datasource': '${DS_PROMETHEUS}',
+            'hide': 0,
+            'includeAll': False,
+            'label': 'StatefulSet',
+            'multi': False,
+            'name': 'statefulset_name',
+            'options': [],
+            'query': 'label_values(kube_statefulset_metadata_generation'
+            '{namespace="$statefulset_namespace"}, statefulset)',
+            'refresh': 1,
+            'regex': '',
+            'sort': 0,
+            'tagValuesQuery': '',
+            'tags': [],
+            'tagsQuery': 'statefulset',
+            'type': 'query',
+            'useTags': False,
+        },
+    ]),
+    rows=[
+        Row(panels=[
+            SingleStat(
+                title='CPU',
+                id=8,
+                gauge=Gauge(show=False),
+                postfix='cores',
+                span=4,
+                valueFontSize='110%',
+                mappingType=1,
+                mappingTypes=[
+                    {
+                        'name': 'value to text',
+                        'value': 1,
+                    },
+                    {
+                        'name': 'range to text',
+                        'value': 2,
+                    },
+                ],
+                valueMaps=[
+                    {
+                        'op': '=',
+                        'text': 'N/A',
+                        'value': 'null',
+                    },
+                ],
+                rangeMaps=[
+                    {
+                        'from': 'null',
+                        'text': 'N/A',
+                        'to': 'null',
+                    },
+                ],
+                colors=[
+                    (245, 54, 54, 0.9),
+                    (237, 129, 40, 0.89),
+                    (50, 172, 45, 0.97),
+                ],
+                sparkline=SparkLine(
+                    fillColor=(31, 118, 189, 0.18),
+                    lineColor=(31, 120, 193),
+                    show=True,
+                ),
+                targets=[
+                    {
+                        'expr': 'sum(rate(container_cpu_usage_seconds_total'
+                        '{namespace=\"$statefulset_namespace\",pod_name=~\"'
+                        '$statefulset_name.*\"}[3m]))',
+                    },
+                ],
+            ),
+            SingleStat(
+                title='Memory',
+                id=9,
+                postfix='GB',
+                prefixFontSize='80%',
+                gauge=Gauge(show=False),
+                span=4,
+                valueFontSize='110%',
+                mappingType=1,
+                mappingTypes=[
+                    {
+                        'name': 'value to text',
+                        'value': 1,
+                    },
+                    {
+                        'name': 'range to text',
+                        'value': 2,
+                    },
+                ],
+                sparkline=SparkLine(
+                    fillColor=(31, 118, 189, 0.18),
+                    lineColor=(31, 120, 193),
+                    show=True,
+                ),
+                valueMaps=[
+                    {
+                        'op': '=',
+                        'text': 'N/A',
+                        'value': 'null',
+                    },
+                ],
+                rangeMaps=[
+                    {
+                        'from': 'null',
+                        'text': 'N/A',
+                        'to': 'null',
+                    },
+                ],
+                colors=[
+                    (245, 54, 54, 0.9),
+                    (237, 129, 40, 0.89),
+                    (50, 172, 45, 0.97),
+                ],
+                targets=[
+                    {
+                        'expr': 'sum(container_memory_usage_bytes{namespace='
+                        '\"$statefulset_namespace\",pod_name=~\"$'
+                        'statefulset_name.*\"}) / 1024^3',
+                        'intervalFactor': 2,
+                        'refId': 'A',
+                        'step': 600,
+                    },
+                ],
+            ),
+            SingleStat(
+                title='Network',
+                format='Bps',
+                gauge=Gauge(thresholdMarkers=False),
+                id=7,
+                postfix='',
+                span=4,
+                mappingType=1,
+                mappingTypes=[
+                    {
+                        'name': 'value to text',
+                        'value': 1,
+                    },
+                    {
+                        'name': 'range to text',
+                        'value': 2,
+                    },
+                ],
+                sparkline=SparkLine(
+                    fillColor=(31, 118, 189, 0.18),
+                    lineColor=(31, 120, 193),
+                    show=True,
+                ),
+                valueMaps=[
+                    {
+                        'op': '=',
+                        'text': 'N/A',
+                        'value': 'null',
+                    },
+                ],
+                rangeMaps=[
+                    {
+                        'from': 'null',
+                        'text': 'N/A',
+                        'to': 'null',
+                    },
+                ],
+                colors=[
+                    (245, 54, 54, 0.9),
+                    (237, 129, 40, 0.89),
+                    (50, 172, 45, 0.97),
+                ],
+                targets=[
+                    {
+                        'expr': 'sum(rate(container_network_transmit_'
+                        'bytes_total'
+                        '{namespace=\"$statefulset_namespace\",pod_name=~\"'
+                        '$statefulset_name.*\"}[3m])) + '
+                        'sum(rate(container_network_receive_bytes_total'
+                        '{namespace=\"$statefulset_namespace\",pod_name=~'
+                        '\"$statefulset_name.*\"}[3m]))',
+                    },
+                ],
+            ),
+        ],
+            height=200,
+        ),
+        Row(
+            height=100, panels=[
+                SingleStat(
+                    title='Desired Replicas',
+                    id=5,
+                    mappingType=1,
+                    mappingTypes=[
+                        {
+                            'name': 'value to text',
+                            'value': 1,
+                        },
+                        {
+                            'name': 'range to text',
+                            'value': 2,
+                        },
+                    ],
+                    span=3,
+                    colors=[
+                        (245, 54, 54, 0.9),
+                        (237, 129, 40, 0.89),
+                        (50, 172, 45, 0.97),
+                    ],
+                    targets=[
+                        {
+                            'metric': 'kube_statefulset_replicas',
+                            'expr': 'max(kube_statefulset_replicas'
+                            '{statefulset="$statefulset_name",namespace='
+                            '"$statefulset_namespace"}) without '
+                            '(instance, pod)',
+                        },
+                    ],
+                    valueMaps=[
+                        {
+                            'op': '=',
+                            'text': 'N/A',
+                            'value': 'null',
+                        },
+                    ],
+                    gauge=Gauge(thresholdMarkers=False, show=False),
+                    rangeMaps=[
+                        {
+                            'from': 'null',
+                            'text': 'N/A',
+                            'to': 'null',
+                        },
+                    ],
+                ),
+                SingleStat(
+                    title='Available Replicas',
+                    colors=[
+                        (245, 54, 54, 0.9),
+                        (237, 129, 40, 0.89),
+                        (50, 172, 45, 0.97),
+                    ],
+                    gauge=Gauge(show=False),
+                    id=6,
+                    mappingType=1,
+                    mappingTypes=[
+                        {
+                            'name': 'value to text',
+                            'value': 1,
+                        },
+                        {
+                            'name': 'range to text',
+                            'value': 2,
+                        },
+                    ],
+                    targets=[
+                        {
+                            'expr': 'min(kube_statefulset_status_replicas'
+                            '{statefulset=\"$statefulset_name\",'
+                            'namespace=\"$statefulset_namespace\"}) without '
+                            '(instance, pod)',
+                        },
+                    ],
+                    rangeMaps=[
+                        {
+                            'from': 'null',
+                            'text': 'N/A',
+                            'to': 'null',
+                        },
+                    ],
+                    span=3,
+                    sparkline=SparkLine(),
+                    valueMaps=[
+                        {
+                            'op': '=',
+                            'text': 'N/A',
+                            'value': 'null',
+                        }
+                    ],
+                ),
+                SingleStat(
+                    title='Observed Generation',
+                    colors=[
+                        (245, 54, 54, 0.9),
+                        (237, 129, 40, 0.89),
+                        (50, 172, 45, 0.97),
+                    ],
+                    gauge=Gauge(),
+                    id=3,
+                    mappingType=1,
+                    mappingTypes=[
+                        {
+                            'name': 'value to text',
+                            'value': 1,
+                        },
+                        {
+                            'name': 'range to text',
+                            'value': 2,
+                        },
+                    ],
+                    targets=[
+                        {
+                            'expr': 'max(kube_statefulset_status_observed_'
+                            'generation{statefulset=\"$statefulset_name\",'
+                            'namespace=\"$statefulset_namespace\"}) without '
+                            '(instance, pod)',
+                        },
+                    ],
+                    rangeMaps=[
+                        {
+                            'from': "null",
+                            'text': 'N/A',
+                            'to': 'null',
+                        },
+                    ],
+                    span=3,
+                    sparkline=SparkLine(),
+                    valueMaps=[
+                        {
+                            'op': '=',
+                            'text': 'N/A',
+                            'value': 'null',
+                        }
+                    ],
+                ),
+                SingleStat(
+                    title='Metadata Generation',
+                    colors=[
+                        (245, 54, 54, 0.9),
+                        (237, 129, 40, 0.89),
+                        (50, 172, 45, 0.97),
+                    ],
+                    gauge=Gauge(show=False),
+                    id=2,
+                    mappingType=1,
+                    mappingTypes=[
+                        {
+                            'name': 'value to text',
+                            'value': 1,
+                        },
+                        {
+                            'name': 'range to text',
+                            'value': 2,
+                        },
+                    ],
+                    targets=[
+                        {
+                            'expr': 'max(kube_statefulset_metadata_generation'
+                            '{statefulset=\"$statefulset_name\",namespace=\"'
+                            '$statefulset_namespace\"}) without (instance, '
+                            'pod)',
+                        },
+                    ],
+                    rangeMaps=[
+                        {
+                            'from': 'null',
+                            'text': 'N/A',
+                            'to': 'null',
+                        },
+                    ],
+                    span=3,
+                    sparkline=SparkLine(),
+                    valueMaps=[
+                        {
+                            'op': '=',
+                            'text': 'N/A',
+                            'value': 'null',
+                        },
+                    ],
+                ),
+            ],
+        ),
+        Row(
+            height=350, panels=[
+                Graph(
+                    title='Replicas',
+                    dashLength=10,
+                    dashes=False,
+                    id=1,
+                    spaceLength=10,
+                    targets=[
+                        {
+                            'expr': 'min(kube_statefulset_status_replicas'
+                            '{statefulset=\"$statefulset_name\",'
+                            'namespace=\"$statefulset_namespace\"}) without '
+                            '(instance, pod)',
+                            'legendFormat': 'available',
+                            'refId': 'B',
+                            'step': 30,
+                        },
+                        {
+                            'expr': 'max(kube_statefulset_replicas'
+                            '{statefulset=\"$statefulset_name\",namespace=\"'
+                            '$statefulset_namespace\"}) without '
+                            '(instance, pod)',
+                            'legendFormat': 'desired',
+                            'refId': 'E',
+                            'step': 30,
+                        }
+                    ],
+                    xAxis=XAxis(mode='time'),
+                    yAxes=YAxes(
+                        YAxis(min=None),
+                        YAxis(format='short', min=None, show=False),
+                    ),
+                ),
+            ]
+        ),
+    ],
+)
diff --git a/manifests/grafana/grafana-dashboards.yaml b/manifests/grafana/grafana-dashboards.yaml
index e76a1103ef8374b9c64471b1c2c8b65a57094d42..aff751da690dc2f9beac8273366bf8721325574c 100644
--- a/manifests/grafana/grafana-dashboards.yaml
+++ b/manifests/grafana/grafana-dashboards.yaml
@@ -5559,6 +5559,726 @@ data:
       ],
       "overwrite": true
     }
+  statefulset-dashboard.json: |+
+    {
+      "dashboard":
+    {
+      "__inputs": [
+        {
+          "description": "",
+          "label": "prometheus",
+          "name": "DS_PROMETHEUS",
+          "pluginId": "prometheus",
+          "pluginName": "Prometheus",
+          "type": "datasource"
+        }
+      ],
+      "annotations": {
+        "list": []
+      },
+      "editable": true,
+      "graphTooltip": 1,
+      "hideControls": false,
+      "links": [],
+      "rows": [
+        {
+          "collapse": false,
+          "height": "200px",
+          "panels": [
+            {
+              "colorBackground": false,
+              "colorValue": false,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "format": "none",
+              "gauge": {
+                "maxValue": 100,
+                "minValue": 0,
+                "show": false,
+                "thresholdLabels": false,
+                "thresholdMarkers": true
+              },
+              "id": 8,
+              "links": [],
+              "mappingType": 1,
+              "mappingTypes": [
+                {
+                  "name": "value to text",
+                  "value": 1
+                },
+                {
+                  "name": "range to text",
+                  "value": 2
+                }
+              ],
+              "maxDataPoints": 100,
+              "nullPointMode": "connected",
+              "postfix": "cores",
+              "postfixFontSize": "50%",
+              "prefix": "",
+              "prefixFontSize": "50%",
+              "rangeMaps": [
+                {
+                  "from": "null",
+                  "text": "N/A",
+                  "to": "null"
+                }
+              ],
+              "span": 4,
+              "sparkline": {
+                "fillColor": "rgba(31, 118, 189, 0.18)",
+                "full": false,
+                "lineColor": "rgb(31, 120, 193)",
+                "show": true
+              },
+              "targets": [
+                {
+                  "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$statefulset_namespace\",pod_name=~\"$statefulset_name.*\"}[3m]))",
+                  "intervalFactor": 2,
+                  "refId": "A",
+                  "step": 600
+                }
+              ],
+              "title": "CPU",
+              "type": "singlestat",
+              "valueFontSize": "110%",
+              "valueMaps": [
+                {
+                  "op": "=",
+                  "text": "N/A",
+                  "value": "null"
+                }
+              ],
+              "valueName": "avg"
+            },
+            {
+              "colorBackground": false,
+              "colorValue": false,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "format": "none",
+              "gauge": {
+                "maxValue": 100,
+                "minValue": 0,
+                "show": false,
+                "thresholdLabels": false,
+                "thresholdMarkers": true
+              },
+              "id": 9,
+              "links": [],
+              "mappingType": 1,
+              "mappingTypes": [
+                {
+                  "name": "value to text",
+                  "value": 1
+                },
+                {
+                  "name": "range to text",
+                  "value": 2
+                }
+              ],
+              "maxDataPoints": 100,
+              "nullPointMode": "connected",
+              "postfix": "GB",
+              "postfixFontSize": "50%",
+              "prefix": "",
+              "prefixFontSize": "80%",
+              "rangeMaps": [
+                {
+                  "from": "null",
+                  "text": "N/A",
+                  "to": "null"
+                }
+              ],
+              "span": 4,
+              "sparkline": {
+                "fillColor": "rgba(31, 118, 189, 0.18)",
+                "full": false,
+                "lineColor": "rgb(31, 120, 193)",
+                "show": true
+              },
+              "targets": [
+                {
+                  "expr": "sum(container_memory_usage_bytes{namespace=\"$statefulset_namespace\",pod_name=~\"$statefulset_name.*\"}) / 1024^3",
+                  "intervalFactor": 2,
+                  "refId": "A",
+                  "step": 600
+                }
+              ],
+              "title": "Memory",
+              "type": "singlestat",
+              "valueFontSize": "110%",
+              "valueMaps": [
+                {
+                  "op": "=",
+                  "text": "N/A",
+                  "value": "null"
+                }
+              ],
+              "valueName": "avg"
+            },
+            {
+              "colorBackground": false,
+              "colorValue": false,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "format": "Bps",
+              "gauge": {
+                "maxValue": 100,
+                "minValue": 0,
+                "show": false,
+                "thresholdLabels": false,
+                "thresholdMarkers": false
+              },
+              "id": 7,
+              "links": [],
+              "mappingType": 1,
+              "mappingTypes": [
+                {
+                  "name": "value to text",
+                  "value": 1
+                },
+                {
+                  "name": "range to text",
+                  "value": 2
+                }
+              ],
+              "maxDataPoints": 100,
+              "nullPointMode": "connected",
+              "postfix": "",
+              "postfixFontSize": "50%",
+              "prefix": "",
+              "prefixFontSize": "50%",
+              "rangeMaps": [
+                {
+                  "from": "null",
+                  "text": "N/A",
+                  "to": "null"
+                }
+              ],
+              "span": 4,
+              "sparkline": {
+                "fillColor": "rgba(31, 118, 189, 0.18)",
+                "full": false,
+                "lineColor": "rgb(31, 120, 193)",
+                "show": true
+              },
+              "targets": [
+                {
+                  "expr": "sum(rate(container_network_transmit_bytes_total{namespace=\"$statefulset_namespace\",pod_name=~\"$statefulset_name.*\"}[3m])) + sum(rate(container_network_receive_bytes_total{namespace=\"$statefulset_namespace\",pod_name=~\"$statefulset_name.*\"}[3m]))",
+                  "intervalFactor": 2,
+                  "refId": "A",
+                  "step": 600
+                }
+              ],
+              "title": "Network",
+              "type": "singlestat",
+              "valueFontSize": "80%",
+              "valueMaps": [
+                {
+                  "op": "=",
+                  "text": "N/A",
+                  "value": "null"
+                }
+              ],
+              "valueName": "avg"
+            }
+          ],
+          "showTitle": false,
+          "title": "Dashboard Row",
+          "titleSize": "h6"
+        },
+        {
+          "collapse": false,
+          "height": "100px",
+          "panels": [
+            {
+              "colorBackground": false,
+              "colorValue": false,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "format": "none",
+              "gauge": {
+                "maxValue": 100,
+                "minValue": 0,
+                "show": false,
+                "thresholdLabels": false,
+                "thresholdMarkers": false
+              },
+              "id": 5,
+              "links": [],
+              "mappingType": 1,
+              "mappingTypes": [
+                {
+                  "name": "value to text",
+                  "value": 1
+                },
+                {
+                  "name": "range to text",
+                  "value": 2
+                }
+              ],
+              "maxDataPoints": 100,
+              "nullPointMode": "connected",
+              "postfixFontSize": "50%",
+              "prefix": "",
+              "prefixFontSize": "50%",
+              "rangeMaps": [
+                {
+                  "from": "null",
+                  "text": "N/A",
+                  "to": "null"
+                }
+              ],
+              "span": 3,
+              "sparkline": {
+                "fillColor": "rgba(31, 118, 189, 0.18)",
+                "full": false,
+                "lineColor": "rgb(31, 120, 193)",
+                "show": false
+              },
+              "targets": [
+                {
+                  "expr": "max(kube_statefulset_replicas{statefulset=\"$statefulset_name\",namespace=\"$statefulset_namespace\"}) without (instance, pod)",
+                  "intervalFactor": 2,
+                  "metric": "kube_statefulset_replicas",
+                  "refId": "A",
+                  "step": 600
+                }
+              ],
+              "title": "Desired Replicas",
+              "type": "singlestat",
+              "valueFontSize": "80%",
+              "valueMaps": [
+                {
+                  "op": "=",
+                  "text": "N/A",
+                  "value": "null"
+                }
+              ],
+              "valueName": "avg"
+            },
+            {
+              "colorBackground": false,
+              "colorValue": false,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "format": "none",
+              "gauge": {
+                "maxValue": 100,
+                "minValue": 0,
+                "show": false,
+                "thresholdLabels": false,
+                "thresholdMarkers": true
+              },
+              "id": 6,
+              "links": [],
+              "mappingType": 1,
+              "mappingTypes": [
+                {
+                  "name": "value to text",
+                  "value": 1
+                },
+                {
+                  "name": "range to text",
+                  "value": 2
+                }
+              ],
+              "maxDataPoints": 100,
+              "nullPointMode": "connected",
+              "postfixFontSize": "50%",
+              "prefix": "",
+              "prefixFontSize": "50%",
+              "rangeMaps": [
+                {
+                  "from": "null",
+                  "text": "N/A",
+                  "to": "null"
+                }
+              ],
+              "span": 3,
+              "sparkline": {
+                "fillColor": "rgba(31, 118, 189, 0.18)",
+                "full": false,
+                "lineColor": "rgb(31, 120, 193)",
+                "show": false
+              },
+              "targets": [
+                {
+                  "expr": "min(kube_statefulset_status_replicas{statefulset=\"$statefulset_name\",namespace=\"$statefulset_namespace\"}) without (instance, pod)",
+                  "intervalFactor": 2,
+                  "refId": "A",
+                  "step": 600
+                }
+              ],
+              "title": "Available Replicas",
+              "type": "singlestat",
+              "valueFontSize": "80%",
+              "valueMaps": [
+                {
+                  "op": "=",
+                  "text": "N/A",
+                  "value": "null"
+                }
+              ],
+              "valueName": "avg"
+            },
+            {
+              "colorBackground": false,
+              "colorValue": false,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "format": "none",
+              "gauge": {
+                "maxValue": 100,
+                "minValue": 0,
+                "show": false,
+                "thresholdLabels": false,
+                "thresholdMarkers": true
+              },
+              "id": 3,
+              "links": [],
+              "mappingType": 1,
+              "mappingTypes": [
+                {
+                  "name": "value to text",
+                  "value": 1
+                },
+                {
+                  "name": "range to text",
+                  "value": 2
+                }
+              ],
+              "maxDataPoints": 100,
+              "nullPointMode": "connected",
+              "postfixFontSize": "50%",
+              "prefix": "",
+              "prefixFontSize": "50%",
+              "rangeMaps": [
+                {
+                  "from": "null",
+                  "text": "N/A",
+                  "to": "null"
+                }
+              ],
+              "span": 3,
+              "sparkline": {
+                "fillColor": "rgba(31, 118, 189, 0.18)",
+                "full": false,
+                "lineColor": "rgb(31, 120, 193)",
+                "show": false
+              },
+              "targets": [
+                {
+                  "expr": "max(kube_statefulset_status_observed_generation{statefulset=\"$statefulset_name\",namespace=\"$statefulset_namespace\"}) without (instance, pod)",
+                  "intervalFactor": 2,
+                  "refId": "A",
+                  "step": 600
+                }
+              ],
+              "title": "Observed Generation",
+              "type": "singlestat",
+              "valueFontSize": "80%",
+              "valueMaps": [
+                {
+                  "op": "=",
+                  "text": "N/A",
+                  "value": "null"
+                }
+              ],
+              "valueName": "avg"
+            },
+            {
+              "colorBackground": false,
+              "colorValue": false,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "format": "none",
+              "gauge": {
+                "maxValue": 100,
+                "minValue": 0,
+                "show": false,
+                "thresholdLabels": false,
+                "thresholdMarkers": true
+              },
+              "id": 2,
+              "links": [],
+              "mappingType": 1,
+              "mappingTypes": [
+                {
+                  "name": "value to text",
+                  "value": 1
+                },
+                {
+                  "name": "range to text",
+                  "value": 2
+                }
+              ],
+              "maxDataPoints": 100,
+              "nullPointMode": "connected",
+              "postfixFontSize": "50%",
+              "prefix": "",
+              "prefixFontSize": "50%",
+              "rangeMaps": [
+                {
+                  "from": "null",
+                  "text": "N/A",
+                  "to": "null"
+                }
+              ],
+              "span": 3,
+              "sparkline": {
+                "fillColor": "rgba(31, 118, 189, 0.18)",
+                "full": false,
+                "lineColor": "rgb(31, 120, 193)",
+                "show": false
+              },
+              "targets": [
+                {
+                  "expr": "max(kube_statefulset_metadata_generation{statefulset=\"$statefulset_name\",namespace=\"$statefulset_namespace\"}) without (instance, pod)",
+                  "intervalFactor": 2,
+                  "refId": "A",
+                  "step": 600
+                }
+              ],
+              "title": "Metadata Generation",
+              "type": "singlestat",
+              "valueFontSize": "80%",
+              "valueMaps": [
+                {
+                  "op": "=",
+                  "text": "N/A",
+                  "value": "null"
+                }
+              ],
+              "valueName": "avg"
+            }
+          ],
+          "showTitle": false,
+          "title": "Dashboard Row",
+          "titleSize": "h6"
+        },
+        {
+          "collapse": false,
+          "height": "350px",
+          "panels": [
+            {
+              "aliasColors": {},
+              "bars": false,
+              "dashLength": 10,
+              "dashes": false,
+              "datasource": "${DS_PROMETHEUS}",
+              "editable": true,
+              "error": false,
+              "fill": 1,
+              "grid": {
+                "threshold1Color": "rgba(216, 200, 27, 0.27)",
+                "threshold2Color": "rgba(234, 112, 112, 0.22)"
+              },
+              "id": 1,
+              "isNew": true,
+              "legend": {
+                "alignAsTable": false,
+                "avg": false,
+                "current": false,
+                "hideEmpty": false,
+                "hideZero": false,
+                "max": false,
+                "min": false,
+                "rightSide": false,
+                "show": true,
+                "total": false
+              },
+              "lines": true,
+              "linewidth": 2,
+              "links": [],
+              "nullPointMode": "connected",
+              "percentage": false,
+              "pointradius": 5,
+              "points": false,
+              "renderer": "flot",
+              "seriesOverrides": [],
+              "spaceLength": 10,
+              "span": 12,
+              "stack": false,
+              "steppedLine": false,
+              "targets": [
+                {
+                  "expr": "min(kube_statefulset_status_replicas{statefulset=\"$statefulset_name\",namespace=\"$statefulset_namespace\"}) without (instance, pod)",
+                  "intervalFactor": 2,
+                  "legendFormat": "available",
+                  "refId": "B",
+                  "step": 30
+                },
+                {
+                  "expr": "max(kube_statefulset_replicas{statefulset=\"$statefulset_name\",namespace=\"$statefulset_namespace\"}) without (instance, pod)",
+                  "intervalFactor": 2,
+                  "legendFormat": "desired",
+                  "refId": "E",
+                  "step": 30
+                }
+              ],
+              "title": "Replicas",
+              "tooltip": {
+                "msResolution": true,
+                "shared": true,
+                "sort": 0,
+                "value_type": "cumulative"
+              },
+              "type": "graph",
+              "xaxis": {
+                "mode": "time",
+                "show": true,
+                "values": []
+              },
+              "yaxes": [
+                {
+                  "format": "none",
+                  "label": "",
+                  "logBase": 1,
+                  "show": true
+                },
+                {
+                  "format": "short",
+                  "label": "",
+                  "logBase": 1,
+                  "show": false
+                }
+              ]
+            }
+          ],
+          "showTitle": false,
+          "title": "Dashboard Row",
+          "titleSize": "h6"
+        }
+      ],
+      "schemaVersion": 14,
+      "sharedCrosshair": false,
+      "style": "dark",
+      "tags": [],
+      "templating": {
+        "list": [
+          {
+            "allValue": ".*",
+            "current": {},
+            "datasource": "${DS_PROMETHEUS}",
+            "hide": 0,
+            "includeAll": false,
+            "label": "Namespace",
+            "multi": false,
+            "name": "statefulset_namespace",
+            "options": [],
+            "query": "label_values(kube_statefulset_metadata_generation, namespace)",
+            "refresh": 1,
+            "regex": "",
+            "sort": 0,
+            "tagValuesQuery": null,
+            "tags": [],
+            "tagsQuery": "",
+            "type": "query",
+            "useTags": false
+          },
+          {
+            "allValue": null,
+            "current": {},
+            "datasource": "${DS_PROMETHEUS}",
+            "hide": 0,
+            "includeAll": false,
+            "label": "StatefulSet",
+            "multi": false,
+            "name": "statefulset_name",
+            "options": [],
+            "query": "label_values(kube_statefulset_metadata_generation{namespace=\"$statefulset_namespace\"}, statefulset)",
+            "refresh": 1,
+            "regex": "",
+            "sort": 0,
+            "tagValuesQuery": "",
+            "tags": [],
+            "tagsQuery": "statefulset",
+            "type": "query",
+            "useTags": false
+          }
+        ]
+      },
+      "time": {
+        "from": "now-6h",
+        "to": "now"
+      },
+      "timepicker": {
+        "refresh_intervals": [
+          "5s",
+          "10s",
+          "30s",
+          "1m",
+          "5m",
+          "15m",
+          "30m",
+          "1h",
+          "2h",
+          "1d"
+        ],
+        "time_options": [
+          "5m",
+          "15m",
+          "1h",
+          "6h",
+          "12h",
+          "24h",
+          "2d",
+          "7d",
+          "30d"
+        ]
+      },
+      "timezone": "browser",
+      "title": "StatefulSet",
+      "version": 1
+    }
+    ,
+      "inputs": [
+        {
+          "name": "DS_PROMETHEUS",
+          "pluginId": "prometheus",
+          "type": "datasource",
+          "value": "prometheus"
+        }
+      ],
+      "overwrite": true
+    }
   prometheus-datasource.json: |+
     {
         "access": "proxy",