Redash 대시보드 자동화: Mattermost로 차트 전송하기
Python 스크립트를 사용하면 Redash에서 Mattermost로 차트를 자동으로 전송할 수 있습니다. API를 통해 데이터를 가져오고, matplotlib로 시각화를 재현하며, 여러 차트를 하나의 대시보드로 결합한 후 채널에 전송합니다. 데이터 업데이트가 지연되고 수동으로 대시보드를 확인하는 것이 비효율적인 팀에 이상적입니다.
파이프라인은 cron 작업으로 실행됩니다: 데이터 신선도를 확인하고, 주석이 달린 차트를 구축하며, 업무 시작 전에 최종 보고서를 게시합니다.
Redash API에서 데이터 가져오기
Redash는 query_id와 매개변수를 사용하여 쿼리를 실행할 수 있는 API를 제공합니다. 주요 함수:
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 스타일을 모방합니다: 색상, 선 유형, 크기. 기본 선 차트 예시:
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를 제공합니다:
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
아직 댓글이 없습니다.