Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add alert rules to backup #201

Merged
merged 2 commits into from
Mar 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion grafana_backup/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def main(args, settings):
backup_files = list()

for folder_name in ['folders', 'datasources', 'dashboards', 'alert_channels', 'organizations', 'users', 'snapshots',
'versions', 'annotations', 'library-elements', 'teams', 'team_members']:
'versions', 'annotations', 'library-elements', 'teams', 'team_members', 'alert_rules']:
backup_path = '{0}/{1}/{2}'.format(backup_dir, folder_name, timestamp)

for file_path in glob(backup_path):
Expand Down
2 changes: 1 addition & 1 deletion grafana_backup/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
--version Get version information and exit
--config=<filename> Override default configuration path
--components=<> Comma separated list of individual components to backup (all by default); versions can only be saved not restored.
<folders,folder_permissions,dashboards,datasources,alert-channels,organizations,users,snapshots,versions,annotations,library_elements,teams,team_members>
<folders,folder_permissions,dashboards,datasources,alert-channels,alert-rules,organizations,users,snapshots,versions,annotations,library_elements,teams,team_members>

--no-archive Skip archive creation and do not delete unarchived files
(used for troubleshooting purposes)
Expand Down
17 changes: 17 additions & 0 deletions grafana_backup/create_alert_rule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import json
from grafana_backup.dashboardApi import create_alert_rule


def main(args, settings, file_path):
grafana_url = settings.get('GRAFANA_URL')
http_post_headers = settings.get('HTTP_POST_HEADERS')
verify_ssl = settings.get('VERIFY_SSL')
client_cert = settings.get('CLIENT_CERT')
debug = settings.get('DEBUG')

with open(file_path, 'r') as f:
data = f.read()

alert_rule = json.loads(data)
result = create_alert_rule(json.dumps(alert_rule), grafana_url, http_post_headers, verify_ssl, client_cert, debug)
print("create alert rule: {0}, status: {1}, msg: {2}".format(alert_rule['title'], result[0], result[1]))
26 changes: 26 additions & 0 deletions grafana_backup/dashboardApi.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,32 @@ def delete_annotation(id_, grafana_url, http_get_headers, verify_ssl, client_cer
client_cert, debug)


def search_alert_rules(grafana_url, http_get_headers, verify_ssl, client_cert, debug):
url = '{0}/api/v1/provisioning/alert-rules'.format(grafana_url)
print("search alert rules in grafana: {0}".format(url))
return send_grafana_get(url, http_get_headers, verify_ssl, client_cert, debug)


def get_alert_rule(uid, grafana_url, http_get_headers, verify_ssl, client_cert, debug):
url = '{0}/api/v1/provisioning/alert-rules/{1}'.format(grafana_url, uid)
return send_grafana_get(url, http_get_headers, verify_ssl, client_cert, debug)


def create_alert_rule(alert, grafana_url, http_get_headers, verify_ssl, client_cert, debug):
url = '{0}/api/v1/provisioning/alert-rules'.format(grafana_url)
return send_grafana_post(url, alert, http_get_headers, verify_ssl, client_cert, debug)


def delete_alert_rule(uid, grafana_url, http_get_headers, verify_ssl, client_cert, debug):
url = '{0}/api/v1/provisioning/alert-rules/{1}'.format(grafana_url, uid)
return send_grafana_delete(url, http_get_headers, verify_ssl, client_cert, debug)


def update_alert_rule(uid, alert, grafana_url, http_get_headers, verify_ssl, client_cert, debug):
url = '{0}/api/v1/provisioning/alert-rules/{1}'.format(grafana_url, uid)
return send_grafana_put(url, alert, http_get_headers, verify_ssl, client_cert, debug)


