dump1090 Prometheus ExporterでADS-B受信状況を監視する

前の記事ではdump1090-fa(他のdump-1090でも同じ)をインストールして実行したが、こういうのは基本的には停まらず動き続けてくれることが前提のサービスなので動いていることを監視したいという欲求はある筈。(dump1090が動いているホストのシステム稼働状況を監視するのとは別にdump1090の稼働状況を監視したいという意味)  それで、そう考えた先人はPrometheusで監視する用のexporterとしてdump1090 Prometheus Exporterと、Grafana用ダッシュボードのdump1090export Grafana dashboardというのを作ってくれている。ここは凄く感謝して使わせていただくことに。

dump1090 Prometheus Exporterのインストールと起動

以下、https://github.com/claws/dump1090-exporterを参照して進めた。

dump1090exportは必ずしもdump1090-fa(など)と同じホストに置く必要はないみたいだけど、敢えて別けて置く必要もまたないわけで、今回はdump1090exportをdump1090-faと同じホストで実行させるようにする。使用するのは前回と同じくOrange Pi Zero Plusというシングルボードコンピュータで動くArmbian(Debian Linux)のホスト。Raspberry PiとRaspbianやPCのLinuxもほぼ似たようなものかと。

Armbianはコンパクトなので最初からあれもこれもてんこ盛りで入っているわけではないので幾つかパッケージをインストールする。Pythonが必要だが、Python2系はダメらしいのでpython3系でパッケージをインストールする。

$ sudo apt install python3-pip python3-setuptools python3-dev
$ sudo pip3 install dump1090exporter

Python3系用のpipはArmbianのパッケージでインストールするとpip3らしい。Linuxの他のディストリビューションやxBSD等では必要に応じてpipに読み替えて実行いただければ。
dump1090exportはpipでインストールするだけなので簡単。Python用で必要なのは勝手にインストールされる。

/usr/local/bin/dump1090exporterが実行に使用するファイル。

$ dump1090exporter -h
usage: dump1090exporter [-h] [--url <dump1090 url>] [--host <exporter host>]
                        [--port <exporter port>]
                        [--aircraft-interval <aircraft data refresh interval>]
                        [--stats-interval <stats data refresh interval>]
                        [--latitude <receiver latitude>]
                        [--longitude <receiver longitude>] [--debug]

dump1090 Prometheus Exporter

optional arguments:
  -h, --help            show this help message and exit
  --url <dump1090 url>  Url of the dump1090 service to be monitored
  --host <exporter host>
                        The address to expose collected metrics from. Default
                        is all interfaces.
  --port <exporter port>
                        The port to expose collected metrics from. Default is
                        9105
  --aircraft-interval <aircraft data refresh interval>
                        The number of seconds between updates of the aircraft
                        data. Default is 10 seconds
  --stats-interval <stats data refresh interval>
                        The number of seconds between updates of the stats
                        data. Default is 60 seconds
  --latitude <receiver latitude>
                        The latitude of the receiver position to use as the
                        origin.
  --longitude <receiver longitude>
                        The longitude of the receiver position to use as the
                        origin.
  --debug               Print debug output
dump1090exporterのREADME.rstによると実行サンプルは以下。
$ dump1090exporter \
  --url=http://192.168.1.201:8080 \
  --port=9105 \
  --latitude=-34.9285 \
  --longitude=138.6007 \
  --debug

ただし、dump1090-faが動いているホストで実行する場合は--url, --host, --portは指定する必要はなさそう。また、2つのインターバル指定も多くの場合は初期値から変えなくて良さそうなので--latitude(緯度)と--longitude(経度)だけ指定する。もちろん、動作テストのとき以外は--debugは要らない筈。

システム起動時にdump1090exporterを自動起動させるためのsystemd用ファイルは作っても良いと思うが面倒なので/etc/rc.localに2行挿入した。

/etc/rc.local (2行挿入、最後の"exit 0"の直前の行辺り)
/bin/sleep 20
/usr/local/bin/dump1090exporter --latitude=-35.00000000 --longitude=136.00000000 &

システム起動が落ち着いてからdump1090exporterを起動させるというつもりて20秒の余裕を持たせた。

手動でも自動実行でもdump1090exporterが起動してから、情報が出力されていることを確認してみる。

curlで実行(ブラウザでも可)
$ curl http://192.168.0.127:9105/metrics

ここでは192.168.0.127がdump1090exporterが動いているホストのIPアドレスとする。

# HELP dump1090_messages_total Number of Mode-S messages processed since start up
# TYPE dump1090_messages_total gauge
dump1090_messages_total{time_period="latest"} 8462670
# HELP dump1090_recent_aircraft_max_range Maximum range of recently observed aircraft
# TYPE dump1090_recent_aircraft_max_range gauge
dump1090_recent_aircraft_max_range{time_period="latest"} 0.0
後略

何か値が入っていて120行程度?ドバッと出力されればOK。

これでdump1090exporter側は完了。

Prometheus側の設定

dump1090exporterのREADME.rstによると設定ファイルに以下のようなのを追記することになっている。

/usr/local/etc/prometheus.yml (既存の設定に編集追加)
1
2
3
4
5
6
scrape_configs:
  - job_name: 'dump1090'
    scrape_interval: 10s
    scrape_timeout: 5s
    static_configs:
      - targets: ['192.168.1.201:9105']

1行目のscrape_configs:の行は既にprometheus.ymlにあると思われるので、その下層の設定の後に2〜6行目を追加する。
targetsにdump1090exporterが動いているホストのIPアドレスを指定する。
Prometheusを再起動するなり設定ファイルをリロードさせるなり。

