Skip to content
Snippets Groups Projects
Unverified Commit bd2c740c authored by Varac's avatar Varac
Browse files

Migrate to waybar

parent d1f3fccc
Branches
No related tags found
No related merge requests found
# Alertmanager indicator # Alertmanager status
Tray icon for [alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/), based on [libappindicator](https://launchpad.net/libappindicator). `./alertmanager_status.py` will output the [alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/)
status details in a [waybar](https://github.com/Alexays/Waybar) compatible
JSON format.
It also holds a historic `indicator.py` python class for a tray icon
based on [libappindicator](https://launchpad.net/libappindicator). I don't use
it anymore and it doesn't work in the current state, although it might be
easy to get it working again.
![tray icon example](./tray-example.png) ![tray icon example](./tray-example.png)
......
#!/usr/bin/env python3
"""
Alertmanager status applet using appindicator.
"""
import json
import os
from pathlib import Path
import plac
import yaml
from query_alertmanager import get_alerts
def show_alerts(opts):
"""Show alerts."""
alerts = get_alerts(url=opts["url"],
port=opts["port"],
user=opts["user"],
password=opts["password"])
# Construct waybar output
# https://github.com/Alexays/Waybar/wiki/Module:-Custom#return-type
# {"text": "$text", "alt": "$alt", "tooltip": "$tooltip",
# "class": "$class", "percentage": $percentage }.
# This means the output should also be on a single line
output = {}
output["text"] = alerts['summary']
if alerts['summary'] == "Cant connect":
output["alt"] = "error"
output["tooltip"] = "Some error occurred."
else:
if alerts["count"] > 0:
output["alt"] = "firing"
output["tooltip"] = '\n'.join(alerts['alerts'])
else:
output["alt"] = "snafu"
output["tooltip"] = "Situation normal, all fucked up 😃"
print(json.dumps(output))
@plac.opt('configpath', "Path to alertmanager config", type=Path)
@plac.opt('mode', "Mode: wayland or indicator (not working)", type=str)
@plac.flg('debug', "Enable debug mode")
def main(configpath='~/.config/indicator_alertmanager/config.yml',
mode="wayland"):
"""Main function."""
# Load config
with open(Path.expanduser(configpath), encoding="UTF8") as config_file: # type:ignore
opts_raw = yaml.load(config_file, Loader=yaml.FullLoader)
opts = {}
opts["url"] = opts_raw.get('url')
opts["port"] = opts_raw.get('port', 443)
opts["user"] = opts_raw.get('user', 'admin')
opts["password"] = opts_raw.get('password')
opts["icon_red"] = os.path.abspath("./prometheus.svg")
opts["icon_green"] = os.path.abspath("./prometheus-green.svg")
if mode == "wayland":
show_alerts(opts)
# if mode == "indicator":
# Indicator()
if __name__ == "__main__":
plac.call(main)
File moved
No preview for this file type
File moved
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Alertmanager status applet using appindicator. Alertmanager status applet using appindicator.
Install dependencies (`libffi7` is needed by `pygobject`):
sudo apt install gir1.2-appindicator3-0.1 libffi7
""" """
# import json
import os import os
from pathlib import Path from pathlib import Path
import signal
import time import time
from threading import Thread from threading import Thread
import plac import plac
import gi import gi
import yaml import yaml
from gi.repository import Gtk, AppIndicator3, GLib # type: ignore
from query_alertmanager import get_alerts from query_alertmanager import get_alerts
from gi.repository import Gtk, AppIndicator3, Glib # type: ignore
gi.require_version('Gtk', '3.0') gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1') gi.require_version('AppIndicator3', '0.1')
...@@ -103,9 +105,3 @@ class Indicator(): ...@@ -103,9 +105,3 @@ class Indicator():
def stop(self): def stop(self):
"""Exit indicator.""" """Exit indicator."""
Gtk.main_quit() Gtk.main_quit()
if __name__ == "__main__":
plac.call(Indicator)
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
#!/usr/bin/env python3
"""Queries alertmanager for alerts, outputs json.
Can be also used as cli application.
Usage:
./query_alertmananger.py -h
"""
import json
import plac
import requests
from alertmanager import AlertManager
def get_alerts(url, password, port=443, user='admin'):
req = requests.Session()
req.auth = (user, password)
AM = AlertManager(host=url, port=port, req_obj=req)
count = 0
alerts = []
state = "unknown"
try:
alerts_raw = AM.get_alerts()
for alert in alerts_raw:
name = alert['labels']['alertname']
severity = alert['labels']['severity']
instance = alert['labels']['instance']
alert_state = alert['status']['state']
release_name = alert['labels']['release_name']
if severity != "none" and alert_state != "suppressed":
count += 1
alert_text = f'{name}: {instance}, {release_name} ({severity})'
alerts.append(alert_text)
if count > 2:
state = "critical"
elif count > 0:
state = "warning"
elif count == 0:
state = "ok"
summary = f'{count} alerts'
except:
summary = "Cant connect"
state = "warning"
return_data = {
'summary': summary,
'alerts': alerts,
'state': state,
'count': count }
return return_data
@plac.opt('url', "URL of alertmanager instance", type=str, abbrev='U')
@plac.opt('port', "Port of alertmanager instance", type=int, abbrev='P')
@plac.opt('user', "User name", type=str)
@plac.opt('password', "Password", type=str)
def main(url, password, port=443, user='admin'):
"""Main function."""
alerts = get_alerts(url=url, password=password, port=port, user=user)
print(json.dumps(alerts))
if __name__ == '__main__':
plac.call(main)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment