日本の祝日全てをMackrelのダウンタイムに設定したい

日本の祝日全てをMackrelのダウンタイムに設定したい

Clock Icon2025.02.21

Nocabaseで作成した業務用アプリを使っているのですが、休日祝日はアプリを停止することが多いです。
祝日のMackrelでのダウンタイム設定を手動で設定していたのですが、忘れることが多いのでまとめて一気に登録してしまおうと思います。

手順

  1. holidays-jp.github.ioのAPIを使用して日本の祝日データを取得
  2. 各祝日に対して、0:00から23:59:59までのダウンタイムを設定
  3. MackerelのAPIを使用してダウンタイムを登録

この手順をPythonを使って実行できるようにします(Google Colabで動かす)。

準備

MACKEREL API KEYの取得

MackerelのAPIを使用するためにAPI KEYを取得しておきます。

APIキーはダッシュボードのAPIキータブ を開いて作成できます。

スクリーンショット 2025-02-21 11.37.32

今回は登録する必要があるのでWrite権限をつけます。

パッケージのインストール

今回はrequestsが必要です。

pip install requests

実装する

日本の祝日データを取得

import requests
import json

def get_japan_holidays(year):
    """
    指定された年の日本の祝日を取得する
    """
    try:
        url = f"https://holidays-jp.github.io/api/v1/{year}/date.json"
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        logger.error(f"祝日データの取得に失敗しました: {str(e)}")
        raise

祝日一覧を取得したい年を引数にとり、祝日取得APIにアクセスし、結果を返します。

スクリーンショット 2025-02-21 11.46.16

Mackerelにダウンタイムを設定する

from datetime import datetime, timedelta
from google.colab import userdata
import logging
import sys

# ロガーの設定
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[logging.StreamHandler()]
)
logger = logging.getLogger(__name__)

def create_mackerel_downtime(api_key, service_name, start_time, end_time, description):
    """
    Mackerelにダウンタイムを設定する
    """
    try:
        url = "https://api.mackerelio.com/api/v0/downtimes"
        headers = {
            "X-Api-Key": api_key,
            "Content-Type": "application/json"
        }

        # 期間を分単位で計算
        duration_minutes = int((end_time - start_time).total_seconds() / 60)

        payload = {
            "name": f"Holiday: {description}",
            "memo": description,
            "start": int(start_time.timestamp()),
            "duration": duration_minutes,  # 分単位で指定
            "serviceScopes": [service_name]
        }

        response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=10)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        logger.error(f"Mackerelへのダウンタイム設定に失敗しました: {str(e)}")
        raise

def setup_holiday_downtimes(api_key, service_name, year):
    """
    指定された年の全祝日についてダウンタイムを設定する
    """
    try:
        if not api_key or not service_name:
            raise ValueError("APIキーとサービス名は必須です")

        holidays = get_japan_holidays(year)
        if not holidays:
            logger.warning(f"{year}年の祝日データが存在しません")
            return

        success_count = 0
        error_count = 0

        for date_str, holiday_name in holidays.items():
            try:
                # 日付文字列をdatetimeオブジェクトに変換
                holiday_date = datetime.strptime(date_str, "%Y-%m-%d")

                # ダウンタイムの開始時刻と終了時刻を設定
                start_time = holiday_date.replace(hour=0, minute=0, second=0)
                end_time = holiday_date.replace(hour=23, minute=59, second=59)

                # Mackerelにダウンタイムを登録
                create_mackerel_downtime(
                    api_key,
                    service_name,
                    start_time,
                    end_time,
                    holiday_name
                )

                success_count += 1
                logger.info(f"ダウンタイム設定完了: {date_str} - {holiday_name}")

            except Exception as e:
                error_count += 1
                logger.error(f"{date_str}のダウンタイム設定中にエラーが発生しました: {str(e)}")
                continue

        logger.info(f"処理完了 - 成功: {success_count}, 失敗: {error_count}")

    except Exception as e:
        logger.error(f"予期せぬエラーが発生しました: {str(e)}")
        raise

if __name__ == "__main__":
    # 設定値
    MACKEREL_API_KEY = "your-api-key-here"
    SERVICE_NAME = "your-service-name"
    YEAR = datetime.now().year

    # 実行
    setup_holiday_downtimes(MACKEREL_API_KEY, SERVICE_NAME, YEAR)

APIkey,ダウンタイムを設定したいサービス名,開始時刻、終了時刻を引数にし、

mackerelのダウンタイム登録APIにアクセスします、

これを実行すると

スクリーンショット 2025-02-21 12.00.35

祝日ごとに登録されます。

スクリーンショット 2025-02-21 13.16.46

できてたあ。

ほとんどClaudeくんが作ってくれました。すごいな。

スクリーンショット 2025-02-21 13.29.34

こんな感じでやり取りして作成できました。

日本の祝日をMackrelのダウンタイムに設定したい。
プログラミングで

setup_holiday_downtimes 実行時は例外処理を入れたい

recurrenceオプションは繰り返し無しの場合は不要

durationは秒ではなく、分でした

自分だけで使うのであればこれでも十分かなと思いました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.