홈으로 돌아가기

Mattermost의 Redash 봇: 차트 자동화

스크립트가 Redash에서 Mattermost로 차트 전송 자동화: API를 통해 데이터 가져오고, 주석이 포함된 matplotlib 시각화 생성, PIL로 대시보드 결합하여 채널에 게시. 데이터 신선도 검사 및 중복 방지 포함. 팀 일일 BI 보고서에 적합.

Redash 자동화: Mattermost 매일 차트
Advertisement 728x90

Redash 대시보드 자동화: Mattermost로 차트 전송하기

Python 스크립트를 사용하면 Redash에서 Mattermost로 차트를 자동으로 전송할 수 있습니다. API를 통해 데이터를 가져오고, matplotlib로 시각화를 재현하며, 여러 차트를 하나의 대시보드로 결합한 후 채널에 전송합니다. 데이터 업데이트가 지연되고 수동으로 대시보드를 확인하는 것이 비효율적인 팀에 이상적입니다.

파이프라인은 cron 작업으로 실행됩니다: 데이터 신선도를 확인하고, 주석이 달린 차트를 구축하며, 업무 시작 전에 최종 보고서를 게시합니다.

Redash API에서 데이터 가져오기

Redash는 query_id와 매개변수를 사용하여 쿼리를 실행할 수 있는 API를 제공합니다. 주요 함수:

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()

결과가 준비되지 않았다면 API는 작업을 반환합니다 — 완료될 때까지 폴링을 구현하세요. 대시보드의 경우 URL에서 매개변수를 파싱합니다:

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()
    }

'지난 7일'과 같은 동적 날짜는 수동으로 변환합니다:

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')
    }

차트 구축 및 주석 추가

시각화는 matplotlib에서 구축되며, Redash 스타일을 모방합니다: 색상, 선 유형, 크기. 기본 선 차트 예시:

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('지표 동향')

    return fig

핵심 단계는 정적 이미지에서 가독성을 위한 주석 추가입니다. 최신 값, 주간 변화, 계획 대비 편차를 추가합니다:

ax.annotate(
    f"값: {last_value}",
    xy=(last_date, last_value),
    xytext=(10, 10),
    textcoords='offset points'
)

이를 통해 상호작용 없이도 지표를 이해할 수 있습니다.

차트를 대시보드로 결합하기

여러 차트(지표, 카테고리별)를 PIL을 사용하여 하나의 이미지로 병합하여 더 나은 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)

부서나 주제별로 섹션 헤더를 추가하여 탐색을 용이하게 합니다.

확인 및 중복 전송 방지

스크립트는 데이터에서 목표 날짜를 확인합니다:

if df['date'].max() != target_date:
    raise Exception('데이터가 아직 업데이트되지 않았습니다')

상태 파일을 통해 중복 전송을 방지합니다:

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)

Mattermost로 전송하기

mattermostdriver를 사용하여 파일을 업로드하고 게시합니다:

from mattermostdriver import Driver

mm = Driver({
    'url': 'your-mattermost',
    'token': 'BOT_TOKEN',
})

mm.login()

mm.posts.create_post({
    'channel_id': channel_id,
    'message': '보고서 준비 완료',
    'file_ids': [file_id],
})

핵심 포인트

  • 자동화로 수동 작업 감소: 데이터 업데이트 시 메신저로 차트가 자동으로 도착합니다.
  • 차트에 주석을 추가하여 호버 상호작용 없이도 완전한 정보를 제공합니다.
  • 하나의 대시보드로 결합하여 채팅에서 UX를 개선합니다.
  • 신선도 및 중복 확인으로 파이프라인 신뢰성을 보장합니다.
  • 확장성 용이: 새로운 query_id와 매개변수를 추가하기 쉽습니다.

— Editorial Team

Advertisement 728x90

다음 읽기