自宅の Jetson で動いている WebRTC Native Client Momo を外出先でいい感じに監視する方法

3 min read読了の目安(約2900字

やりたいこと

やったこと

Momo を改造して、RTCConnection.GetStats() の結果を HTTP API 経由でとれるようにした

https://github.com/hakobera/momo/pull/4

Momo Release 2020.9 の時点では、RTCConnection.GetStats() は Sora につないだ時の ping メッセージの応答でしか取得できないので、これを test, ayame, sora 全てで取得できるように Momo を改造して、Metrics APIを実装した。
Momo Release 2020.11 以降の公式バイナリは Metrics API が実装済み。

ポート番号は --metrics-port オプションで指定可能。

例えば、次のオプション付きで起動した場合、http://localhost:8081/metrics が Metrics API のエンドポイントになる。

$ momo --metrics-port 8081 test

この API は Prometheus 形式ではなく、JSON を返すので、Prometheus 以外のモニタリングツールや自作プログラムなどとも連携できる。

Momo Metrics API API を叩く Prometheus Exporter を作った

https://github.com/hakobera/momo_exporter

Momo の Metrics API のレスポンスは JSON で Prometheus から直接 Scraping できないので、Momo Exporter を Go で書いた。これは少し前までの HAProxy Exporter と同じコンセプトでの実装である。

なぜこうした方かというと、主には以下の2点。

  • Momo は C++ で書かれているので、Prometheusクライアント組み込みとかをすると、ビルドの難易度が上がってしまう
  • WebRTC Stats はまだドラフトの状態で、そこそこ変更が入るので、そのたびに Momo の改造をしていくのは面倒である

現時点では、一部の stats しか実装していない上に、label の実装がいまいちな点があるが、、今後使っていきながら改善していきたい。Prometheus の Go Client は良くできているので、実装も楽だった。

Prometheus - New Relic - Grafana Cloud 連携

自宅ネットワークを開放したくないので、なんらかの形で Prometheus のデータを外部に Push しないといけない。はじめは Push Gateway を利用する方法も考えていたのだが、タイミングよく New Relic の Telemetry Data Platform が Prometheus の Remote Storage に対応していたので、New Relic にデータを保存することにした。

また、New Relic は PromQL によるクエリをサポートしているので、Grafana Cloud の Prometheus 連携機能を利用して、ダッシュボードを作成した。

この辺のやり方は New Relic の公式ブログに書いてある方法をそのまま使った。

Create Grafana Dashboards with Prometheus Data Stored in New Relic

Jetson Xavier NX のセットアップが簡単にできるように Ansible の Playbook を書いた

https://github.com/x-hakobera-webrtc/momo-jetson-ansible

毎回、手作業で設定するのは面倒だったので、上記の設定を Ansible できるようにした。 Momo はサービスとしては起動させていないが、/opt 配下にダウンロードされるようにしている。

結果

やってみた感想

Node Exporter と Momo Exporter の Metrics を1つのダッシュボードにできた。今まで、jtop と chrome://webrtc-internals で別々に見ていたので、綺麗にまとまってうれしい。内部ネットワークを解放せずに、自宅内のマシンを外出先からでも確認できて、安全だし、便利。