Redash-Dashboards automatisieren: Diagramme an Mattermost senden
Ein Python-Skript löst die Aufgabe, Diagramme aus Redash automatisch an Mattermost zu liefern. Es holt Daten über die API ab, erstellt Visualisierungen in matplotlib neu, kombiniert sie zu einem einzigen Dashboard und sendet es in einen Kanal. Ideal für Teams, bei denen Daten mit Verzögerung aktualisiert werden und manuelle Dashboard-Prüfungen ineffizient sind.
Die Pipeline läuft als Cron-Job: Sie prüft die Aktualität der Daten, erstellt Diagramme mit Anmerkungen und veröffentlicht den finalen Bericht vor Arbeitsbeginn.
Daten von der Redash-API abrufen
Redash bietet eine API, um Abfragen per query_id mit Parametern auszuführen. Die Hauptfunktion:
import requests
BASE_URL = 'https://your-redash-instance'
HEADERS = {'Authorization': 'Key YOUR_API_KEY'}
def fetch_query(query_id, params):
response = requests.post(
f'{BASE_URL}/api/queries/{query_id}/results',
headers=HEADERS,
json={'parameters': params, 'max_age': 0},
)
return response.json()
Falls das Ergebnis nicht bereit ist, gibt die API einen Job zurück — implementieren Sie Polling, um auf den Abschluss zu warten. Für Dashboards, Parameter aus der URL parsen:
from urllib.parse import parse_qs, urlparse
def parse_dashboard_url(url):
parsed = urlparse(url)
params = parse_qs(parsed.query)
return {
key: value[0]
for key, value in params.items()
}
Dynamische Datumsangaben wie 'letzte 7 Tage' manuell umwandeln:
from datetime import datetime, timedelta
def last_7_days():
today = datetime.utcnow()
return {
'start': (today - timedelta(days=7)).strftime('%Y-%m-%d'),
'end': today.strftime('%Y-%m-%d')
}
Diagramme erstellen und annotieren
Visualisierungen werden in matplotlib erstellt, wobei Redash-Stile nachgeahmt werden: Farben, Linientypen, Größen. Ein einfaches Liniendiagramm-Beispiel:
import matplotlib.pyplot as plt
def build_chart(df):
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(df['date'], df['value'], linewidth=2)
ax.plot(df['date'], df['plan'], linewidth=2)
ax.set_title('Metrikdynamik')
return fig
Der entscheidende Schritt sind Anmerkungen für bessere Lesbarkeit in statischen Bildern. Fügen Sie den letzten Wert, die wöchentliche Veränderung, Abweichung vom Plan hinzu:
ax.annotate(
f"Wert: {last_value}",
xy=(last_date, last_value),
xytext=(10, 10),
textcoords='offset points'
)
Dies ermöglicht es, Metriken ohne Interaktivität zu verstehen.
Diagramme zu einem Dashboard kombinieren
Mehrere Diagramme (nach Metriken, Kategorien) werden mit PIL zu einem Bild zusammengeführt für bessere UX:
from PIL import Image
def merge_images(images, output_path):
base = Image.new('RGB', (1200, 800), 'white')
for img, pos in images:
base.paste(img, pos)
base.save(output_path)
Fügen Sie Abschnittsüberschriften nach Abteilung oder Thema für die Navigation hinzu.
Prüfungen und Duplikatschutz
Das Skript prüft das Zieldatum in den Daten:
if df['date'].max() != target_date:
raise Exception('Daten noch nicht aktualisiert')
Schutz vor doppelten Sendungen über eine Statusdatei:
from pathlib import Path
STATE_FILE = Path('last_sent.txt')
def was_sent(date):
return STATE_FILE.exists() and STATE_FILE.read_text() == str(date)
An Mattermost senden
Nutzen Sie mattermostdriver, um die Datei hochzuladen und zu posten:
from mattermostdriver import Driver
mm = Driver({
'url': 'your-mattermost',
'token': 'BOT_TOKEN',
})
mm.login()
mm.posts.create_post({
'channel_id': channel_id,
'message': 'Bericht bereit',
'file_ids': [file_id],
})
Wichtige Punkte
- Automatisierung reduziert manuellen Aufwand: Diagramme kommen bei Datenaktualisierungen automatisch im Messenger an.
- Anmerkungen auf Diagrammen gewährleisten volle Informativität ohne Hover-Interaktionen.
- Kombination zu einem Dashboard verbessert die UX im Chat.
- Aktualitäts- und Duplikatprüfungen garantieren Pipeline-Zuverlässigkeit.
- Einfach skalierbar: Neue query_ids und Parameter hinzufügen.
— Editorial Team
Noch keine Kommentare.