導入(問題提起)
Webシステム開発は公開して終わりではありません。安定稼働と継続的な成果創出には「監視と分析」が必須です。ページが遅い、予約が減った、エラーが増えた――気付くのが遅れるほど機会損失は大きくなります。特にExcel Web化を済ませたばかりの業務システムは、可視化が弱いとボトルネックが主観になりがちです。本記事では、小さな会社でも無理なく回る“計測→通知→改善”の仕組みを、Pythonを軸に実装と運用の両面から解説します。
課題の詳細説明
監視・分析が定着しない理由を具体化します。
- 監視項目が多すぎて運用不能(ノイズだらけで誰も見ない)
- 閾値や重大度が曖昧で、夜間に不要アラートが鳴る
- データが散在:アクセス解析と業務KPIが分断され、意思決定に使えない
- 施策の効果測定ができない(計測設計がない/ABの比較母数が不明)
- エラーは「お客様からの連絡」で知る(一次情報が遅い)
根本は「最小セットから始め、運用可能な粒度で増やす」原則の欠如です。
解決方法(設計の全体像)
- 基盤監視:死活・応答時間・エラー率を最小セットで可視化
- 体験監視:コアWebバイタル(LCP/CLS/TTFB)とフォーム離脱を継続計測
- 事業KPI:問い合わせ・予約・売上など“お金に近い指標”を定義
- 通知運用:重大度(情報/警告/致命)と閾値・通知先・時間帯ルール
- 週次レビュー:数値→仮説→施策→検証のPDCAを固定会議体に
- 内部ダッシュボード:Python Webアプリで“見る場”を用意(Excel卒業)
具体例(ツールと手順)
1) アプリ/サーバ監視(最小)
- ログ集約:アプリログをJSON化し、時系列で保存+検索(ローテーション)
- エラー通知:例外回数やHTTP 5xxを閾値でアラート(5分間でN件など)
- ボトルネック把握:リクエスト時間/SQL時間/外部API時間を分離計測
Python(Bottle/FastAPI/uvicorn)の場合、標準ログを構造化し軽量スタックで集約します。
2) 表示速度/体験の継続計測
- PageSpeed InsightsとCrUXでLCP/CLS/TTFBを把握
- 画像最適化(WebP/AVIF)、キャッシュ、CDNの適用
- フォーム離脱率:入力イベントの計測と再来訪の追跡
3) 事業KPIダッシュボード(Python Webアプリ活用)
- 例:問い合わせ数、予約確定率、キャンセル率、LTV、リピート率
- データはSQLite/MySQLから集計し、ダッシュボードで可視化
- 月次目標値と実績を並置し、達成率を色分け
4) 通知運用
- 重大度3段階(情報/警告/致命)+当直ルール(夜間は致命のみ即時)
- チャネル:Chat/メール。サマリ(朝夕)とリアルタイムを使い分け
- 当番表:休日代行/エスカレーション先を明示
技術的な解説(ミニ実装:計測→保存→可視化)
1) ログとメトリクスの発行
import time, json, logging
logger = logging.getLogger('app')
def emit_timing(name, ms, tags=None):
logger.info(json.dumps({'type':'metric','name':name,'ms':ms,'tags':tags or {}}))
def timed(func):
def wrap(*a, **kw):
t0 = time.time()
try:
return func(*a, **kw)
finally:
emit_timing(func.__name__, int((time.time()-t0)*1000))
return wrap
2) KPI集計API(SQLite)
import sqlite3, json, datetime as dt
def daily_kpi(db_path: str):
con = sqlite3.connect(db_path)
cur = con.cursor()
today = dt.date.today().isoformat()
q = """
SELECT date(created_at) d,
COUNT(*) inquiries,
SUM(CASE WHEN status='confirmed' THEN 1 ELSE 0 END) confirmed
FROM reservations
WHERE date(created_at)=date('now')
GROUP BY date(created_at)
"""
cur.execute(q)
row = cur.fetchone() or (today, 0, 0)
con.close()
return json.dumps({"date": row[0], "inquiries": row[1], "confirmed": row[2]})
3) ダッシュボード(Bottleの簡易ルート)
from bottle import Bottle, response
app = Bottle()
@app.get('/dashboard/kpi')
def kpi_view():
data = json.loads(daily_kpi('app.db'))
# テンプレート省略:JSONで返す最小例
return data
4) アラート設計のサンプル
SEVERITY = {
'info': {'notify':'digest'},
'warning': {'notify':'daily'},
'critical':{'notify':'immediate'}
}
def alert(name, severity, message, now=None):
rule = SEVERITY[severity]
# Chat/メールへの送信処理を実装。夜間はcriticalのみ等のルール適用
pass
導入の流れ(4週間ローンチ)
- 監視の最小セットを決定(死活/応答時間/エラー率/バッチ結果)
- ログの構造化と保存先決定(ローテーション/検索手順)
- KPI定義(問い合わせ/予約/売上など3〜5個に絞る)
- Pythonで内部ダッシュボード作成(一覧/推移/明細)
- 通知ルール(重大度/時間帯/当番)とエスカレーション表の整備
- 週次レビュー開始:数字→仮説→施策→検証を回す
まとめ
- 完璧を目指さず「最小構成で開始」し、週次で改善を刻む
- 技術指標(稼働/速度/エラー)と事業指標(問い合わせ/予約)を両輪で追う
- Pythonで内部ダッシュボードを作ればExcel依存から脱却でき、業務システムの意思決定が加速する
問い合わせ導線
業務システムやExcel Web化の監視・分析設計までご支援します。詳しくはお問い合わせへ。
Webシステム開発のご相談は monou まで