paint-brush
Python + SNMP = リアルタイム NAS ディスク温度モニター!🌡️ やり方を学ぶ@support2minlog
279 測定値

Python + SNMP = リアルタイム NAS ディスク温度モニター!🌡️ やり方を学ぶ

2minlog6m2024/10/31
Read on Terminal Reader

長すぎる; 読むには

信頼性の高いリアルタイム NAS HDD 温度監視システムをセットアップしました。Python スクリプトは、NAS 上の Docker 環境で直接実行されます。SNMP プロトコルを介して温度を収集し、そのデータを 2minlog データ視覚化プラットフォームに送信します。温度の変化を Matplotlib で視覚化し、Android タブレットに表示します。
featured image - Python + SNMP = リアルタイム NAS ディスク温度モニター!🌡️ やり方を学ぶ
2minlog HackerNoon profile picture
0-item
1-item
2-item

私はいつも、NAS の HDD の温度について疑問に思っていました。NAS はエアコンのない密閉された部屋に置いています。さらに、しばらく前に NAS を分解したところ、ディスクが非常に熱くなっていました... その時は温度を測っていませんでしたが、心配になり始めました。NAS ドライブの温度と Linux/Python 環境からの監視に関する議論は数多くあります。しかし、どの解決策も私には役に立ちませんでした。


私が望んでいたもの:

  • NAS HDD の温度を信頼性が高く文書化された方法で監視します。Linux サブシステムの一部から値を読み取りたくありませんでした。NAS ソフトウェアの次のリリースで変更される可能性があります。
  • 自宅の NAS と、兄の地下室にあるバックアップ NAS を1 つのグラフで表示したいと考えました。
  • 見栄えの良いグラフで値を確認したいと考えていました。グラフの外観に完全な柔軟性を求めており、できれば Matplotlib で自分で設定したいと考えていました。
  • NAS ダッシュボードから値を取り出して、リアルタイムでグラフを表示できるようにしたいです。デスクには2minlog ディスプレイがあります。バルコニーの温度、湿度、汚染レベル、インターネット接続の可用性の履歴がすでに表示されています。そこで HDD の温度履歴を確認したいです。


ステップ1: 温度データの収集

pysnmpパッケージを介してSNMP プロトコルでデータを収集します。


SNMPとMIBの理解

SNMP (Simple Network Management Protocol)は、ネットワーク デバイスの健全性とパフォーマンスを監視するために広く使用されているプロトコルです。温度、CPU 使用率、ディスクの状態などのデータを収集できます。

MIB (管理情報ベース) は、 SNMP 経由でクエリできる情報のデータベースです。各データは OID (オブジェクト識別子) によって識別され、SNMP 経由で読み取りまたは設定できる変数を一意に識別します。


収集するMIB値を指定する必要があります。私は Synology NAS を使用しています。彼らはMIB ファイルを自社のページで公開しています。収集する必要があるのは以下のものです。

  • ディスク名: 1.3.6.1.4.1.6574.2.1.1.2
  • ディスクモデル: 1.3.6.1.4.1.6574.2.1.1.3
  • ディスク温度: 1.3.6.1.4.1.6574.2.1.1.6


