用Prometheus监视nasne
首先
(Note: “はじめに” is a Japanese phrase meaning “first” or “to begin with”. The paraphrase provided is the Chinese translation of this phrase.)
你好,我是Zettlabor株式会社的工程师@hatotaka。这次我想介绍一下关于监控家庭nasne的内容。
我想要解决的问题。
为了解决以下问题,我决定监控家中的nasne。
-
- nasneのディスクの容量が少なくなったら知りたい
-
- nasneの録画予約が重複したときに知りたい
-
- 自宅Kubernetesクラスタの有効活用
https://qiita.com/hatotaka/items/48a88ecb190e1f5e03c3
我选择使用Prometheus来监视nasne。之所以选择Prometheus,是因为我平时在工作中经常使用它,所以我也想在家里使用它。
Prometheus是什么?
Prometheus是一个开源监控系统。它在2012年在SoundCloud上进行开发,并现在作为一个独立的开源项目进行管理。2016年,它作为CNCF的第二个项目加入了Kubernetes。
作为 Prometheus 的特点之一,存在通过 HTTP 的拉取方式进行指标收集的功能。指标的获取由 Prometheus 完成,应用程序只需通过 HTTP 公开 Prometheus 格式的指标,即可实现与 Prometheus 的兼容。此外,还存在一种称为 exporter 的工具,即使对于不支持 Prometheus 的软件,只需准备与该软件兼容的 exporter,就能从该软件的专用 API 中获取信息并输出 Prometheus 格式的指标。Prometheus 官方提供了针对 MySQL、Consul 和 Memcached 的 exporter,也有官方以外的 exporter,而我通常使用的软件大都有相应的exporter提供1。
即使没有公式或非官方的exporter存在,您也可以自行实现exporter来支持Prometheus。通过使用客户端库,您可以很容易地实现exporter。Prometheus官方提供了Go、Java、Scala、Python和Ruby等语言的库。
关于nasne_exporter
我使用 Prometheus 开发了一个名为 hatotaka/nasne_exporter 的 exporter,以便监视 nasne。
构成
家中的布局如下:

除了在家里的Kubernetes上开发的nasne_exporter之外,我们还运行着prometheus和alertmanager。alertmanager的通知目标是slack,一旦出现问题,手机就会收到通知。另外,我们有3台正在监视的nasne设备,nasne_exporter负责监控这3台设备。
关于实施方法
我们正在使用golang进行开发,并使用Prometheus官方的客户端库prometheus/client_golang。推荐参考官方文档WRITING EXPORTERS和https://qiita.com/takuhiro/items/4630e003cebff1d6df02以获得有关导出器实现的详细信息。
要实现nasne_exporter,需要获取nasne的信息。然而,nasne并没有公开的API可用。经过调查发现,为了实现Web UI和录制功能,nasne实际上实现了许多API。
我创建nasne_exporter是参考了naokiy/node-nasne,并且在Chrome的开发者工具中确认了nasne Web UI的API是如何打击并获取信息的,然后进行了实现。
我会省略详细解释实现的细节。如果有兴趣的人可以查看代码,我会很高兴。如果有什么不对劲的地方,欢迎提出改进意见。
执行方式
我将解释如何运行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,可以通过指定多个地址在一个exporter中获取多个nasne的指标。在上述示例中,指定了两个nasne:192.0.2.1和192.0.2.2。
启动后,您可以通过以下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_infoGaugehardware_version name product_name software_versionnasne 情報nasne_hdd_size_bytesGaugeformat id name product_id vendor_idハードディスクの容量nasne_hdd_usage_bytesGaugeformat id name product_id vendor_idハードディスクの使用容量nasne_dtcpip_clientsGaugename接続されているDTCP-IPのクライアント数nasne_recordingsGaugename録画中の件数nasne_recorded_titlesGaugename録画されている件数nasne_reserved_titlesGaugename予約されている件数nasne_reserved_conflict_titlesGaugenameコンフリクトした録画件数nasne_reserved_notfound_titlesGaugename見つからない録画件数nasne_last_collect_timeGauge最後にメトリクスを収集した時間
nasne_collect_duration_secondsHistogramnameメトリクス収集にかかった時間到最后
通过使用nasne_exporter,可以监视nasne。如果您的家庭Kubernetes群集上没有运行的应用程序,为什么不试试呢?
希望您能参考以下的样例清单。
- https://github.com/hatotaka/nasne_exporter/tree/master/examples/k8s
我在工作时间内写下了这篇文章,作为2018年Z Lab Advent Calendar的第15天。至于nasne_exporter,是我在工作时间外出于兴趣而写的。
https://prometheus.io/docs/instrumenting/exporters/-资料来源
https://prometheus.io/docs/instrumenting/clientlibs/-资料来源