🔋

UPSの状態をMackerelで可視化する: apcupsdとPythonを使ったカスタムプラグイン

2024/07/01に公開

UPSの状態をMackerelで可視化する: apcupsdとPythonを使ったカスタムプラグイン

はじめに

サーバーの安定稼働にとって、電源の安定供給は非常に重要です。そのため、多くの環境でUPS(無停電電源装置)が使用されています。UPSの状態を常に監視することで、潜在的な問題を早期に発見し、対応できます。

この記事では、apcupsdを使用してUPSの情報を取得し、それをPythonスクリプトでMackerelに送信する方法を紹介します。これにより、UPSの状態をリアルタイムで可視化し、監視することが可能になります。

前提条件

  • Linux環境(Ubuntu, CentOSなど)
  • Python 3.x
  • apcupsd
  • Mackerelアカウントとエージェント

セットアップ手順

1. apcupsdのインストールと設定

まず、apcupsdをインストールします:

sudo apt install apcupsd  # Ubuntu/Debian
# または
sudo yum install apcupsd  # CentOS/RHEL

次に、/etc/apcupsd/apcupsd.conf を編集します。
変更した差分は以下です。

320fc
> UPSNAME BR550S
---
< #UPSDNAME
90c90
>  #DEVICE /dev/ttyS0
---
< DEVICE /dev/ttyS0

変更後の設定ファイル例を以下に記載します。

UPSNAME BR550S
UPSCABLE usb
UPSTYPE usb

NETSERVER on
NISIP 127.0.0.1
NISPORT 3551

ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 0

ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0

EVENTSFILE /var/log/apcupsd.events
EVENTSFILEMAX 10

STATFILE /var/log/apcupsd.status
STATTIME 0

LOGSTATS off
DATATIME 0

この設定では、USBでUPSに接続し、standaloneで動作する前提の設定ファイルです。

2. Pythonスクリプトの作成

以下のPythonスクリプトを作成し、/etc/mackerel-agent/plugins/ups.py として保存します

#!/usr/bin/env python3

import subprocess
import re
import time

def get_apcaccess_output():
    result = subprocess.run(['apcaccess'], capture_output=True, text=True)
    return result.stdout

def parse_apcaccess_output(output):
    metrics = {}
    patterns = {
        'linev': r'LINEV\s+:\s+([\d.]+)\s+Volts',
        'loadpct': r'LOADPCT\s+:\s+([\d.]+)\s+Percent',
        'bcharge': r'BCHARGE\s+:\s+([\d.]+)\s+Percent',
        'timeleft': r'TIMELEFT\s+:\s+([\d.]+)\s+Minutes',
        'battv': r'BATTV\s+:\s+([\d.]+)\s+Volts'
    }

    for key, pattern in patterns.items():
        match = re.search(pattern, output)
        if match:
            metrics[key] = float(match.group(1))

    return metrics

def main():
    output = get_apcaccess_output()
    metrics = parse_apcaccess_output(output)
    
    timestamp = int(time.time())
    
    for key, value in metrics.items():
        print(f"ups.{key}\t{value}\t{timestamp}")

if __name__ == '__main__':
    main()

スクリプトに実行権限を付与します:

sudo chmod +x /etc/mackerel-agent/plugins/ups.py

3. Mackerelエージェントの設定

Mackerelエージェントの設定ファイル(通常は /etc/mackerel-agent/mackerel-agent.conf)に以下の設定を追加します:

[plugin.metrics.ups]
command = ["python3", "/etc/mackerel-agent/plugins/ups.py"]

設定後、Mackerelエージェントを再起動します:

sudo systemctl restart mackerel-agent

動作確認

設定が完了したら、Mackerelのダッシュボードを確認します。"Ups"という名前のグラフグループが作成され、以下のメトリクスが表示されるはずです:

  • ups.linev: 入力電圧 (V)
  • ups.loadpct: 負荷率 (%)
  • ups.bcharge: バッテリー充電率 (%)
  • ups.timeleft: 残り稼働時間 (分)
  • ups.battv: バッテリー電圧 (V)

まとめ

このセットアップにより、UPSの重要な情報をMackerelで可視化し、監視できます。異常な値が検出された場合にアラートを設定するなど、さらなるカスタマイズも可能です。

UPSの状態を常に把握することで、電源関連の問題を事前に察知し、サーバーの安定稼働を維持するための対策を講じることができます。

追記

mackerelの慣習に則って、mkr コマンドでインストールできるようにGolangでも書いておきました。

https://github.com/matsubo/mackerel-plugin-apcupsd

Discussion