diff --git a/bbb-exporter/collector.py b/bbb-exporter/collector.py index 7bf2ce2..1150ff9 100644 --- a/bbb-exporter/collector.py +++ b/bbb-exporter/collector.py @@ -3,12 +3,13 @@ from functools import reduce from collections import defaultdict -from prometheus_client.metrics_core import GaugeMetricFamily, HistogramMetricFamily, GaugeHistogramMetricFamily +from prometheus_client.metrics_core import GaugeMetricFamily, HistogramMetricFamily, GaugeHistogramMetricFamily, \ + CounterMetricFamily from prometheus_client.utils import INF import api import settings -from helpers import execution_duration, HistogramBucketHelper +from helpers import execution_duration, HistogramBucketHelper, str_integer_to_int class BigBlueButtonCollector: @@ -28,6 +29,12 @@ class BigBlueButtonCollector: recordings_metrics_base_dir = settings.recordings_metrics_base_dir recordings_metrics_from_disk = settings.RECORDINGS_METRICS_READ_FROM_DISK + last_scrape_meetings = set([]) + unique_meetings_count = 0 + + last_scrape_breakout_rooms = set([]) + unique_breakout_rooms_count = 0 + def set_room_participants_buckets(self, buckets): assert type(buckets) == list assert len(buckets) != 0 @@ -103,6 +110,9 @@ def collect(self): yield self.metric_voice_participants_histogram(meetings) yield self.metric_video_participants_histogram(meetings) + yield self.metric_unique_meetings_count(meetings) + yield self.metric_unique_breakout_rooms_count(meetings) + bbb_exporter = GaugeMetricFamily("bbb_exporter", "BigBlueButton Exporter version", labels=["version"]) bbb_exporter.add_metric([settings.VERSION], 1) yield bbb_exporter @@ -123,14 +133,14 @@ def metric_meetings(self, meetings): return metric def metric_participants(self, meetings): - no_participants = reduce(lambda total, meeting: total + int(meeting['participantCount']), meetings, 0) + no_participants = reduce(lambda total, meeting: total + str_integer_to_int(meeting['participantCount']), meetings, 0) metric = GaugeMetricFamily('bbb_meetings_participants', "Total number of participants in all BigBlueButton meetings") metric.add_metric([], no_participants) return metric def metric_meetings_listeners(self, meetings): - no_listeners = reduce(lambda total, meeting: total + int(meeting['listenerCount']), meetings, 0) + no_listeners = reduce(lambda total, meeting: total + str_integer_to_int(meeting['listenerCount']), meetings, 0) metric = GaugeMetricFamily('bbb_meetings_listeners', "Total number of listeners in all BigBlueButton meetings") metric.add_metric([], no_listeners) @@ -146,14 +156,14 @@ def metric_meetings_participants_origin(self, meetings): return metric def metric_meetings_voice_participants(self, meetings): - no_voice_participants = reduce(lambda total, meeting: total + int(meeting['voiceParticipantCount']), meetings, 0) + no_voice_participants = reduce(lambda total, meeting: total + str_integer_to_int(meeting['voiceParticipantCount']), meetings, 0) metric = GaugeMetricFamily('bbb_meetings_voice_participants', "Total number of voice participants in all BigBlueButton meetings") metric.add_metric([], no_voice_participants) return metric def metric_meetings_video_participants(self, meetings): - no_video_participants = reduce(lambda total, meeting: total + int(meeting['videoCount']), meetings, 0) + no_video_participants = reduce(lambda total, meeting: total + str_integer_to_int(meeting['videoCount']), meetings, 0) metric = GaugeMetricFamily('bbb_meetings_video_participants', "Total number of video participants in all BigBlueButton meetings") @@ -218,7 +228,7 @@ def metric_participants_histogram(self, meetings): logging.debug("Calculating room participants histogram") histogram = HistogramBucketHelper(self.room_participants_buckets) for meeting in meetings: - histogram.add(int(meeting['participantCount'])) + histogram.add(str_integer_to_int(meeting['participantCount'])) metric = GaugeHistogramMetricFamily('bbb_room_participants', "BigBlueButton room participants histogram gauge") metric.add_metric([], histogram.get_buckets(), histogram.sum) @@ -229,7 +239,7 @@ def metric_listeners_histogram(self, meetings): logging.debug("Calculating room listeners histogram") histogram = HistogramBucketHelper(self.room_listeners_buckets) for meeting in meetings: - histogram.add(int(meeting['listenerCount'])) + histogram.add(str_integer_to_int(meeting['listenerCount'])) metric = GaugeHistogramMetricFamily('bbb_room_listeners', "BigBlueButton room listeners histogram gauge") metric.add_metric([], histogram.get_buckets(), histogram.sum) @@ -239,7 +249,7 @@ def metric_voice_participants_histogram(self, meetings): logging.debug("Calculating room voice participants histogram") histogram = HistogramBucketHelper(self.room_voice_participants_buckets) for meeting in meetings: - histogram.add(int(meeting['voiceParticipantCount'])) + histogram.add(str_integer_to_int(meeting['voiceParticipantCount'])) metric = GaugeHistogramMetricFamily('bbb_room_voice_participants', "BigBlueButton room voice participants histogram gauge") @@ -250,7 +260,7 @@ def metric_video_participants_histogram(self, meetings): logging.debug("Calculating room video participants histogram") histogram = HistogramBucketHelper(self.room_video_participants_buckets) for meeting in meetings: - histogram.add(int(meeting['videoCount'])) + histogram.add(str_integer_to_int(meeting['videoCount'])) metric = GaugeHistogramMetricFamily('bbb_room_video_participants', "BigBlueButton room video participants histogram gauge") @@ -285,6 +295,36 @@ def metric_recordings_unprocessed_from_disk(self): metric.add_metric([], recordings_unprocessed_from_disk(self.recordings_metrics_base_dir)) return metric + def metric_unique_meetings_count(self, meetings): + logging.debug("Calculating count of unique non-breakout meetings") + + # Meetings that are not breakout rooms + m = list(filter(lambda meeting: meeting['isBreakout'].lower() == "false", meetings)) + + meetings_2 = set(map(lambda meeting: meeting['internalMeetingID'], m)) + new_meetings_count = len(meetings_2 - self.last_scrape_meetings) + self.unique_meetings_count += new_meetings_count + self.last_scrape_meetings = meetings_2 + + metric = CounterMetricFamily('bbb_unique_meetings', "Unique non-breakout meetings counter") + metric.add_metric([], self.unique_meetings_count) + return metric + + def metric_unique_breakout_rooms_count(self, meetings): + logging.debug("Calculating count of unique breakout rooms") + + # Meetings that are not breakout rooms + m = list(filter(lambda meeting: meeting['isBreakout'].lower() == "true", meetings)) + + meetings_2 = set(map(lambda meeting: meeting['internalMeetingID'], m)) + new_breakout_meetings_count = len(meetings_2 - self.last_scrape_breakout_rooms) + self.unique_breakout_rooms_count += new_breakout_meetings_count + self.last_scrape_breakout_rooms = meetings_2 + + metric = CounterMetricFamily('bbb_unique_breakout_rooms', "Unique breakout rooms counter") + metric.add_metric([], self.unique_breakout_rooms_count) + return metric + @staticmethod def _get_participant_count_by_client(meetings): p_by_c = defaultdict(int, {'HTML5': 0, 'DIAL-IN': 0}) @@ -305,7 +345,7 @@ def _get_participant_count_by_client(meetings): def _get_participants_count_by_origin(meetings): p_by_m = defaultdict(int) for meeting in meetings: - participants = int(meeting['participantCount']) + participants = str_integer_to_int(meeting['participantCount']) if participants == 0: continue key = ('', '') diff --git a/bbb-exporter/helpers.py b/bbb-exporter/helpers.py index 2d6d0c5..cfad36d 100644 --- a/bbb-exporter/helpers.py +++ b/bbb-exporter/helpers.py @@ -102,3 +102,23 @@ def str_to_bool_or_none(s: str) -> Optional[bool]: return False return None + + +def str_integer_to_int(s: str) -> int: + # Converts a string into an integer. The string can be simply an signed integer (e.g. 123, -123), comma thousands + # separated signed integer (e.g. 1,234 , -1,234) or a signed decimal integer (e.g. 1.234, -1.234). In the case of + # a signed decimal integer we will truncate everything after the decimal point. In the case of an empty string + # the function will return 0. + # + # "-1,223.234" -> -1223 + + if s == '': + return 0 + + s = s.replace(',', '') + s = s.split('.') + + if len(s) > 0: + return int(s[0]) + + return 0 diff --git a/bbb-exporter/helpers_test.py b/bbb-exporter/helpers_test.py new file mode 100644 index 0000000..2497468 --- /dev/null +++ b/bbb-exporter/helpers_test.py @@ -0,0 +1,21 @@ +import unittest + +from helpers import str_integer_to_int + + +class StrIntegerToIntTest(unittest.TestCase): + def test_something(self): + self.assertEqual(str_integer_to_int("0"), 0) + self.assertEqual(str_integer_to_int("11"), 11) + self.assertEqual(str_integer_to_int("-123"), -123) + self.assertEqual(str_integer_to_int(""), 0) + self.assertEqual(str_integer_to_int("1,234"), 1234) + self.assertEqual(str_integer_to_int("-1,234"), -1234) + self.assertEqual(str_integer_to_int("1.234"), 1) + self.assertEqual(str_integer_to_int("-1.234"), -1) + self.assertEqual(str_integer_to_int("1,223.234"), 1223) + self.assertEqual(str_integer_to_int("-1,223.234"), -1223) + + +if __name__ == '__main__': + unittest.main() diff --git a/bbb-exporter/settings.py b/bbb-exporter/settings.py index 8437375..5476449 100644 --- a/bbb-exporter/settings.py +++ b/bbb-exporter/settings.py @@ -3,9 +3,9 @@ from helpers import validate_api_base_url, validate_buckets, str_to_bool_or_none MAJOR = 0 -MINOR = 6 -BUGFIX = 1 -INFO = "" +MINOR = 7 +BUGFIX = 0 +INFO = "preview2" VERSION = "{}.{}.{}".format(MAJOR, MINOR, BUGFIX) if INFO: diff --git a/extras/dashboards/server_instance_node_exporter.json b/extras/dashboards/server_instance_node_exporter.json index 84da1b7..65a05e5 100644 --- a/extras/dashboards/server_instance_node_exporter.json +++ b/extras/dashboards/server_instance_node_exporter.json @@ -17,8 +17,8 @@ "editable": true, "gnetId": null, "graphTooltip": 0, - "id": 24, - "iteration": 1604526635876, + "id": 4, + "iteration": 1608489015691, "links": [], "panels": [ { @@ -78,7 +78,7 @@ "overrides": [] }, "gridPos": { - "h": 3, + "h": 4, "w": 4, "x": 0, "y": 1 @@ -99,7 +99,7 @@ }, "textMode": "auto" }, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "targets": [ { "expr": "bbb_api_up{job=\"$job\", instance=\"$instance\"}", @@ -151,8 +151,11 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -188,6 +191,8 @@ }, "yaxes": [ { + "$$hashKey": "object:145", + "decimals": 0, "format": "short", "label": "Participants", "logBase": 1, @@ -196,6 +201,7 @@ "show": true }, { + "$$hashKey": "object:146", "format": "short", "label": null, "logBase": 1, @@ -219,6 +225,7 @@ "#d44a3a" ], "datasource": "$datasource", + "description": "BigBlueButton Exporter Version", "fieldConfig": { "defaults": { "custom": {} @@ -237,7 +244,7 @@ "h": 3, "w": 4, "x": 0, - "y": 4 + "y": 5 }, "id": 46, "interval": null, @@ -290,7 +297,7 @@ "thresholds": "", "timeFrom": null, "timeShift": null, - "title": "BigBlueButton Exporter Version", + "title": "BBB Exporter Version", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ @@ -324,7 +331,7 @@ "h": 7, "w": 4, "x": 0, - "y": 7 + "y": 8 }, "id": 26, "options": { @@ -341,7 +348,7 @@ }, "textMode": "auto" }, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "targets": [ { "expr": "bbb_meetings_participants{job=\"$job\", instance=\"$instance\"}", @@ -414,14 +421,16 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [ { - "$$hashKey": "object:2952", "alias": "Participants", "yaxis": 2 } @@ -521,19 +530,20 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [ { - "$$hashKey": "object:3017", "alias": "Participants", "yaxis": 2 }, { - "$$hashKey": "object:3018", "alias": "CPU total utilization", "yaxis": 2 } @@ -627,10 +637,10 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 4, "x": 0, - "y": 14 + "y": 15 }, "id": 30, "options": { @@ -647,7 +657,7 @@ }, "textMode": "auto" }, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "targets": [ { "expr": "bbb_meetings_participants{job=\"$job\", instance=\"$instance\"}", @@ -673,114 +683,6 @@ "title": "Max Participants", "type": "stat" }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "description": "", - "fieldConfig": { - "defaults": { - "custom": { - "align": null - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 6, - "x": 0, - "y": 19 - }, - "hiddenSeries": false, - "id": 59, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "bbb_meetings_participants_origin{job=\"$job\", instance=\"$instance\"}", - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Participants Origin", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:633", - "format": "short", - "label": "Participants", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:634", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, { "aliasColors": {}, "bars": false, @@ -797,8 +699,8 @@ "fillGradient": 0, "gridPos": { "h": 8, - "w": 6, - "x": 6, + "w": 7, + "x": 4, "y": 19 }, "hiddenSeries": false, @@ -815,8 +717,11 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -852,7 +757,8 @@ }, "yaxes": [ { - "decimals": null, + "$$hashKey": "object:223", + "decimals": 0, "format": "short", "label": "Rooms", "logBase": 1, @@ -861,6 +767,7 @@ "show": true }, { + "$$hashKey": "object:224", "format": "short", "label": null, "logBase": 1, @@ -893,7 +800,7 @@ "gridPos": { "h": 8, "w": 6, - "x": 12, + "x": 11, "y": 19 }, "hiddenSeries": false, @@ -912,8 +819,11 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -949,6 +859,8 @@ }, "yaxes": [ { + "$$hashKey": "object:252", + "decimals": 0, "format": "short", "label": "Participants", "logBase": 1, @@ -957,6 +869,7 @@ "show": true }, { + "$$hashKey": "object:253", "format": "short", "label": null, "logBase": 1, @@ -988,8 +901,8 @@ "fillGradient": 0, "gridPos": { "h": 8, - "w": 6, - "x": 18, + "w": 7, + "x": 17, "y": 19 }, "hiddenSeries": false, @@ -1007,8 +920,11 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -1044,7 +960,8 @@ }, "yaxes": [ { - "$$hashKey": "object:608", + "$$hashKey": "object:277", + "decimals": 0, "format": "short", "label": "Video Participants", "logBase": 1, @@ -1053,7 +970,7 @@ "show": true }, { - "$$hashKey": "object:609", + "$$hashKey": "object:278", "format": "short", "label": null, "logBase": 1, @@ -1067,6 +984,116 @@ "alignLevel": null } }, + { + "datasource": "$datasource", + "description": "Unique meetings created in the time range - does not include breakout rooms.", + "fieldConfig": { + "defaults": { + "custom": {}, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 21 + }, + "id": 60, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "7.3.4", + "targets": [ + { + "expr": "increase(bbb_unique_meetings_total{job=\"$job\", instance=\"$instance\"}[$__range])", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Meetings Created in Time Range", + "type": "stat" + }, + { + "datasource": "$datasource", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 24 + }, + "id": 61, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "7.3.4", + "targets": [ + { + "expr": "increase(bbb_unique_breakout_rooms_total{job=\"$job\", instance=\"$instance\"}[$__range])", + "interval": "", + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Breakout Rooms Created in Time Range", + "type": "stat" + }, { "datasource": "$datasource", "fieldConfig": { @@ -1106,7 +1133,7 @@ }, "textMode": "auto" }, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "targets": [ { "expr": "bbb_recordings_processing{job=\"$job\", instance=\"$instance\"}", @@ -1192,7 +1219,7 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "targets": [ { "expr": "(node_filesystem_size_bytes{job=\"$job_node_exporter\", instance=\"$instance\"} - node_filesystem_avail_bytes{job=\"$job_node_exporter\", instance=\"$instance\"}) / node_filesystem_size_bytes{job=\"$job_node_exporter\", instance=\"$instance\"}", @@ -1241,8 +1268,11 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -1278,6 +1308,8 @@ }, "yaxes": [ { + "$$hashKey": "object:302", + "decimals": 0, "format": "short", "label": "Recordings ", "logBase": 1, @@ -1286,6 +1318,7 @@ "show": true }, { + "$$hashKey": "object:303", "format": "short", "label": null, "logBase": 1, @@ -1335,8 +1368,11 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -1372,6 +1408,8 @@ }, "yaxes": [ { + "$$hashKey": "object:331", + "decimals": 0, "format": "short", "label": "Participants", "logBase": 1, @@ -1380,6 +1418,119 @@ "show": true }, { + "$$hashKey": "object:332", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 38 + }, + "hiddenSeries": false, + "id": 59, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.4", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "bbb_meetings_participants_origin{job=\"$job\", instance=\"$instance\"}", + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Participants Origin", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:194", + "decimals": 0, + "format": "short", + "label": "Participants", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:195", "format": "short", "label": null, "logBase": 1, @@ -1400,7 +1551,7 @@ "h": 1, "w": 24, "x": 0, - "y": 38 + "y": 46 }, "id": 51, "panels": [], @@ -1433,7 +1584,7 @@ "h": 10, "w": 12, "x": 0, - "y": 39 + "y": 47 }, "heatmap": {}, "hideZeroBuckets": true, @@ -1507,7 +1658,7 @@ "h": 10, "w": 12, "x": 12, - "y": 39 + "y": 47 }, "heatmap": {}, "hideZeroBuckets": true, @@ -1581,7 +1732,7 @@ "h": 10, "w": 12, "x": 0, - "y": 49 + "y": 57 }, "heatmap": {}, "hideZeroBuckets": true, @@ -1655,7 +1806,7 @@ "h": 10, "w": 12, "x": 12, - "y": 49 + "y": 57 }, "heatmap": {}, "hideZeroBuckets": true, @@ -1710,7 +1861,7 @@ "h": 1, "w": 24, "x": 0, - "y": 59 + "y": 67 }, "id": 38, "panels": [], @@ -1735,7 +1886,7 @@ "h": 9, "w": 12, "x": 0, - "y": 60 + "y": 68 }, "hiddenSeries": false, "id": 40, @@ -1753,8 +1904,11 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -1807,7 +1961,6 @@ }, "yaxes": [ { - "$$hashKey": "object:3437", "format": "s", "label": "Response Time", "logBase": 1, @@ -1816,7 +1969,6 @@ "show": true }, { - "$$hashKey": "object:3438", "format": "short", "label": null, "logBase": 1, @@ -1851,7 +2003,7 @@ "h": 9, "w": 12, "x": 12, - "y": 60 + "y": 68 }, "hiddenSeries": false, "id": 22, @@ -1870,8 +2022,11 @@ "linewidth": 1, "links": [], "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.1", + "pluginVersion": "7.3.4", "pointradius": 2, "points": false, "renderer": "flot", @@ -1940,7 +2095,6 @@ }, "yaxes": [ { - "$$hashKey": "object:3468", "decimals": null, "format": "s", "label": "Response Time", @@ -1950,7 +2104,6 @@ "show": true }, { - "$$hashKey": "object:3469", "format": "short", "label": "", "logBase": 1, @@ -1976,6 +2129,7 @@ "templating": { "list": [ { + "error": null, "hide": 0, "includeAll": false, "label": "Datasource", @@ -1993,6 +2147,7 @@ "allValue": null, "datasource": "$datasource", "definition": "label_values(bbb_exporter, job)", + "error": null, "hide": 0, "includeAll": false, "label": "Job", @@ -2020,25 +2175,15 @@ "allValue": null, "datasource": "$datasource", "definition": "label_values(node_cpu_seconds_total, job)", + "error": null, "hide": 0, "includeAll": false, "label": "Job node_exporter", "multi": false, "name": "job_node_exporter", - "options": [ - { - "selected": true, - "text": "bbb_node_exporter", - "value": "bbb_node_exporter" - }, - { - "selected": false, - "text": "cloud_maas", - "value": "cloud_maas" - } - ], + "options": [], "query": "label_values(node_cpu_seconds_total, job)", - "refresh": 0, + "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, @@ -2052,6 +2197,7 @@ "allValue": null, "datasource": "$datasource", "definition": "label_values(bbb_api_up, instance)", + "error": null, "hide": 0, "includeAll": false, "label": "Instance", @@ -2073,6 +2219,7 @@ "allValue": null, "datasource": "$datasource", "definition": "label_values(node_network_transmit_bytes_total, device)", + "error": null, "hide": 0, "includeAll": false, "label": "Network Interface", @@ -2112,5 +2259,5 @@ "timezone": "", "title": "BigBlueButton Server Instance (node_exporter)", "uid": "HIbd_CXZz3", - "version": 6 + "version": 4 }