コンピュータ

BOINCの稼働状況をGrafanaで一望する Exporter を作った

複数台のマシンで BOINC を回しているのですが、「いま各ホストがどのタスクをどこまで進めているのか」をまとめて確認する手段がなくて地味に不便だったので、Prometheus 互換の Exporter を作りました。

各ホストの BOINC クライアントに GUI RPC で接続してメトリクスを集め、Grafana で一枚のダッシュボードに集約できます。眺めているだけで自己満足できる、いい感じのやつができました✨

リポジトリはこちらです。

GitHub - seizu-dev/boinc-exporter: A Prometheus / VictoriaMetrics exporter for BOINC that collects task status, credits, and project information via the BOINC GUI RPC interface.
A Prometheus / VictoriaMetrics exporter for BOINC that collects task status, credits, and project information via the BOINC GUI RPC interface. - seizu...
スポンサーリンク

背景

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

UGREEN NAS DXP2800とOracle Cloud Always FreeでImmichを快適に運用する
以前、Raspberry Pi 5 + 自宅NASでImmichを動かそうとして断念した話を書きました。その後、構成を見直して UGREEN NAS DXP2800 と Oracle Cloud Always Free の組み合わせに移行したところ、かなり快適になった話です✨前回の記事はこちらをご覧...

ホストが1台だけなら BOINC Manager で十分なのですが、台数が増えてくると話が変わってきます。各ホストに個別につなぎ直して進捗を確認するのは面倒ですし、「今月どのプロジェクトにどれだけクレジットが積み上がったか」のような時系列の推移は Manager では追いにくいんですね。

そこで、全ホストの状況を一箇所で時系列付きで眺められるようにしたかった、というのが今回の動機です。

BOINC(Berkeley Open Infrastructure for Network Computing)は、自分のマシンの空きリソースを科学計算プロジェクトに提供できる分散コンピューティング基盤です。Asteroids@home や Einstein@Home など、参加するプロジェクトごとに「クレジット」が貢献度として積み上がっていきます。

仕組み

構成のポイントは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 … 可視化
flowchart TD subgraph HOST1["BOINCホスト1"] C1["BOINC\nクライアント"] -->|"GUI RPC"| E1["boinc-exporter"] E1 -->|"スクレイプ"| A1["vmagent"] end subgraph HOST2["BOINCホスト2"] C2["BOINC\nクライアント"] -->|"GUI RPC"| E2["boinc-exporter"] E2 -->|"スクレイプ"| A2["vmagent"] end A1 -->|"push\n(remote write)"| VM["VictoriaMetrics"] A2 -->|"push\n(remote write)"| VM VM -->|"クエリ"| GRA["Grafana"]

この push 型のうれしいところは2つあります。1つは、ホストが増えても VictoriaMetrics 側の設定を変えなくていいこと。新しいホストの vmagent に送信先を教えるだけで、勝手にデータが集まってきます。もう1つは、BOINC ホスト側が外部にエンドポイントを公開しなくていいことです。スクレイプ型(pull)だと収集側からホストの /metrics に届く必要がありますが、push 型なら各ホストから送信するだけなので、ホスト側のポートを外に開ける必要がありません。手軽さと安全性の両面で都合がいいんですね。

リポジトリに付属している docker-compose は、exporter・VictoriaMetrics・Grafana をまとめて1台で動かすスクレイプ型(pull)の構成です。ローカルでお試しするにはこちらが手軽です。上記の vmagent を使った push 型は、複数ホストを実運用する際の私の構成例で、付属 compose とは異なります。

公開しているメトリクス

主なものはこのあたりです。タスクの進捗率からプロジェクト別・ホスト別のクレジット、ジョブの成功・失敗数まで取れます。

メトリクス 種別 説明
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 にアクセスして、付属のダッシュボードで状況を確認できます。

先に書いた vmagent を使った push 型の構成は付属 compose には含まれていないので、複数ホストでの実運用はそちらを組み合わせる形になります。具体的なセットアップ手順はリポジトリの README を参照してください。

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 を参照してください。

GitHub - seizu-dev/boinc-exporter: A Prometheus / VictoriaMetrics exporter for BOINC that collects task status, credits, and project information via the BOINC GUI RPC interface.
A Prometheus / VictoriaMetrics exporter for BOINC that collects task status, credits, and project information via the BOINC GUI RPC interface. - seizu...

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

コメント

タイトルとURLをコピーしました