def search_alert_channels(grafana_url, http_get_headers, verify_ssl, client_cert, debug):
url = '{0}/api/alert-notifications'.format(grafana_url)
print("search alert channels in grafana: {0}".format(url))
Expand Down
2 changes: 2 additions & 0 deletions grafana_backup/restore.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from grafana_backup.create_datasource import main as create_datasource
from grafana_backup.create_dashboard import main as create_dashboard
from grafana_backup.create_alert_channel import main as create_alert_channel
from grafana_backup.create_alert_rule import main as create_alert_rule
from grafana_backup.create_user import main as create_user
from grafana_backup.create_snapshot import main as create_snapshot
from grafana_backup.create_annotation import main as create_annotation
Expand Down Expand Up @@ -88,6 +89,7 @@ def open_compressed_backup(compressed_backup):
restore_functions['team'] = create_team
restore_functions['team_member'] = create_team_member
restore_functions['folder_permission'] = update_folder_permissions
restore_functions['alert_rule'] = create_alert_rule

if sys.version_info >= (3,):
with tempfile.TemporaryDirectory() as tmpdir:
Expand Down
4 changes: 3 additions & 1 deletion grafana_backup/save.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from grafana_backup.api_checks import main as api_checks
from grafana_backup.save_alert_rules import main as save_alert_rules
from grafana_backup.save_dashboards import main as save_dashboards
from grafana_backup.save_datasources import main as save_datasources
from grafana_backup.save_folders import main as save_folders
Expand Down Expand Up @@ -34,7 +35,8 @@ def main(args, settings):
'annotations': save_annotations,
'library-elements': save_library_elements,
'teams': save_teams,
'team-members': save_team_members}
'team-members': save_team_members,
'save-alert-rules': save_alert_rules}

(status, json_resp, dashboard_uid_support, datasource_uid_support, paging_support) = api_checks(settings)

Expand Down
52 changes: 52 additions & 0 deletions grafana_backup/save_alert_rules.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import os
from grafana_backup.dashboardApi import search_alert_rules, get_alert_rule
from grafana_backup.commons import to_python2_and_3_compatible_string, print_horizontal_line, save_json


def main(args, settings):
backup_dir = settings.get('BACKUP_DIR')
timestamp = settings.get('TIMESTAMP')
grafana_url = settings.get('GRAFANA_URL')
http_get_headers = settings.get('HTTP_GET_HEADERS')
verify_ssl = settings.get('VERIFY_SSL')
client_cert = settings.get('CLIENT_CERT')
debug = settings.get('DEBUG')
pretty_print = settings.get('PRETTY_PRINT')
folder_path = '{0}/alert_rules/{1}'.format(backup_dir, timestamp)
log_file = 'alert_rules_{0}.txt'.format(timestamp)

if not os.path.exists(folder_path):
os.makedirs(folder_path)

save_alert_rules(folder_path, log_file, grafana_url, http_get_headers, verify_ssl, client_cert, debug, pretty_print)


def get_all_alert_rules_in_grafana(grafana_url, http_get_headers, verify_ssl, client_cert, debug):
(status, content) = search_alert_rules(grafana_url,
http_get_headers,
verify_ssl, client_cert,
debug)
if status == 200:
alert_rules = content
print("There are {0} alert rules:".format(len(alert_rules)))
for alert_rule in alert_rules:
print('name: {0}'.format(to_python2_and_3_compatible_string(alert_rule['title'])))
return alert_rules
else:
raise Exception("Faild to get alert rules, status: {0}, msg: {1}".format(status, content))


def save_alert_rules(folder_path, log_file, grafana_url, http_get_headers, verify_ssl, client_cert, debug, pretty_print):
alert_rules = get_all_alert_rules_in_grafana(grafana_url, http_get_headers, verify_ssl, client_cert, debug)
for alert_rule in alert_rules:
print_horizontal_line()
print(alert_rule)
file_path = save_json(alert_rule['uid'],
alert_rule,
folder_path,
'alert_rule',
pretty_print)
print("alert_rule: {0} -> saved to: {1}"
.format(to_python2_and_3_compatible_string(alert_rule['title']),
file_path))
print_horizontal_line()