Palagi kong iniisip ang tungkol sa temperatura ng mga HDD sa aking NAS. Mayroon akong NAS sa isang saradong silid na walang airco. Bukod dito, na-disassemble ko ang NAS kanina, at talagang mainit ang mga disc... Hindi ko sinukat ang temperatura noon, ngunit nagsimula akong mag-alala. Makakahanap ka ng maraming talakayan sa temperatura ng drive ng NAS at pagsubaybay nito mula sa kapaligiran ng Linux/Python. Ngunit wala sa mga solusyon ang gumana para sa akin!
Ang gusto ko:
Mag-iipon kami ng data sa pamamagitan ng SNMP protocol sa pamamagitan ng pysnmp package.
Pag-unawa sa SNMP at MIB
Ang SNMP (Simple Network Management Protocol) ay isang malawakang ginagamit na protocol para sa pagsubaybay sa kalusugan at pagganap ng mga network device. Pinapayagan nito ang pagkolekta ng data tulad ng mga temperatura, paggamit ng CPU, at status ng disk.
Ang mga MIB (Management Information Bases) ay mga database ng impormasyon na maaaring itanong sa pamamagitan ng SNMP. Ang bawat piraso ng data ay kinikilala ng isang OID (Object Identifier), na natatanging kinikilala ang isang variable na maaaring basahin o itakda sa pamamagitan ng SNMP.
Kailangan mong tukuyin ang mga halaga ng MIB upang tipunin. Mayroon akong Synology NAS. Ini-publish nila ang MIB file sa kanilang mga pahina. Kailangan nating magtipon:
Mayroong isang mahusay na chatbot sa pahina ng pysnmp. Isinulat nito ang katawan ng script ng Python para sa akin, pinangangasiwaan ang lahat ng mga paghihirap sa SNMP API at paghawak ng mga async na tawag. Ang pangunahing seksyon ay sumusunod:
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})
Kailangan mong paganahin ang SNMP protocol sa mga setting ng Synology NAS:
Direktang ini-deploy ko ang script sa NAS sa kapaligiran ng Docker. Dapat mong tiyakin na magsisimula muli ang lalagyan ng Docker pagkatapos ng pag-restart. Nag-set up ako ng isang simpleng docker-compose.yaml file para sa kadahilanang iyon:
version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature
Pagkatapos ay simulan ang Docker gamit docker-compose up -d
.
Ako ay kaakibat sa 2minlog - isang simpleng sistema para mangalap, magproseso, at mag-visualize ng data. Ipapadala mo ang data doon sa pamamagitan ng mga kahilingan sa HTTPS (naka-encode sa URL o sa katawan) at nag-set up ng visualization script doon. Ang mga graph ay madaling magagamit mula sa kahit saan na kailangan mo.
Maaari mong gamitin ang 2minlog. Bilang kahalili, maaari mong ipadala ang data sa isang database o lokal na file system.
Nag-set up ako ng simpleng Matplotlib script para ipakita ang graph. Sa totoo lang, hiniling ko sa ChatGPT (o1-preview) na gawin ito, at maganda ang ginawa nito. Ang script ng Python ay hindi perpekto, ngunit ito ay sapat na mabuti upang matapos ang gawain nang mabilis. Nasa ibaba ang prompt.
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 ...
Ang visualization script ay na-deploy sa loob ng 2minlog platform. Maaari mo ring patakbuhin ito nang lokal.
Available ang script sa GitHub .
Maaari kang gumamit ng ganap na pinamamahalaang 2minlog para mangalap, magproseso, at mailarawan ang data. Tingnan ang dokumentasyon . Ipinapakita ko ang mga resulta sa isang Android tablet na nakaupo sa aking mesa at umiikot sa iba't ibang mga graph na may Image Tuner . Maaari mo ring i-save ang data sa iyong lokal na file system at gawin ang parehong.
Ang solusyon ay sinubukan sa isang Synology NAS, ngunit maaaring iakma para sa iba.
#Synology #SynologyNAS #Temperature #Monitoring #DataVisualization #Matplotlib #SNMP #2minlog #Python #Docker