Franziska Kunsmann
c976be62d7
All checks were successful
bundlewrap/pipeline/head This commit looks good
After all, we're only getting data every minute, so there's no point in refreshing more often.
130 lines
3.6 KiB
Python
130 lines
3.6 KiB
Python
from itertools import count
|
|
from os import listdir
|
|
from os.path import isdir, isfile, join
|
|
from pathlib import Path
|
|
from uuid import UUID
|
|
|
|
from bundlewrap.metadata import metadata_to_json
|
|
|
|
for row in Path(join(repo.path, 'bundles', 'grafana', 'dashboard-rows')).rglob("*.py"):
|
|
with open(row, 'r') as f:
|
|
exec(f.read())
|
|
|
|
directories = {
|
|
'/etc/grafana/provisioning/dashboards': {
|
|
'purge': True,
|
|
},
|
|
'/etc/grafana/provisioning/datasources': {
|
|
'purge': True,
|
|
},
|
|
'/etc/grafana/provisioning/notifiers': {
|
|
'purge': True,
|
|
},
|
|
'/etc/grafana/provisioning/plugins': {
|
|
'purge': True,
|
|
},
|
|
'/var/lib/grafana/dashboards': {
|
|
'purge': True,
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
},
|
|
}
|
|
|
|
files = {
|
|
'/etc/grafana/grafana.ini': {
|
|
'content_type': 'mako',
|
|
'context': node.metadata['grafana'],
|
|
'owner': 'grafana',
|
|
'mode': '0640',
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
},
|
|
'/etc/grafana/provisioning/dashboards/bundlewrap.yaml': {
|
|
'source': 'dashboards.yaml',
|
|
'owner': 'grafana',
|
|
'mode': '0640',
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
},
|
|
}
|
|
|
|
svc_systemd = {
|
|
'grafana-server': {
|
|
'needs': {
|
|
'file:/etc/grafana/grafana.ini',
|
|
'pkg_apt:grafana',
|
|
},
|
|
},
|
|
}
|
|
|
|
### dashboard management starts here
|
|
for rnode in repo.nodes:
|
|
if not rnode.has_bundle('telegraf'):
|
|
continue
|
|
|
|
panel_id = count(start=1)
|
|
dashboard = {
|
|
'title': rnode.name,
|
|
'uid': UUID(int=rnode.magic_number).hex[:10],
|
|
|
|
'editable': False,
|
|
'graphTooltip': 1,
|
|
'refresh': '1m',
|
|
'schemaVersion': 12,
|
|
'style': 'dark',
|
|
'tags': {'bw'},
|
|
'time': {
|
|
'from': 'now-1d',
|
|
'to': 'now'
|
|
},
|
|
'version': 1,
|
|
|
|
'rows': [
|
|
dashboard_row_cpu(panel_id, rnode),
|
|
dashboard_row_ip_traffic(panel_id, rnode),
|
|
dashboard_row_memory(panel_id, rnode),
|
|
dashboard_row_disk_space(panel_id, rnode),
|
|
dashboard_row_disk_iops(panel_id, rnode),
|
|
],
|
|
}
|
|
|
|
if rnode.has_bundle('nginx'):
|
|
dashboard['rows'].append(dashboard_row_nginx(panel_id, rnode))
|
|
dashboard['tags'].add('nginx')
|
|
|
|
if rnode.has_bundle('postfix'):
|
|
dashboard['rows'].append(dashboard_row_postfix(panel_id, rnode))
|
|
dashboard['tags'].add('postfix')
|
|
|
|
if rnode.has_bundle('postgresql'):
|
|
dashboard['rows'].append(dashboard_row_postgresql(panel_id, rnode))
|
|
dashboard['tags'].add('postgresql')
|
|
|
|
if rnode.has_bundle('wireguard'):
|
|
dashboard['rows'].append(dashboard_row_wireguard(panel_id, rnode))
|
|
dashboard['tags'].add('wireguard')
|
|
|
|
files[f'/var/lib/grafana/dashboards/{rnode.name}.json'] = {
|
|
# use metadata_to_json, because this supports sets
|
|
'content': metadata_to_json(dashboard),
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
}
|
|
|
|
|
|
additional_path = join(repo.path, 'data', 'grafana', 'files', node.name, 'dashboards')
|
|
if isdir(additional_path):
|
|
for file in listdir(additional_path):
|
|
if not isfile(join(additional_path, file)) or file.startswith('.') or file.startswith('_'):
|
|
continue
|
|
|
|
files[f'/var/lib/grafana/dashboards/{file}'] = {
|
|
'source': join(node.name, 'dashboards', file),
|
|
'triggers': {
|
|
'svc_systemd:grafana-server:restart',
|
|
},
|
|
}
|