diff --git a/assets/grafana/statefulset.dashboard.py b/assets/grafana/statefulset.dashboard.py new file mode 100644 index 0000000000000000000000000000000000000000..fb01ce17b3afb928bb2712db952a8ca3958b3697 --- /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='Stateful Set', + 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': 'Stateful Set', + '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), + ), + ), + ] + ), + ], +)