LoginSignup
4

More than 3 years have passed since last update.

Prometheusでnasneを監視する

Last updated at Posted at 2018-12-14

はじめに

こんにちは、 ゼットラボ株式会社のエンジニアの @hatotaka です。今回は自宅nasneの監視について紹介したと思います。

解決したい課題

以下の課題を解決するために、自宅nasneを監視をすることにしました。

nasneを監視をするにPrometheusを選択しました。なぜPrometheusかというと、普段から業務で利用しているため、自宅でも利用することを選択しました。

Prometheusとは?

Prometheusとは、オープンソースのモニタリングシステムです。2012年からSoundCloudで開発され、現在は独立したオープンソースプロジェクトとして管理されています。2016年にはCNCFKubernetesに続く2つめのプロジェクトとして参加しました。

Prometheusの特徴の一つとして、HTTP経由のpull型でのメトリクス収集というものがあります。メトリクスの取得はPrometheusが行い、アプリケーション側はHTTPでPrometheusの形式のメトリクスを公開するだけでPrometheus対応を行えます。また、exporterと呼ばれるものもあり、Prometheusに対応してないソフトウェアであっても、そのソフトウェアに対応したexporterを用意すればソフトウェア固有のAPIから情報を取得し、Prometheus形式のメトリクスを出力することができます。Promehtues公式ではMySQLやConsul、Memchached用のexporterが用意されています。公式以外のexporterもあり、私が普段利用するようなソフトウェアは大体そろっています1

公式や非公式のexporterが存在しない場合でもexporterを自身で実装すればPrometheus対応をすることができます。exporterの実装は、クライアントライブラリを利用することで容易に行うことができます。Prometheusの公式では、Go、Java、Scala、Python、Rubyのライブラリが提供されています2

nasne_exporterについて

Prometheusを利用してnasneを監視するために hatotaka/nasne_exporterというexporterを開発しました。

構成

自宅の構成は以下の通りです。

nasne_exporter.png

自宅Kubernetesで開発したnasne_exporter以外に、prometheusやalertmanagerを動作させています。alertmanagerの通知先はslackにしており、問題があるとスマートフォンに通知される仕組みとなっています。また、監視対象のnasneは3台あり、nasne_exporterで3台のnasneを監視しています。

実装方法について

開発言語はgolangを使っています。また、Prometheusの公式のクライアントライブラリであるprometheus/client_golangを利用しています。exporterの実装方法の詳細については公式のドキュメント WRITING EXPORTERShttps://qiita.com/takuhiro/items/4630e003cebff1d6df02 を参照することをおすすめします。

nasne_exporterを実装するにはnasneの情報を取得する必要があります。しかし、nasneには公開されているAPIが存在しません。調べてみると、Web UIやトルネのUIを実現するために、多くのAPIが実装されていることがわかりました。

今回nasne_exporterを作成するために、naokiy/node-nasneを参考にしたのと、nasne Web UIをChromeのデベロッパーツールで確認しながらどのようなAPIをたたいて情報を取得しているか確認しながら実装しました。

実装についての詳細な説明は省略します。興味のある方はコードを参照してもらえるとうれしいです。おかしなところがあればPR大歓迎です。

実行方法について

nasne_exporterの実行方法について説明します。dockerコンテナを公開しているので、dockerを使える環境であれば以下の手順で起動することができます。

$ docker run quay.io/hatotaka/nasne_exporter --nasne-addr 192.0.2.1 --nasne-addr 192.0.2.2

--nasne-addrではnasneのIPアドレスを指定します。複数のnasneがある場合は、複数指定すれば1つのexporterで複数のnasneのメトリクスを取得することができます。上記の例では 192.0.2.1192.0.2.2の2つのnasneを指定しています。

起動後、以下のURLでメトリクスを見ることができます。

http://<実行した環境>:8080/metircs

その他のフラグ詳細については、以下のコマンドで確認してください。

$ docker run quay.io/hatotaka/nasne_exporter --help

アラート条件について

私の自宅で設定しているアラート条件は以下の通りです。

ストレージの空き容量が20%を下回った場合にアラートする

- alert: NasneHDDWillFull
  expr: sum(nasne_hdd_usage_bytes) by (name) / sum(nasne_hdd_size_bytes) by (name) > 0.8
  for: 5m
  annotations:
    summary: "Nasne {{ $labels.name }} becomes full."
    description: "Nasne ({{ $labels.name }}) hard disk space is less than 20%. (current value: usage/size = {{ $value }})"

録画予約が衝突した場合にアラートする

- alert: NasneConflictReserved
  expr: nasne_reserved_conflict_titles > 0
  for: 5m
  annotations:
    summary: "Nasne {{ $labels.name }} conflict reserved."
    description: "Conflicts of recording reservation has occurred at {{ $labels.name }}. (current value: {{ $value }})"

それ以外にも以下のメトリクスを取得しているので、これらのメトリクスを利用したアラートも設定可能です。たとえば、接続されているクライアント数をnasne_dtcpip_clientsで取得しているので、深夜に子供がnasneでテレビや録画した番組を見たときにアラートを受け取ると行ったことも実現可能です。

メトリクス名 メトリクスタイプ ラベル 説明
nasne_info Gauge hardware_version name product_name software_version nasne 情報
nasne_hdd_size_bytes Gauge format id name product_id vendor_id ハードディスクの容量
nasne_hdd_usage_bytes Gauge format id name product_id vendor_id ハードディスクの使用容量
nasne_dtcpip_clients Gauge name 接続されているDTCP-IPのクライアント数
nasne_recordings Gauge name 録画中の件数
nasne_recorded_titles Gauge name 録画されている件数
nasne_reserved_titles Gauge name 予約されている件数
nasne_reserved_conflict_titles Gauge name コンフリクトした録画件数
nasne_reserved_notfound_titles Gauge name 見つからない録画件数
nasne_last_collect_time Gauge 最後にメトリクスを収集した時間
nasne_collect_duration_seconds Histogram name メトリクス収集にかかった時間

最後に

以上のようにnasne_exporterを利用することでnasneを監視することができます。自宅Kubernetesクラスタで動かすアプリケーションがない方は試してみてはいかがでしょうか?

以下にサンプルのマニフェストがあるので参考にしていただけると幸いです。

このエントリは、Z Lab Advent Calendar 2018 の15日目として業務時間中に書きました。nasne_exporterについては趣味で業務時間外に書きました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4