PrometheusでStarlinkを監視する方法

By 清水 孝郎 - FEBRUARY 24, 2022

SHARE:

本文の内容は、2022年2月24日にDaniel Moloneyが投稿したブログ(https://sysdig.com/blog/monitor-starlink/)を元に日本語に翻訳・再構成した内容となっております。

今回は、国内環境でのStarlinkの仕組みと、PrometheusによるStarlink接続の監視方法についてご紹介します。

SpaceX社のStarlinkは、地球低軌道上にある衛星を利用して、地球上のほとんどの地域で高速インターネットサービスを提供しています。ベータ版では、データ通信速度は50Mb/sから150Mb/s、遅延は20msから40msとなる見込みです。また、全く接続できない期間が短時間発生することも予想されます。現在、Starlinkの衛星は約1,800基が軌道上にあります。


Starlinkの接続を監視する方法

オープンソースコミュニティから利用できる素晴らしいプロジェクトはいくつかありますが、私たちがプロジェクトのベースとして使うことにしたのは、Daniel Willcocks氏のStarlink Prometheus Exporterです。もし、パッケージ化されたソリューションに興味があれば、彼の他のプロジェクトであるStarlink Monitoring Systemをご覧になることをお勧めします。

Starlink接続を監視するために、我々はStarlink Prometheus Exporterプロジェクトをフォークし、Starlink Dishyからいくつかの追加メトリクスを提供するために、最新のStarlinkファームウェアを使用してStarlink gRPCバインディングを更新するPRを作成することに決めました。また、ExporterのメンテナにもPRを送りました。

仕組みについて

Starlink Dishy は、192.168.100.1 のポート 9200 で gRPC のためにコンタクト可能です。StarlinkのWi-Fiルータを使用している場合、デフォルトで到達可能なはずです。この例では、Starlink Exporterを使用してStarlink DishyとgRPCで通信し、Prometheusが理解できる形式でメトリクスを公開することで、Starlink接続を監視することになります。

要件と使用するもの

  • Starlinkインターネットサービスにアクセスできること
  • Ubuntu 20.04 LTS が動作する Linux ノード
  • DockerおよびDocker Compose
  • Starlink Prometheus Exporter
  • Prometheus

Prometheusの設定とコンテナの起動

まず、Starlink ExporterをスクレイピングするためにPrometheusを設定する必要があります。以下のようにprometheusフォルダを作成し、設定ファイルprometheus.ymlを追加します。
global:
  scrape_interval:     10s # By default, scrape targets every 15 seconds.
  evaluation_interval: 10s # By default, scrape targets every 15 seconds.
  scrape_timeout:      10s # By default, it is set to the global default (10s).


  external_labels:
      monitor: 'starlink-exporter'
      origin_prometheus: 'starlink'

scrape_configs:
  - job_name: 'starlink'
    static_configs:
      - targets: ['127.0.0.1:9817']

次に、Docker Composeと以下のYAMLを使用して、PrometheusとStarlink Exporterコンテナを起動します(上記のprometheus.ymlと同じ場所にdocker-compose.ymlとして保存してください)。
version: '3.8'

volumes:
  prometheus_data: {}

services:
  starlink-exporter:
    image: sysdigdan/starlink_exporter:v0.1.3
    container_name: starlink_exporter
    restart: unless-stopped
    network_mode: host

  prometheus:
    image: prom/prometheus:v2.32.1
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    network_mode: host


そして、docker-compose.ymlとprometheus.ymlと同じディレクトリから、以下のコマンドでコンテナを起動することができます。
docker-compose up -d

すべてが実行されていることを確認しましょう:
docker ps

Prometheusダッシュボードでstarlink接続を監視する

両方のコンテナが稼働しているので、Prometheus (http://<NODE IP>:9090/) にアクセスして、Starlink Dishy (http://<NODE IP>:9817/metrics) から来る利用できるメトリクスを見ることができます。

starlink接続を監視します:パフォーマンスメトリクス

starlink_dish_downlink_throughput_bytes と starlink_dish_uplink_throughput_bytes を使用すると、スループット使用率のメトリクスを確認することができます。


また、starlink_dish_pop_ping_latency_secondsを使用すると、Starlink Dishy、衛星、および地上局間の遅延をすばやく確認することができます。

starlink接続を監視する:安定性メトリクス

停電の原因を理解することに興味がある場合、この PromQL クエリーを使用します。以下の PromQL を使用して、過去 24 時間のすべての停電を確認することができます。

sum by (cause) (sum_over_time(starlink_dish_outage_duration{cause!='UNKNOWN'}[24h])) / 10^9


また、発生回数を数えることもできます。
count by (cause) (count_over_time(starlink_dish_outage_duration{cause!='UNKNOWN'}[24h]))

PromQLをもっと深く知りたいですか?Prometheusがどのようにデータを保存し、PromQLの関数や演算子をどのように使用するかについては、PromQLの入門ガイドをお読みください。

starlink接続を監視する:トラブルシューティングメトリクス

次のPromQLを使用して衛星の障害物を理解する必要があります。これは、Dishy周辺の12個の30度ウェッジの障害物の測定値を示しています。
starlink_dish_wedge_abs_fraction_obstruction_ratio > 0




Sysdig Monitor LTSによるstarlink接続の監視

PrometheusとStarlink Exporterのセットアップが完了したところで、経年比較のために、より長い保持時間を確保する方法を考える必要があります。デフォルトでは、Prometheusは15日間のリテンションを提供します。これは調整可能ですが、ストレージとバックアップの管理が必要になるというデメリットがあります。

Sysdig Monitorのお客様が活用している機能の1つがPrometheus Remote Writeで、これにより多くのPrometheusサーバーからネイティブにメトリクスを取り込むことができるようになりました。また、ストレージの管理も不要で、長期保存や常時メトリクスの利用も可能なため、シンプルな選択と言えるでしょう

Prometheus Remote Writeの設定は簡単です。先ほど作成したprometheus.ymlファイルに、以下のようなremote_writeのセクションを新たに追加するだけです。
remote_write:
    - url: "https:///prometheus/remote/write"
      bearer_token: ""
      tls_config:
        insecure_skip_verify: true


Prometheusコンテナを再起動すれば完了です。
docker restart prometheus