pysnmp ページには優れたチャットボットがあります。このチャットボットは、SNMP API に関するすべての問題と非同期呼び出しを処理しながら、Python スクリプトの本体を記述してくれました。重要なセクションは次のとおりです。

 async def run(server_name, ipaddress, username, passwd, outinfo): # SNMP walk for disk name, model, and temperature oids = [ ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.2')), # Disk name (diskID) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.3')), # Disk model (diskModel) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.6')) # Disk temperature (diskTemperature) ] errorIndication, errorStatus, errorIndex, varBinds = await bulkCmd( SnmpEngine(), UsmUserData(username, passwd, authProtocol=usmHMACSHAAuthProtocol), # Use the appropriate auth protocol await UdpTransportTarget.create((ipaddress, 161)), ContextData(), 0, 10, # Increase the max-repetitions to get more results in one request *oids # Query disk name, model, and temperature ) if errorIndication: print(f"Error: {errorIndication}") elif errorStatus: print(f"Error Status: {errorStatus.prettyPrint()} at {errorIndex and varBinds[int(errorIndex) - 1] or '?'}") else: disk_data = {} for varBind in varBinds: oid, value = varBind oid_str = str(oid) # Disk name if oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.2'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['name'] = value # Disk model elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.3'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['model'] = value # Disk temperature elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.6'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['temperature'] = value # Print out the disk information for index, info in disk_data.items(): name = info.get('name', 'Unknown') model = info.get('model', 'Unknown') temperature = info.get('temperature', 'Unknown') name = str(name) model = str(model) temperature = str(temperature) print(f"IP Address {ipaddress}, Disk {index}: Name: {name}, Model: {model}, Temperature: {temperature} °C") outinfo.append({'server_name': server_name, 'ip': ipaddress, 'disk': index, 'name': name, 'model': model, 'temperature': temperature})


Synology NAS 設定で SNMP プロトコルを有効にする必要があります。

ステップ2: スクリプトを展開し、処理のためにデータを送信する

私は、Docker 環境の NAS にスクリプトを直接デプロイしました。再起動後に Docker コンテナが再度起動することを確認する必要があります。そのために、シンプルな docker-compose.yaml ファイルをセットアップしました。

 version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature

次に、 docker-compose up -dで Docker を起動します。


私は2minlogに所属しています。これは、データを収集、処理、視覚化するシンプルなシステムです。HTTPS リクエスト (URL または本文にエンコード) 経由でデータを送信し、視覚化スクリプトを設定します。その後、グラフは必要な場所からすぐに利用できるようになります。


2minlog を使用できます。または、データをデータベースまたはローカル ファイル システムに送信することもできます。

ステップ3: データの視覚化

グラフを表示するために、簡単な Matplotlib スクリプトを設定しました。実際、ChatGPT (o1-preview) に実行を依頼したところ、かなりうまくいきました。Python スクリプトは完璧ではありませんでしたが、タスクをすばやく完了するには十分でした。プロンプトは以下のとおりです。

 Here is a csv file. Can you write a code: Split data into different graphs by combining the server name and name (eg, DS920+ / Disk 1). Each graph will show the temperature. There will be a title in each graph (eg, DS920+ / Disk 1) The graphs will have the same temperature range. The background will be black, graph background will be also black, the graph color will be from dark green (low temperatures) to light green (high temperatures). There will be two thin lines - 20 °C (blue) and 45 °C (red). Trim the data for last week with tickmarks at midnight of every day. The data are in UTC time. Convert it to Europe/Berlin time zone. The resolution of the total image is hxw 600 x 1024 pixels. Save the image to PNG. disk,ip,model,name,server_name,temperature,timestamp 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:19:48.723761 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:19:49.253975 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:19:49.818734 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:19:50.393793 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:19:50.873142 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:20:02.119583 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:20:02.596654 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:20:03.101480 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:20:03.697423 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:20:04.221348 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:25:02.254611 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:25:02.714633 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:25:03.295622 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:25:03.780728 ...


視覚化スクリプトは 2minlog プラットフォーム内にデプロイされます。ローカルで実行することもできます。


スクリプトはGitHubで入手できます。

まとめ

完全に管理された2minlogを使用して、データを収集、処理、視覚化できます。ドキュメントを確認してください。私はテーブルに置いた Android タブレットに結果を表示し、 Image Tunerを使用してさまざまなグラフを切り替えています。データをローカル ファイル システムに保存して、同じ操作を行うこともできます。


このソリューションは Synology NAS でテストされていますが、他の NAS にも適応できます。

参考文献:


#Synology #SynologyNAS #温度 #監視 #データ視覚化 #Matplotlib #SNMP #2minlog #Python #Docker