2021年3月9日 星期二

如何在librenms新增你想要抓的東西,例如記憶體使用量(率)、風扇轉數等等...

前言:

其實這個題目我寫的有點心虛,因為我對librenms其實不太熟...之前裝librenms就是裝好能用,然後定期更新而已。

直到這一次公司買了新的設備 Ericsson SSR 8010。librenms內建的模組沒有辦法抓到它記憶體使用量及風扇轉速,因此我只好以『自己』的方式來處理。如果有觀念錯誤的地方煩請指正或指點。

以下切入正題:

重要觀念:

在librenms要新增資料,有兩種方式:dicovery、poller。這兩者以我的認知而言,doscovery用在第一次新增裝置或之後設定rediscovery時使用,而poller則是用在設備上線後的維運。但以我這一次維護而言,mempools及storage在discovery及poller都要設定。但fanspeed及temperature只需要設定discovery...我也不知道為什麼。也許之後有機會再研究。

關於除錯:

先講除錯的部份,如果我們不曉得怎麼去看程式的輸出就無法除錯。因此除錯的部份是最重要的。

以discovery而言:

cd /opt/librenms

./discovery.php -h 74 -d -m mempools

以poller而言:

./poller.php -h 74 -d -m mempools

-h指的是設備編號,在設備的連結可以看出來。

-d代表debug,但資訊太多。我覺得不是很好用。

-m指的是要看的模組,如果指定的話比較不會被一堆資訊蓋掉。

當然,你也可以在設備的設定介面,在modules這邊把不需要的關閉。但關閉的時候要小心,我不曉得關到哪一個把網路介面給關掉,找不到解法,最後只好把設備刪除再重新新增一次。

設備的預先定義在:

/opt/librenms/includes/definitions

檔名為seos.yaml,
內容如下:os: seos
text: 'Redback Networks SmartEdge'
type: network
icon: ericsson
mib_dir:
    - ericsson
discovery:
    - sysObjectID:
        - .1.3.6.1.4.1.2352.1
bad_iftype:
    - l2vlan
    - softwareLoopback
我只有新增bad_iftype的部份,把vlan及loopback IP加入,讓它不去爬流量。

mempools:

接著我們講怎麼抓記憶體的資訊,先切換至

/opt/librenms/includes/discovery/mempools

新增seos.inc.php這個檔案:
<?php

if ($device['os'] == 'seos') {
    echo 'SmartEdge(SSR): ';

    $used  = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.4.1', '-OvQ');
    $free  = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.3.1', '-OvQ');
    $used = $used*1024;
    $free = $free*1024;
    $total = ($free + $used);
    $percent = ($used / $total * 100);
    //echo "used:$used free:$free :total:$total percent:$percent";
    if (is_numeric($total) && is_numeric($used)) {
        discover_mempool($valid_mempool, $device, 0, 'seos', 'Memory', '1', null, null);
    }
}
我參考的是f5.inc.php這個檔案,將其複製後再加以修改而成。*1024的目的是因為它輸出的是KB。
在測試的時候。可以把echo那一行的註解拿掉,觀察其輸出是不是跟我們想像的一樣:

我們回到/opt/librenms,並執行:
./discovery.php -h 74 -m mempools

#### Load disco module mempools ####
FORTIAUTHENTICATOR-MEMORY-POOL: FORTISANDBOX-MEMORY-POOL: SmartEdge(SSR): used:1084664000 free:48010928000 :total:49095592000 percent:2.2092899908407.

>> Runtime for discovery module 'mempools': 0.1420 seconds with 86408 bytes
>> SNMP: [9/0.13s] MySQL: [2/0.00s] RRD: [0/0.00s]
#### Unload disco module mempools ####

檢查一下輸出的部份是不是都有我們預期的數字 格式正不正確,接著我們把echo該行加上註解,再重新執行一次:
./discovery.php -h 74 -m mempools
可以看到這一段,(MIB檔名顯示有誤但不影響)
#### Load disco module mempools ####
FORTIAUTHENTICATOR-MEMORY-POOL: FORTISANDBOX-MEMORY-POOL: SmartEdge(SSR): .
可以看到紅色的一點,如果是+號代表新增,如果是U代表update,.就猜不出來了,猜想是沒有變化。接著我們要到poller去做一次類似的事,
目錄在:
/opt/librenms/includes/polling/mempools
seos.inc.php的內容如下:
<?php

// Simple hard-coded poller for SmartEdge

echo 'SmartEdge(SSR) MemPool'.'\n';
$used = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.4.1', '-OvQ');
$user = $used * 1024;
$free = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.3.1', '-OvQ');
$free = $free * 1024;
$mempool['total'] = ($free + $used);
$mempool['free']  = $free;
$mempool['used']  = $used;
這個程式很簡單,由於輸出是KB,因此我也乘以1024。

