mackeralで個人用Windowsマシンのバッテリー残量を監視する

# 概要

mackerel[^1]を個人用のWindows OSマシンに入れて、バッテリー残量監視をするまでの手順。
ついでに、ストレージ空き容量やメモリ、CPUの使用量も監視する[^2]。

「サーバー管理しているわけじゃないんだけど、プライベートで手持ちのマシンが複数あるので、それでMackerelを試してみたい」って人向け。次の人を対象とする。

- 初めてmackerelに触れる人。
- Windowsユーザー（Linuxの知識は無い）。

「Macbookでやってみた」や「やってみたら出来た（詳細の説明なし）」はあるんだけど、Windowsでやってみた、が見つからなかった[^3](#3)。なので書いてみる。なお当方はWindows10 Home環境で動作検証をした。

この記事で紹介する「mackerelにアカウントを作る」ところから始めて「バッテリー監視を開始する」までは、**１ｈあれば完了できる**。また、Agentのインストールによるメモリ使用量の増加などは、ほぼ無い（10MB未満）。


# やりかた

1. Mackerelにアカウントを作成して、対象マシン（＝ホスト、と呼ぶ）を登録する。
2. カスタムプラグインとして、バッテリー残量を投稿するように設定する。

以下で具体的な手順を説明する。

# Mackerelに対象マシンを登録

こちらの投稿「[mackerelをWindowsマシンにインストールする手順メモ](https://qiita.com/hoshimado/items/35ea593f27199b04f0a7)」を参照のこと[^4]。


# カスタムラグインとして「バッテリーのメトリックス」を登録

対象のホスト（＝マシン）は、「Mackerelに登録済みでCPUやMemoryなどの基本的なグラフが参照できる状態」とする（上述の「登録する」が終わった状態）。

Mackarelでの表示する情報（＝メトリック？）に「バッテリー残量のグラフ」を追加するには、**カスタムプラグインとして投稿**するよう設定追加すればよい。具体的には、次のようにして行う。

1. バッテリー残量を取得するスクリプトを書く。
2. 作成したスクリプトを定期的に呼び出すように、Mackerelの設定ファイルに追記する。

なお、カスタムプラグインとはMackerelが提供する次の機能。

> ホストごとのメトリックには「loadavg5」や「cpu.user」などエージェントが自動で投稿するメトリックに加えて、任意の値（カスタムメトリック）を定期的にエージェントから投稿できます。


## Windows上でバッテリー残量を取得するスクリプトを書く

バッテリー残量は、vbsスクリプトを利用してWMI経由で取得できる。
細かいことは置いておいて、次のようなスクリプトを作成して任意のフォルダに保存する。

```VBScript:metrics-battery.vbs
'-----------------------------------------------------------------
' ノートPCのバッテリ算容量を今現在のUnixタイムと合わせて取得する
' usage: cscript /Nologo metrics-battery.vbs
'-----------------------------------------------------------------
Set rows = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * from Win32_Battery",,48)

Dim epochSeconds
epochSeconds = DateDiff("s", "1970/01/01 00:00:00", Now()) - 32400

For Each row in rows
    Wscript.Echo "battery.ChargeRemaining" & vbTab & row.EstimatedChargeRemaining & vbTab & epochSeconds
Next
```

上記を、次のようにして呼び出す。

```cmd
cscript /Nologo metrics-battery.vbs
```

すると、次のように出力される。

```cmd
battery.ChargeRemaining	56	1545815593
```

- 1つ目が値の名称（任意に名付け）で、2つ目がバッテリー残量（％）、3つ目がUnix時間（秒）。区切りはタブ文字。
- 出力文字列は、次のMackerelの仕様に沿っている。

    https://mackerel.io/ja/docs/entry/advanced/custom-metrics#post-metric

> {metric name}\t{metric value}\t{epoch seconds} 
>
> 名前の最後のドットまでが共通するメトリックがひとつのグラフにまとめられ、ホスト詳細で閲覧できます。

## カスタムプラグインとして設定を追加する

Mackerelの設定ファイル「`mackerel-agent.conf`」は、インストール先フォルダに置かれている。
通常は、次のいづれかにある[^5]。

`C:\Program Files (x86)\Mackerel\mackerel-agent`

`C:\Program Files\Mackerel\mackerel-agent`

このファイルを任意のエディタで開いて編集する。私はメモ帳で開いた。ここで、エディタは【**管理者権限**】で起動すること。さもないと、【保存操作でエラーは出ない】のにファイルを更新できないという罠に嵌る（ハマった）。

これは、Not管理者権限でProgram Filesフォルダのファイルを開いた際に、その保存先を「仮想ストア」に**勝手にリダイレクトするWindowsの仕様**による。今回例であれば、`C:\Program Files (x86)\Mackerel\mackerel-agent` に書きこんだつもりで、実際には
`C:\Users\【ユーザー名】\AppData\Local\VirtualStore\Program Files (x86)\Mackerel\mackerel-agent` に書きこまれてしまう（この辺のWindowsのUACに関する話しはこちらのページが分かり易い→ http://www.trycut.com/uac.htm )。

設定ファイルを開いたら、末尾（じゃなくてもいいけど）の次の部分、追記の例がコメントアウトで書いてる個所

```
# Configuration for Custom Metrics Plugins
# see also: https://mackerel.io/ja/docs/entry/advanced/custom-metrics
#
# [plugin.metrics.vmstat]
# command = "ruby C:\path\to\plugins\metrics-vmstat.rb"
# [plugin.metrics.curl]
# command = "ruby C:\path\to\plugins\metrics-curl.rb"
```

の後に、次の設定を追記する。

```
[plugin.metrics.battery]
command = "cscript /Nologo [vbsファイルを保存したフォルダパス]\\metrics-battery.vbs"
```

ここで、vbsスクリプトを保存したフォルダへのパスの円マーク「`\`」は、「`\\`」と**エスケープして書く**こと。追記したら保存する。

設定ファイルが正しく記述されたかは、`mackerel-agent.exe` を `once` オプションを付けて起動して実際にメトリックを収集することで確認できる。実行結果に、**エラー表示（fail 等の文字列）が無ければ**、正しく設定できている。なお、出力文字列を「battery」の文字列で検索することでバッテリー残量値が出力されていることも確認できる。

```cmd
mackerel-agent.exe once
```

https://mackerel.io/ja/docs/entry/spec/agent#config-file

> 起動オプション
> 
> -once 一度だけメトリックの収集を実行して標準出力に表示します。投稿は行われません。

# Agentを再起動して、設定変更を反映する

設定ファイルを更新したら、Win＋Sで「Service」と打ってサービス管理を起動して、mackerel-agentを選択して右クリックから「再起動」を実行する。

![Mackerel-agentサービスを再起動](https://qiita-image-store.s3.amazonaws.com/0/125588/f1fca806-704b-cf17-3671-6dbf5f2d49f3.png)


もしくは管理者権限コマンドプロンプトで以下を順に打つ。

```cmd
net stop mackerel-agent
net start mackerel-agent
```

# 表示の様子

Mackerelのダッシュボードから対象ホストを開くと、次のようにバッテリー残量のグラフが表示されている。
出来た！

![バッテリー残量のグラフ](https://qiita-image-store.s3.amazonaws.com/0/125588/54b28e3c-c38c-2121-5bcb-c22ac753531c.png)

以上ー。

# その他

バッテリー残量の監視が目的だったんだけど、ストレージの空き容量とかメモリの使用状況とかを気楽に見れるの、良いかもしれない？

# 参考サイトなど

- Mackrerel＞ホストのカスタムメトリックを投稿する

    https://mackerel.io/ja/docs/entry/advanced/custom-metrics

- Mackrerel＞設定ファイル

    https://mackerel.io/ja/docs/entry/spec/agent#config-file


- MacBook を Mackerel で監視し始めた & mackerel-plugin-darwin-battery を書いた

    https://astj.hatenablog.com/entry/2016/06/19/140406

- Mackerel で MacBook のバッテリー残量を記録する話

    https://blog.nishimu.land/entry/2015/03/25/073305



[^1]: Mackerelは「はてなが開発した新世代のサーバ管理・監視サービス」。もちろんだが、本来の用途はサーバーの監視であって個人PCの監視ではない。https://mackerel.io/ 

[^2]: 順序が逆です。ストレージやメモリを監視するのが本来の目的であって、バッテリー監視が「ついで」です。

[^3]: わざわざ書くまでも無いから、という話はあるかもしれない。確かに、出来てみれば「なんだ、簡単じゃないか」という内容だった。

[^4]: 初めてMackerelにアカウントを作ることを前提に「2週間のトライアル期間」を前提に説明していますが、2週間経過後の通常の「フリープラン」の範囲でも同様に操作と利用が可能です。

[^5]: Windowsに関しては、置き場の記載が見当たらなかった。インストールフォルダにあったので労せずに見つけられはしたけども。なおLinuxに関しては `/etc/mackerel-agent/mackerel-agent.conf` がデフォルトの格納場所、と記載があった。