From e17d1ab02fcccf9e951783f7a5bdea500d75ec34 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 15 Nov 2021 21:18:42 +0100 Subject: [PATCH] add bundle:telegraf-battery-usage --- bundles/grafana/dashboard-rows/battery.py | 236 ++++++++++++++++++ bundles/grafana/items.py | 3 + .../files/telegraf-plugin-battery-usage | 33 +++ bundles/telegraf-battery-usage/items.py | 5 + bundles/telegraf-battery-usage/metadata.py | 17 ++ nodes/kunsi-seibert-x1.py | 4 +- nodes/kunsi-t470.py | 1 + 7 files changed, 298 insertions(+), 1 deletion(-) create mode 100644 bundles/grafana/dashboard-rows/battery.py create mode 100644 bundles/telegraf-battery-usage/files/telegraf-plugin-battery-usage create mode 100644 bundles/telegraf-battery-usage/items.py create mode 100644 bundles/telegraf-battery-usage/metadata.py diff --git a/bundles/grafana/dashboard-rows/battery.py b/bundles/grafana/dashboard-rows/battery.py new file mode 100644 index 0000000..83dda6f --- /dev/null +++ b/bundles/grafana/dashboard-rows/battery.py @@ -0,0 +1,236 @@ +def dashboard_row_battery(panel_id, node): + return { + 'title': 'battery', + 'collapse': False, + 'editable': False, + 'height': '250px', + 'panels': [ + { + 'aliasColors': {}, + 'bars': False, + 'dashLength': 10, + 'dashes': False, + 'datasource': None, + 'fieldConfig': { + 'defaults': { + 'displayName': '${__field.labels.name}' + }, + 'overrides': [] + }, + 'fill': 0, + 'fillGradient': 0, + 'hiddenSeries': False, + 'id': next(panel_id), + 'legend': { + 'alignAsTable': False, + 'avg': False, + 'current': False, + 'hideEmpty': True, + 'hideZero': True, + 'max': False, + 'min': False, + 'rightSide': False, + 'show': True, + 'total': False, + 'values': False + }, + 'lines': True, + 'linewidth': 1, + 'NonePointMode': 'None', + 'options': { + 'alertThreshold': True + }, + 'percentage': False, + 'pluginVersion': '7.5.5', + 'pointradius': 2, + 'points': False, + 'renderer': 'flot', + 'seriesOverrides': [], + 'spaceLength': 10, + 'span': 8, + 'stack': False, + 'steppedLine': False, + 'targets': [ + { + 'groupBy': [ + {'type': 'time', 'params': ['$__interval']}, + {'type': 'fill', 'params': ['linear']}, + ], + 'orderByTime': "ASC", + 'policy': "default", + 'query': f"""from(bucket: "telegraf") + |> range(start: v.timeRangeStart, stop: v.timeRangeStop) + |> filter(fn: (r) => + r["_measurement"] == "battery" and + r["host"] == "{node.name}" and + ( + r["_field"] == "energy_full" or + r["_field"] == "energy_now" + ) + ) + |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") + |> map(fn: (r) => ({{ + r with + _value: float(v: r.energy_now) / float(v: r.energy_full) * 100.0 + }})) + |> drop(columns: ["energy_now", "energy_full"])""", + 'resultFormat': 'time_series', + 'select': [[ + {'type': 'field', 'params': ['value']}, + {'type': 'mean', 'params': []}, + ]], + "tags": [] + }, + ], + 'thresholds': [], + 'timeRegions': [], + 'title': 'battery charge', + 'tooltip': { + 'shared': True, + 'sort': 0, + 'value_type': 'individual' + }, + 'type': 'graph', + 'xaxis': { + 'buckets': None, + 'mode': 'time', + 'name': None, + 'show': True, + 'values': [] + }, + 'yaxes': [ + { + 'format': 'percent', + 'label': None, + 'logBase': 1, + 'max': 100, + 'min': 0, + 'show': True, + 'decimals': 2, + }, + { + 'format': 'short', + 'label': None, + 'logBase': 1, + 'max': None, + 'min': None, + 'show': False, + } + ], + 'yaxis': { + 'align': False, + 'alignLevel': None + } + }, + { + 'aliasColors': {}, + 'bars': False, + 'dashLength': 10, + 'dashes': False, + 'datasource': None, + 'fieldConfig': { + 'defaults': { + 'displayName': '${__field.labels.name}' + }, + 'overrides': [] + }, + 'fill': 0, + 'fillGradient': 0, + 'hiddenSeries': False, + 'id': next(panel_id), + 'legend': { + 'alignAsTable': False, + 'avg': False, + 'current': False, + 'hideEmpty': True, + 'hideZero': True, + 'max': False, + 'min': False, + 'rightSide': False, + 'show': True, + 'total': False, + 'values': False + }, + 'lines': True, + 'linewidth': 1, + 'NonePointMode': 'None', + 'options': { + 'alertThreshold': True + }, + 'percentage': False, + 'pluginVersion': '7.5.5', + 'pointradius': 2, + 'points': False, + 'renderer': 'flot', + 'seriesOverrides': [], + 'spaceLength': 10, + 'span': 4, + 'stack': False, + 'steppedLine': False, + 'targets': [ + { + 'groupBy': [ + {'type': 'time', 'params': ['$__interval']}, + {'type': 'fill', 'params': ['linear']}, + ], + 'orderByTime': "ASC", + 'policy': "default", + 'query': f"""from(bucket: "telegraf") + |> range(start: v.timeRangeStart, stop: v.timeRangeStop) + |> filter(fn: (r) => + r["_measurement"] == "battery" and + r["_field"] == "power_now" and + r["host"] == "{node.name}" + ) + |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) + |> yield(name: "fan")""", + 'resultFormat': 'time_series', + 'select': [[ + {'type': 'field', 'params': ['value']}, + {'type': 'mean', 'params': []}, + ]], + "tags": [] + }, + ], + 'thresholds': [], + 'timeRegions': [], + 'title': 'power draw from battery', + 'tooltip': { + 'shared': True, + 'sort': 0, + 'value_type': 'individual' + }, + 'type': 'graph', + 'xaxis': { + 'buckets': None, + 'mode': 'time', + 'name': None, + 'show': True, + 'values': [] + }, + 'yaxes': [ + { + 'format': 'watts', + 'label': None, + 'logBase': 1, + 'max': None, + 'min': 0, + 'show': True, + 'decimals': 1, + }, + { + 'format': 'short', + 'label': None, + 'logBase': 1, + 'max': None, + 'min': None, + 'show': False, + } + ], + 'yaxis': { + 'align': False, + 'alignLevel': None + } + }, + ], + } diff --git a/bundles/grafana/items.py b/bundles/grafana/items.py index 41a8fac..5a9c43b 100644 --- a/bundles/grafana/items.py +++ b/bundles/grafana/items.py @@ -104,6 +104,9 @@ for rnode in repo.nodes: dashboard['rows'].append(dashboard_row_sensors(panel_id, rnode)) dashboard['tags'].add('lm-sensors') + if rnode.has_bundle('telegraf-battery-usage'): + dashboard['rows'].append(dashboard_row_battery(panel_id, rnode)) + dashboard['rows'].append(dashboard_row_disk_space(panel_id, rnode)) dashboard['rows'].append(dashboard_row_disk_iops(panel_id, rnode)) diff --git a/bundles/telegraf-battery-usage/files/telegraf-plugin-battery-usage b/bundles/telegraf-battery-usage/files/telegraf-plugin-battery-usage new file mode 100644 index 0000000..233d6c1 --- /dev/null +++ b/bundles/telegraf-battery-usage/files/telegraf-plugin-battery-usage @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +from os import listdir +from os.path import join +from sys import exit, stderr + +try: + for power_supply in listdir('/sys/class/power_supply/'): + if power_supply.startswith('BAT'): + out = {} + + for measurement in { + 'capacity', + 'cycle_count', + 'energy_full', + 'energy_full_design', + 'energy_now', + 'power_now', + 'voltage_now', + }: + try: + with open(join('/sys/class/power_supply', power_supply, measurement)) as f: + out[measurement] = f.read().splitlines()[0].strip() + except Exception as e: + print(repr(e), file=stderr) + + print('battery,name={} {}'.format( + power_supply, + ','.join([f'{k}={v}' for k, v in sorted(out.items())]), + )) +except Exception as e: + print(repr(e), file=stderr) + exit(1) diff --git a/bundles/telegraf-battery-usage/items.py b/bundles/telegraf-battery-usage/items.py new file mode 100644 index 0000000..79e07ed --- /dev/null +++ b/bundles/telegraf-battery-usage/items.py @@ -0,0 +1,5 @@ +files = { + '/usr/local/bin/telegraf-plugin-battery-usage': { + 'mode': '0700', + }, +} diff --git a/bundles/telegraf-battery-usage/metadata.py b/bundles/telegraf-battery-usage/metadata.py new file mode 100644 index 0000000..4d9b363 --- /dev/null +++ b/bundles/telegraf-battery-usage/metadata.py @@ -0,0 +1,17 @@ +defaults = { + 'telegraf': { + 'input_plugins': { + 'exec': { + 'battery-usage': { + 'commands': ['sudo /usr/local/bin/telegraf-plugin-battery-usage'], + 'data_format': 'influx', + 'timeout': '5s', + 'interval': '15s', + }, + }, + }, + 'sudo_commands': { + '/usr/local/bin/telegraf-plugin-battery-usage', + }, + }, +} diff --git a/nodes/kunsi-seibert-x1.py b/nodes/kunsi-seibert-x1.py index 68740e7..19ec8bf 100644 --- a/nodes/kunsi-seibert-x1.py +++ b/nodes/kunsi-seibert-x1.py @@ -1,7 +1,8 @@ # work laptop. Only apply interactively. nodes['kunsi-seibert-x1'] = { - 'hostname': '172.19.138.243', + 'dummy': True, + 'hostname': '172.19.138.240', 'bundles': { 'basic', 'lldp', @@ -12,6 +13,7 @@ nodes['kunsi-seibert-x1'] = { 'sudo', 'systemd', 'telegraf', + 'telegraf-battery-usage', 'users', }, 'groups': set(), diff --git a/nodes/kunsi-t470.py b/nodes/kunsi-t470.py index 0a68624..03fe71b 100644 --- a/nodes/kunsi-t470.py +++ b/nodes/kunsi-t470.py @@ -6,6 +6,7 @@ nodes['kunsi-t470'] = { 'lldp', 'lm-sensors', 'nfs-client', + 'telegraf-battery-usage', }, 'groups': { 'arch',