
日本の祝日全てをMackrelのダウンタイムに設定したい
Nocabaseで作成した業務用アプリを使っているのですが、休日祝日はアプリを停止することが多いです。
祝日のMackrelでのダウンタイム設定を手動で設定していたのですが、忘れることが多いのでまとめて一気に登録してしまおうと思います。
手順
- holidays-jp.github.ioのAPIを使用して日本の祝日データを取得
- 各祝日に対して、0:00から23:59:59までのダウンタイムを設定
- MackerelのAPIを使用してダウンタイムを登録
この手順をPythonを使って実行できるようにします(Google Colabで動かす)。
準備
MACKEREL API KEYの取得
MackerelのAPIを使用するためにAPI KEYを取得しておきます。
APIキーはダッシュボードのAPIキータブ を開いて作成できます。
今回は登録する必要があるので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にアクセスし、結果を返します。
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にアクセスします、
これを実行すると
祝日ごとに登録されます。
できてたあ。
ほとんどClaudeくんが作ってくれました。すごいな。
こんな感じでやり取りして作成できました。
日本の祝日をMackrelのダウンタイムに設定したい。
プログラミングで
setup_holiday_downtimes 実行時は例外処理を入れたい
recurrenceオプションは繰り返し無しの場合は不要
durationは秒ではなく、分でした
自分だけで使うのであればこれでも十分かなと思いました。