Prometheusはこれだけ。

Grafanaのダッシュボード追加

提供されているにダッシュボードを貰ってきてGrafanaにインポートしたら後は眺めるだけ。何も考えなくてよいのでラク。

dump1090 Prometheus Exporter 1
https://grafana.com/grafana/dashboards/768にダッシュボードがある。
ページを開いて右列のDownload JSONのリンクをクリックしてJSONファイルをダウンロードする。

dump1090 Prometheus Exporter 2
Grafanaの左列の Createにポインタを合わせ、サブメニューのImportをクリックする。

dump1090 Prometheus Exporter 3
右方のUpload .json fileボタンをクリックする。
ファイル選択画面が表示されるので先にダウンロードしたJSONファイルを選択してアップロードする。

dump1090 Prometheus Exporter 4
インポート画面に変わるのでOptionsの1番下のPrometheusのドロップダウンメニューからPrometheus(稼働中のPrometheusが複数ある場合はdump1090exporterのデータを取り込んでいるPrometheus)を選択する。
Importボタンをクリックする。

dump1090 Prometheus Exporter 5
自動的にインポートしたダッシュボード画面に切り替わる筈。Prometheusがdump1090exporterからデータを取り込み始めたとき以降のデータは遡って見ることができる。(もちろん、破棄された過去データは見れない)

dump1090 Prometheus Exporter 6
1つ前の画像はブラウザ画面が狭くて見難かったけど、実際に見るであろう2Kサイズくらいで表示するとこんな感じ。
それぞれのグラフの概要も表示されるので、それが何を示しているのかもわかる。他人が作ったダッシュボード(やグラフ)ってどういう意図で何を示そうとしているのか解らなくて困ることがあるので、こういう心配りは嬉しい。しかし、messages / secのグラフでlatest(直近の1秒)とlast 1 min(直近の1分間の平均?)を示している意図は判らない。
最上段のサマリの数字は、リアルタイム(今回のdump1090exporterの設定では10秒毎の更新)で、その時点でdump1090に検知されている情報。Aircraft Totalは、検知されている航空機数。Aircraft with Positionで位置の通知が正常に受信できている航空機。なのでAircraft without Positionは単純にその引き算。それが直下のグラフでは水色のラインで示されている。Max Rangeはその時点で一番遠くにいる航空機までの距離。Messages/Secは1秒あたりに受信するADS-Bの(Mode-S)メッセージパケット数。Signal PeakとSignal Meanは電波強度を示すためのピークと移動平均。ノイズはサマリの数値には表示されないが、Signal Strengthグラフには表示されている。単位はdbFSで個人的には馴染みがない。

見たら判るが、dump1090exporterがdump1090から取得するデータは統計情報(受信状況)だけ。dump1090が受信した個別の航空機のデータは含まれない。だから、dump1090exporterで取得したデータから各航空機の飛行経路をプレイバックできるかというと無理。作った人にそういう気持ちはなかったみたい。まぁ個別航空機のデータまで含んだらデータ量増えすぎなのでこれで良いと思う。

この記事では関係ないんだけど、
ADS-Bのメッセージパケットは航空機1機あたりで沢山来る。1パケットは112ビットまたは56ビット。仮に1バイト8ビットとして1バイトコードの文字データを送信するとすると英数字で14文字または7文字しか送れない程度の大きさでしかない。これでは航空機の識別番号と速度、位置、高度、その他幾つかの全てを1パケットで送るのは無理。それぞれの情報をタイプコード別に違うパケットとして送信するみたい。だから、電波状況によってはパケットを取りこぼして位置(だけ)が取得できない航空機とかがでてくるのね、きっと。パケットの仕様はよく見てないというか「がとらぼ」の中の人の頭のレベルでは理解できないので間違ってたらスミマセン。興味のある人はhttps://mode-s.org/を見て下さい。

関連記事:

コメント: dump1090 Prometheus ExporterでADS-B受信状況を監視する

  1. 初めまして。がとさんと同じ頃からADS-Bを始め、最近LNAを付けて感動を覚え、安い中国モノも好きで、CoCoをそろそろ作りたいなと思って探しててここを見つけました。凄く好みが似てるので、参考にさせてください。都会に住んでるようなのに、ADS-Bのロケーションが滋賀県だったので不思議でした。

  2. ド素人の寝言みたいなのしか書けていないのでスミマセン。
    中華の怪しいアンテナだけの頃から中華怪しいBPF+LNA+怪しい自作アンテナに変えてカバレッジが距離で15倍、単純に2乗した面積だと200倍以上に拡がっているので、何かをして効果が出るのは楽しいです。
    アンテナは精密でなくてもなんとかなるという結論を出していますが、作ったものの効果を測る方法がないと実際に1週間くらい使用してなんとなく良くなったかな・悪くなったかな程度しかわかりません。自作するならアンテナアナライザはあった方が良いでしょうね。安いから買おうとしているNanoVNAと縁がないのかなかなか購入できていないのですが。
    ケチって一番安く入手できるBPF+LNAにしましたが、今は金かけるポイントはこのBPFとLNAだったかもと反省しています。とくにLNAですね。
    都会で集合住宅だとアンテナ置き場と見晴らしの点で困るので、屋根の上に自由に出せる実家が良いかなということで滋賀に置いてますが、山の谷間なので結局ロケーションは良くなくてしかもカバレッジ内を飛行機があまり飛んでいない(苦笑)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です