複数台のマシンで BOINC を回しているのですが、「いま各ホストがどのタスクをどこまで進めているのか」をまとめて確認する手段がなくて地味に不便だったので、Prometheus 互換の Exporter を作りました。
各ホストの BOINC クライアントに GUI RPC で接続してメトリクスを集め、Grafana で一枚のダッシュボードに集約できます。眺めているだけで自己満足できる、いい感じのやつができました✨
リポジトリはこちらです。

背景
以前の記事で書いたとおり、Oracle Cloud の Always Free 枠(Ampere A1 と E2.1.Micro)を活用して、自宅以外にもいくつか BOINC のクライアントを動かしています。

ホストが1台だけなら BOINC Manager で十分なのですが、台数が増えてくると話が変わってきます。各ホストに個別につなぎ直して進捗を確認するのは面倒ですし、「今月どのプロジェクトにどれだけクレジットが積み上がったか」のような時系列の推移は Manager では追いにくいんですね。
そこで、全ホストの状況を一箇所で時系列付きで眺められるようにしたかった、というのが今回の動機です。
仕組み
構成のポイントは2つです。まず boinc-exporter は BOINC クライアントと1対1で対応していて、各ホストごとに1つずつ立てます。そして、私の運用では各ホストに vmagent も置いて、ローカルの exporter をスクレイプし、その結果を中央の VictoriaMetrics へ push(remote write) しています。
- boinc-exporter … BOINC クライアントに GUI RPC(TCP/31416)で接続し、そのクライアントのメトリクスを公開。ホストごとに1つ
- vmagent … 同じホストの exporter をローカルでスクレイプし、VictoriaMetrics へ送信。ホストごとに1つ
- VictoriaMetrics … 各ホストから push されたメトリクスを収集・保存(Prometheus 互換)
- Grafana … 可視化
この push 型のうれしいところは2つあります。1つは、ホストが増えても VictoriaMetrics 側の設定を変えなくていいこと。新しいホストの vmagent に送信先を教えるだけで、勝手にデータが集まってきます。もう1つは、BOINC ホスト側が外部にエンドポイントを公開しなくていいことです。スクレイプ型(pull)だと収集側からホストの /metrics に届く必要がありますが、push 型なら各ホストから送信するだけなので、ホスト側のポートを外に開ける必要がありません。手軽さと安全性の両面で都合がいいんですね。
公開しているメトリクス
主なものはこのあたりです。タスクの進捗率からプロジェクト別・ホスト別のクレジット、ジョブの成功・失敗数まで取れます。
| メトリクス | 種別 | 説明 |
|---|---|---|
boinc_up |
Gauge | クライアントへの接続状態(1=接続中、0=切断) |
boinc_tasks_total{state} |
Gauge | 状態別のタスク数 |
boinc_task_fraction_done{name,project_url} |
Gauge | 実行中タスクの進捗率(0〜1) |
boinc_project_total_credit{project,url} |
Gauge | プロジェクトの累積クレジット |
boinc_project_avg_credit{project,url} |
Gauge | プロジェクトの直近1日平均クレジット |
boinc_host_total_credit{project,url} |
Gauge | このホストが貢献した累積クレジット |
boinc_host_avg_credit{project,url} |
Gauge | このホストが貢献した直近1日平均クレジット |
boinc_project_jobs_success_total{project,url} |
Gauge | 成功ジョブ数 |
boinc_project_jobs_error_total{project,url} |
Gauge | 失敗ジョブ数 |
ダッシュボード
付属の Grafana ダッシュボードがこちらです。
ホスト別の稼働状況(UP/DOWN)、実行中タスクの進捗一覧、プロジェクト別クレジットの推移などが一画面にまとまっています。実行中タスクのタイムライン(state timeline)で、どのホストがいつ何タスク回していたかも追えるので、眺めていて割と楽しいです。
使い方
手軽に試すなら、付属の docker-compose(スクレイプ型)が一番早いです。exporter・VictoriaMetrics・Grafana がまとめて起動するので、GUI RPC パスワードを渡すだけで動きます。
git clone https://github.com/surface0/boinc-exporter.git
cd boinc-exporter
# gui_rpc_auth.cfg の中身を指定
export BOINC_PASSWORD=your_password
docker compose up -d
Exporter は BOINC クライアントに接続するので、クライアント側では cc_config.xml でリモート接続を許可しておきます。
<cc_config>
<options>
<allow_remote_gui_rpc>1</allow_remote_gui_rpc>
</options>
</cc_config>
起動したら Grafana にアクセスして、付属のダッシュボードで状況を確認できます。
DockerHub にもイメージを上げてあるので、自前でビルドせずに使うこともできます。
docker pull seizu/boinc-exporter
push 型の構成例
各 BOINC ホストに置く、exporter + vmagent の docker-compose の例です。vmagent のスクレイプ設定は configs で直接書き、VictoriaMetrics への送信先と Basic 認証情報は command に環境変数で渡しています。
services:
boinc-exporter:
image: seizu/boinc-exporter
environment:
BOINC_HOST: host.docker.internal
BOINC_PORT: "31416"
BOINC_PASSWORD: ${BOINC_PASSWORD}
restart: unless-stopped
vmagent:
image: victoriametrics/vmagent
depends_on:
- boinc-exporter
command:
- "-promscrape.config=/etc/vmagent/scrape.yml"
- "-remoteWrite.url=${VM_REMOTE_WRITE_URL}"
- "-remoteWrite.basicAuth.username=${VM_USER}"
- "-remoteWrite.basicAuth.password=${VM_PASSWORD}"
configs:
- source: scrape_config
target: /etc/vmagent/scrape.yml
restart: unless-stopped
configs:
scrape_config:
content: |
scrape_configs:
- job_name: boinc
static_configs:
- targets:
- boinc-exporter:9101
.env に各ホストの値を書いておきます。VM_REMOTE_WRITE_URL は中央 VictoriaMetrics の /api/v1/write を指定します。
BOINC_PASSWORD=your_gui_rpc_password
VM_REMOTE_WRITE_URL=http://victoriametrics.example:8428/api/v1/write
VM_USER=your_user
VM_PASSWORD=your_password
この構成だと、BOINC ホスト側は外部にポートを公開せず、vmagent が中央へ送信するだけで済みます。ホストを増やすときも、この compose をコピーして .env を書き換えるだけです。
Grafana Cloud の無料プランでも使える
Exporter が吐くのは Prometheus 互換のメトリクスなので、ローカルの VictoriaMetrics + Grafana の代わりに、Grafana Cloud の無料プランに流し込んで使うこともできます。
可視化部分を自前でセルフホストしなくて済むので、手っ取り早く始めたい場合や、外出先からも気軽に状況を確認したい場合はこちらが便利です。付属のダッシュボード JSON(grafana/dashboards/boinc.json)をそのままインポートすれば動きます。
まとめ
複数ホストの BOINC をまとめて可視化したくて作った Exporter の紹介でした。OCI の Always Free と組み合わせて何台か回している身としては、全台の状況が一画面で見られるようになって満足度が高いです。
詳しい設定はリポジトリの README を参照してください。

ご意見・ご質問はお気軽にどうぞ😊




コメント