Hi All,
I have an alert rule for printers that are out of toner (toner level < 1%) and I’ve just realised there is hours of delay before the alert or recovery alerts are sent when the toner runs out or is replaced.
On investigating further it appears that the regular 5 minute SNMP poll of a printer does NOT update toner levels, and only the “discovery” poll updates toner levels. However printer error status (caused by being out of toner) IS updated correctly on the 5 minute poll.
Is this correct and expected behaviour or is this a bug ? The printer in question is a Lexmark M3250.
If I manually run a polling session (using capture) I see the following snippet regarding toner which appears to be checking toner, but it is reporting the black toner is still 0% 30 minutes after the toner has been replaced and the printers own UI reports it is full:
#### Load poller module printer-supplies ####
Module enabled: Global + | OS + | Device | Manual
SQL[select * from `printer_supplies` where `printer_supplies`.`device_id` = ? and `printer_supplies`.`device_id` is not null [166] 0.14ms]
SNMP['/usr/bin/snmpget' '-v2c' '-c' 'COMMUNITY' '-OUQn' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' '.1.3.6.1.2.1.43.8.2.1.10.1.1' '.1.3.6.1.2.1.43.8.2.1.10.1.2' '.1.3.6.1.2.1.43.8.2.1.10.1.3' '.1.3.6.1.2.1.43.11.1.1.9.1.1' '.1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.2' '.1.3.6.1.2.1.43.11.1.1.9.1.3' '.1.3.6.1.2.1.43.8.2.1.10.1.4']
.*.*.*.1 = 0
.*.*.*.2 = 0
.*.*.*.3 = 0
.*.*.*.1 = 54000
.*.4.1.3*.*.5.2 = No Such Object available on this agent at this OID
.*.*.*.3 = 200000
.*.*.*.4 = 550
Checking toner MP Tray... 0 %
RRD[update /opt/librenms/rrd/10.0.5.135/toner-input-1.rrd N:0]
Checking toner Manual Envelope... 0 %
RRD[update /opt/librenms/rrd/10.0.5.135/toner-input-2.rrd N:0]
Checking toner Manual Paper... 0 %
RRD[update /opt/librenms/rrd/10.0.5.135/toner-input-3.rrd N:0]
Checking toner Imaging Unit... 90 %
RRD[update /opt/librenms/rrd/10.0.5.135/toner-opc-1.rrd N:90]
Checking toner Black Cartridge... 0 %
RRD[update /opt/librenms/rrd/10.0.5.135/toner-toner-2.rrd N:0]
Checking toner Maintenance Kit... 100 %
RRD[update /opt/librenms/rrd/10.0.5.135/toner-fuser-3.rrd N:100]
Checking toner Tray 1... 100 %
RRD[update /opt/librenms/rrd/10.0.5.135/toner-input-4.rrd N:100]
>> SNMP: [1/0.07s] MySQL: [1/0.00s] RRD: [8/0.00s]
>> Runtime for Poller module 'printer-supplies': 0.0822 seconds with 95744 bytes
RRD[update /opt/librenms/rrd/10.0.5.135/poller-perf-printer-supplies.rrd N:0.082178115844727]
#### Unload poller module printer-supplies ####
And after the run, the toner is still reported as 0%. However if I run a discovery poll I get the following:
#### Load discovery module printer-supplies ####
Module enabled: Global + | OS + | Device | Manual
Printer Supplies:
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesLevel']
prtMarkerSuppliesLevel.1.1 = 54000
prtMarkerSuppliesLevel.1.2 = 21000
prtMarkerSuppliesLevel.1.3 = 200000
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesType']
prtMarkerSuppliesType.1.1 = opc
prtMarkerSuppliesType.1.2 = toner
prtMarkerSuppliesType.1.3 = fuser
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesMaxCapacity']
prtMarkerSuppliesMaxCapacity.1.1 = 60000
prtMarkerSuppliesMaxCapacity.1.2 = 21000
prtMarkerSuppliesMaxCapacity.1.3 = 200000
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUsa' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesDescription']
prtMarkerSuppliesDescription.1.1 = "Imaging Unit"
prtMarkerSuppliesDescription.1.2 = "Black Cartridge"
prtMarkerSuppliesDescription.1.3 = "Maintenance Kit"
SQL[select * from `printer_supplies` where `printer_supplies`.`device_id` = ? and `printer_supplies`.`device_id` is not null [166] 0.35ms]
.
SQL[update `printer_supplies` set `supply_oid` = ?, `supply_capacity` = ?, `supply_current` = ? where `supply_id` = ? [".1.3.6.1.2.1.43.11.1.1.9.1.2","21000",100,1762] 1.75ms]
Updated data: array (
'supply_oid' => '.1.3.6.1.2.1.43.11.1.1.9.1.2',
'supply_capacity' => '21000',
'supply_current' => 100.0,
)
.
Tray Paper Level:
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtInputName']
prtInputName.1.1 = "MP Tray"
prtInputName.1.2 = "Manual Envelope"
prtInputName.1.3 = "Manual Paper"
prtInputName.1.4 = "Tray 1"
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtInputCurrentLevel']
prtInputCurrentLevel.1.1 = 0
prtInputCurrentLevel.1.2 = 0
prtInputCurrentLevel.1.3 = 0
prtInputCurrentLevel.1.4 = 550
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtInputMaxCapacity']
prtInputMaxCapacity.1.1 = 100
prtInputMaxCapacity.1.2 = 1
prtInputMaxCapacity.1.3 = 1
prtInputMaxCapacity.1.4 = 550
.
.
.
.
>> SNMP: [7/0.85s] MySQL: [2/0.02s] RRD: [0/0.00s]
>> Runtime for Discovery module 'printer-supplies': 0.8562 seconds with 99408 bytes
#### Unload discovery module printer-supplies ####
And this DOES update toner levels.
Any help appreciated. I only run an overall discovery poll every 6 hours, this means currently empty toners are not sending notifications for up to 6 hours.
laf
19 March 2026 12:43
2
Wrong OID being used.
Can you provide a walk from:
/usr/bin/snmpbulkwalk -v2c -c COMMUNITY -OQUs -m Printer-MIB -M /opt/librenms/mibs udp:HOSTNAME:1161 .1.3.6.1.2.1.43.11.1.1
Replace COMMUNITY and HOSTNAME with the correct values
Hi,
There was a typo with the port number in your command but when I fixed it this is the output:
prtMarkerSuppliesMarkerIndex.1.1 = 1
prtMarkerSuppliesMarkerIndex.1.2 = 1
prtMarkerSuppliesMarkerIndex.1.3 = 1
prtMarkerSuppliesColorantIndex.1.1 = 1
prtMarkerSuppliesColorantIndex.1.2 = 1
prtMarkerSuppliesColorantIndex.1.3 = 0
prtMarkerSuppliesClass.1.1 = supplyThatIsConsumed
prtMarkerSuppliesClass.1.2 = supplyThatIsConsumed
prtMarkerSuppliesClass.1.3 = supplyThatIsConsumed
prtMarkerSuppliesType.1.1 = opc
prtMarkerSuppliesType.1.2 = toner
prtMarkerSuppliesType.1.3 = fuser
prtMarkerSuppliesDescription.1.1 = "Imaging Unit"
prtMarkerSuppliesDescription.1.2 = "Black Cartridge"
prtMarkerSuppliesDescription.1.3 = "Maintenance Kit"
prtMarkerSuppliesSupplyUnit.1.1 = impressions
prtMarkerSuppliesSupplyUnit.1.2 = impressions
prtMarkerSuppliesSupplyUnit.1.3 = impressions
prtMarkerSuppliesMaxCapacity.1.1 = 60000
prtMarkerSuppliesMaxCapacity.1.2 = 21000
prtMarkerSuppliesMaxCapacity.1.3 = 200000
prtMarkerSuppliesLevel.1.1 = 54000
prtMarkerSuppliesLevel.1.2 = 21000
prtMarkerSuppliesLevel.1.3 = 200000
(The toner has now been replaced so 21000 out of 21000 will be correct)
laf
19 March 2026 23:05
4
Doesn’t make sense.
Can you post a discovery with full debug: lnms device:discover <HOSTNAME> -vvv -m printer-supplies
Hi,
I’ve obfuscated the IP address and SNMP community but otherwise untouched:
lnms device:discover HOSTNAME -vvv -m printer-supplies
SQL[select `migration` from `migrations` order by `id` desc limit 1 [] 0.38ms]
SQL[select count(*) as aggregate from `migrations` [] 0.25ms]
SQL[select version() [] 0.23ms]
===========================================
Component | Version
--------- | -------
LibreNMS | 26.3.1 (2026-03-17T09:25:34+00:00)
DB Schema | 2026_03_05_112733_ospfv3_instances_nullable (374)
PHP | 8.3.6
Python | 3.12.3
Database | MariaDB 10.11.14-MariaDB-0ubuntu0.24.04.1
RRDTool | 1.7.2
SNMP | 5.9.4.pre2
===========================================
LibreNMS config cache cleared and config reloaded.
Starting discovery:
Override Discovery modules: printer-supplies
SQL[select `device_id` from `devices` where `hostname` = ? ["HOSTNAME"] 0.38ms]
SQL[select * from `devices` where `device_id` = ? limit 1 [166] 0.4ms]
SQL[select `config_name`, `config_value` from `config` [] 0.38ms]
SQL[select * from `graph_types` [] 0.15ms]
Hostname: HOSTNAME (printer)
ID: 166
OS: lexmarkprinter
IP: HOSTNAME
SQL[select * from `devices_attribs` where `devices_attribs`.`device_id` = ? and `devices_attribs`.`device_id` is not null [166] 0.34ms]
[FPING] '/usr/bin/fping' '-e' '-q' '-c' '5' '-p' '1000' '-t' '1000' '-O' '0' 'HOSTNAME'
response: HOSTNAME : xmt/rcv/%loss = 5/5/0%, min/avg/max = 0.392/59.2/76.3
SNMP['/usr/bin/snmpget' '-M' '/opt/librenms/mibs' '-m' 'SNMPv2-TC:SNMPv2-MIB:IF-MIB:IP-MIB:TCP-MIB:UDP-MIB:NET-SNMP-VACM-MIB' '-v2c' '-c' 'COMMUNITY' '-OQXUte' '-Pu' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'SNMPv2-MIB::sysObjectID.0']
SNMPv2-MIB::sysObjectID.0 = SNMPv2-SMI::enterprises.641.51.71107203
SQL[select * from `device_outages` where `device_outages`.`device_id` = ? and `device_outages`.`device_id` is not null and `up_again` is null [166] 0.52ms]
SQL[select * from `device_stats` where `device_stats`.`device_id` = ? and `device_stats`.`device_id` is not null limit 1 [166] 0.31ms]
SQL[update `device_stats` set `ping_last_timestamp` = ?, `ping_rtt_last` = ?, `ping_rtt_prev` = ?, `ping_rtt_avg` = ?, `ping_loss_avg` = ?, `device_stats`.`updated_at` = ? where `id` = ? ["2026-03-19 23:09:07",59.2,2.18,15.1001133377806,2.7715482168856452e-56,"2026-03-19 23:09:07",342] 1.05ms]
SQL[update `devices` set `last_ping` = ?, `last_ping_timetaken` = ? where `device_id` = ? ["2026-03-19 23:09:07",59.2,166] 0.98ms]
RRD[update /opt/librenms/rrd/HOSTNAME/icmp-perf.rrd N:59.2:5:5:0.392:76.3]
RRDtool Output: Attempting to initialize OS: lexmarkprinter
Attempting to initialize Group OS: printer
OS initialized: LibreNMS\OS\Shared\Printer
#### Load discovery module core ####
Module enabled: Global + | OS | Device | Manual
SNMP['/usr/bin/snmpget' '-M' '/opt/librenms/mibs' '-m' 'SNMPv2-TC:SNMPv2-MIB:IF-MIB:IP-MIB:TCP-MIB:UDP-MIB:NET-SNMP-VACM-MIB' '-v2c' '-c' 'COMMUNITY' '-OQXUte' '-Pu' '-On' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'SNMPv2-MIB::sysObjectID.0' 'SNMPv2-MIB::sysDescr.0' 'SNMPv2-MIB::sysName.0']
.1.3.6.1.2.1.1.2.0 = .1.3.6.1.4.1.641.51.71107203
.1.3.6.1.2.1.1.1.0 = Lexmark M3250 version MSTGM.221.204 kernel 5.4.90-yocto-standard All-N-1
.1.3.6.1.2.1.1.5.0 = STAC135
| Lexmark M3250 version MSTGM.221.204 kernel 5.4.90-yocto-standard All-N-1 | .1.3.6.1.4.1.641.51.71107203 |
>> SNMP: [2/0.03s] MySQL: [5/0.03s] RRD: [1/0.00s]
>> Runtime for Discovery module 'core': 0.0230 seconds with 57312 bytes
#### Unload discovery module core ####
#### Load discovery module printer-supplies ####
Module enabled: Global + | OS + | Device | Manual +
Printer Supplies: SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesLevel']
prtMarkerSuppliesLevel.1.1 = 54000
prtMarkerSuppliesLevel.1.2 = 21000
prtMarkerSuppliesLevel.1.3 = 200000
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesType']
prtMarkerSuppliesType.1.1 = opc
prtMarkerSuppliesType.1.2 = toner
prtMarkerSuppliesType.1.3 = fuser
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesMaxCapacity']
prtMarkerSuppliesMaxCapacity.1.1 = 60000
prtMarkerSuppliesMaxCapacity.1.2 = 21000
prtMarkerSuppliesMaxCapacity.1.3 = 200000
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUsa' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtMarkerSuppliesDescription']
prtMarkerSuppliesDescription.1.1 = "Imaging Unit"
prtMarkerSuppliesDescription.1.2 = "Black Cartridge"
prtMarkerSuppliesDescription.1.3 = "Maintenance Kit"
SQL[select * from `printer_supplies` where `printer_supplies`.`device_id` = ? and `printer_supplies`.`device_id` is not null [166] 1.1ms]
...
Tray Paper Level: SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtInputName']
prtInputName.1.1 = "MP Tray"
prtInputName.1.2 = "Manual Envelope"
prtInputName.1.3 = "Manual Paper"
prtInputName.1.4 = "Tray 1"
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtInputCurrentLevel']
prtInputCurrentLevel.1.1 = 0
prtInputCurrentLevel.1.2 = 0
prtInputCurrentLevel.1.3 = 0
prtInputCurrentLevel.1.4 = 550
SNMP['/usr/bin/snmpbulkwalk' '-v2c' '-c' 'COMMUNITY' '-OQUs' '-m' 'Printer-MIB' '-M' '/opt/librenms/mibs' '-t' '20' '-r' '2' 'udp:HOSTNAME:161' 'prtInputMaxCapacity']
prtInputMaxCapacity.1.1 = 100
prtInputMaxCapacity.1.2 = 1
prtInputMaxCapacity.1.3 = 1
prtInputMaxCapacity.1.4 = 550
....
>> SNMP: [7/0.93s] MySQL: [1/0.01s] RRD: [0/0.00s]
>> Runtime for Discovery module 'printer-supplies': 0.9450 seconds with 128776 bytes
#### Unload discovery module printer-supplies ####
>>> Discovered HOSTNAME (166) in 5.010 seconds <<<
INFO: device:discover HOSTNAME (166) discovered in 5.010s
SQL[update `devices` set `last_discovered_timetaken` = ?, `last_discovered` = ? where `device_id` = ? [5.0103278160095215,"2026-03-19 23:09:08",166] 1.19ms]
SNMP [9/0.97s]: Snmpget[2/0.03s] Snmpwalk[7/0.93s]
SQL [14/0.08s]: Select[11/0.04s] Update[3/0.03s]
RRD [1/0.00s]: Update[1/0.00s]
As I noted originally - discovery is fine and the toner level is updated during a discovery run, it just doesn’t update during polling.