導入(問題提起)

Webシステム開発は公開して終わりではありません。安定稼働と継続的な成果創出には「監視と分析」が必須です。ページが遅い、予約が減った、エラーが増えた――気付くのが遅れるほど機会損失は大きくなります。特にExcel Web化を済ませたばかりの業務システムは、可視化が弱いとボトルネックが主観になりがちです。本記事では、小さな会社でも無理なく回る“計測→通知→改善”の仕組みを、Pythonを軸に実装と運用の両面から解説します。

課題の詳細説明

監視・分析が定着しない理由を具体化します。

  • 監視項目が多すぎて運用不能(ノイズだらけで誰も見ない)
  • 閾値や重大度が曖昧で、夜間に不要アラートが鳴る
  • データが散在:アクセス解析と業務KPIが分断され、意思決定に使えない
  • 施策の効果測定ができない(計測設計がない/ABの比較母数が不明)
  • エラーは「お客様からの連絡」で知る(一次情報が遅い)

根本は「最小セットから始め、運用可能な粒度で増やす」原則の欠如です。

解決方法(設計の全体像)

  1. 基盤監視:死活・応答時間・エラー率を最小セットで可視化
  2. 体験監視:コアWebバイタル(LCP/CLS/TTFB)とフォーム離脱を継続計測
  3. 事業KPI:問い合わせ・予約・売上など“お金に近い指標”を定義
  4. 通知運用:重大度(情報/警告/致命)と閾値・通知先・時間帯ルール
  5. 週次レビュー:数値→仮説→施策→検証のPDCAを固定会議体に
  6. 内部ダッシュボード: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週間ローンチ)

  1. 監視の最小セットを決定(死活/応答時間/エラー率/バッチ結果)
  2. ログの構造化と保存先決定(ローテーション/検索手順)
  3. KPI定義(問い合わせ/予約/売上など3〜5個に絞る)
  4. Pythonで内部ダッシュボード作成(一覧/推移/明細)
  5. 通知ルール(重大度/時間帯/当番)とエスカレーション表の整備
  6. 週次レビュー開始:数字→仮説→施策→検証を回す

まとめ

  • 完璧を目指さず「最小構成で開始」し、週次で改善を刻む
  • 技術指標(稼働/速度/エラー)と事業指標(問い合わせ/予約)を両輪で追う
  • Pythonで内部ダッシュボードを作ればExcel依存から脱却でき、業務システムの意思決定が加速する

問い合わせ導線

業務システムやExcel Web化の監視・分析設計までご支援します。詳しくはお問い合わせへ。

Webシステム開発のご相談は monou まで