其它的部份,包含storage、fanspeed及temperature相差不多。注意一下所在的目錄(環境類的會收在sensors這個目錄),還有要參考的檔案就好了。感覺是不用特別示範。我覺得比較有趣的是temperature,它的SNMP輸出是這樣:
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.1 = STRING: "Fan unit 1 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.2 = STRING: "Fan unit 2 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.3 = STRING: "Fan unit 3 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.4 = STRING: "Fan unit 4 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.5 = STRING: "Fan unit 5 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.6 = STRING: "Fan unit 6 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.1 = STRING: "Fan unit 1 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.2 = STRING: "Fan unit 2 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.3 = STRING: "Fan unit 3 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.4 = STRING: "Fan unit 4 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.5 = STRING: "Fan unit 5 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.6 = STRING: "Fan unit 6 on slot FT2"
它有兩層,(1.1~1.6還有2.1~2.6),要想辦法把它塞在同一個array,再一次輸出。我是用土砲硬幹的方式做的,一定有更有趣的方法。也許有空再來玩。

這一些檔案我都放在我的github上。
https://github.com/tiserle/librenms-seos
有需要的話可以上來參考。但硬幹的部份笑笑就好。
另外我不太會操作github,所以如果用起來很奇怪請忽略...






10 則留言:

  1. 網誌管理員已經移除這則留言。

    回覆刪除
  2. 請問librenms怎麼收機房溫度呢?

    回覆刪除
    回覆
    1. 這個問題要看你們機房有什麼設備,一般機房可能會有PLC,可以即時抓到溫度感應器的問題。如果沒有的話,可以抓你們設備的進風口的溫度,這個溫度一般會很接近機房溫度。如果有好幾台的話,可以把他們的進風口溫度做平均計算,會更接近機房的溫度。

      刪除
    2. 謝謝大大的回覆,我是有一個設備用來監控溫度,這個設備上面也有snmp,我也設定了,但到了librenms上卻沒有抓到溫度值?不知要怎麼查?

      刪除
    3. https://docs.librenms.org/Support/Adding-a-Device/
      一樣是新增一個device,如果這個device有既有的mib檔(mib檔中也有溫度的資訊),就會抓到它的溫度。
      如果沒有既有的mib檔就比較麻煩,要像我一樣自己想辦法做出來。

      刪除
    4. 我在temperature資料夾新增了一個eltek.inc.php,再執行./discovery.php -h 20 -m sensors,有抓到溫度,但在執行discover_sensor,卻出現下面的錯誤:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)' at line 1 (Connection: mysql, SQL: INSERT IGNORE INTO `sensors` (`poller_type`,`sensor_class`,`device_id`,`sensor_oid`,`sensor_index`,`sensor_type`,`sensor_descr`,`sensor_divisor`,`sensor_multiplier`,`sensor_limit`,`sensor_limit_warn`,`sensor_limit_low`,`sensor_limit_low_warn`,`sensor_current`,`entPhysicalIndex`,`entPhysicalIndex_measured`,`user_func`,`group`,`rrd_type`) VALUES (snmp,temperature,20,,0,temperatureRadio,Internal Temp,1,1,38.8,38.8_warn,38.8_low,38.8_low_warn,18.8,,_measured,,,GAUGE)) (Connection: dbFacile, SQL: INSERT IGNORE INTO `sensors` (`poller_type`,`sensor_class`,`device_id`,`sensor_oid`,`sensor_index`,`sensor_type`,`sensor_descr`,`sensor_divisor`,`sensor_multiplier`,`sensor_limit`,`sensor_limit_warn`,`sensor_limit_low`,`sensor_limit_low_warn`,`sensor_current`,`entPhysicalIndex`,`entPhysicalIndex_measured`,`user_func`,`group`,`rrd_type`) VALUES (snmp,temperature,20,,0,temperatureRadio,Internal Temp,1,1,38.8,38.8_warn,38.8_low,38.8_low_warn,18.8,,_measured,,,GAUGE))#0 /opt/librenms/includes/discovery/functions.inc.php(260): dbInsert()
      #1 /opt/librenms/includes/discovery/sensors/temperature/eltek-webpower.inc.php(25): discover_sensor()
      #2 /opt/librenms/includes/discovery/functions.inc.php(1089): include('...')
      #3 /opt/librenms/includes/discovery/sensors.inc.php(87): sensors()
      #4 /opt/librenms/includes/discovery/functions.inc.php(167): include('...')
      #5 /opt/librenms/discovery.php(108): discover_device()
      #6 {main}
      +
      不知道是什麼原因?

      刪除
    5. 這個問題已經太困難了...先看你的yaml是否正確。剩下的再不行就去github求救了

      刪除
    6. 好的!謝謝你,感謝大大

      刪除