Zurück zur Startseite

Redash Bot in Mattermost: Diagramme-Automatisierung

Skript automatisiert das Versenden von Diagrammen von Redash nach Mattermost: holt Daten via API, erstellt Visualisierungen in matplotlib mit Annotationen, kombiniert zu Dashboard mit PIL und veröffentlicht im Kanal. Enthält Prüfungen auf Datenfrische und Duplikat-Schutz. Geeignet für tägliche Team-BI-Berichte.

Redash automatisieren: tägliche Diagramme in Mattermost
Advertisement 728x90

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:

Google AdInline article slot
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:

Google AdInline article slot
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:

Google AdInline article slot
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

Advertisement 728x90

Weiterlesen