Tools for graphs and reports

I would like to find a tool that allow me to collect data from Mikrotik hAP AX3 automatically.

Things I’ve tried but not suitable:

  • The Dude with Windows client: no MacOS client, not much graphs, quite complex to understand for an average user like me.
  • Graphs: only seems to monitor bandwidth and resource usage

What I would like to see

  • Router uptime ( should show drop and restart)
  • Wireless interface uptime (would be nice to keep track of how many times my 5GHz drop, because it used to happen a lot)
  • Actual internet speed of each interface

I used PRTG, someone here Zabbix

I think your bigger problem is the newer wifi-qcom / wifi-qcom-ac wi-fi drivers (former is used on hAPax3) … do not support SNMP data at present.

Even if you wanted to use the Dude, it won’t work for Wi-Fi stats. Same with Zabbix/etc/etc. You need some source data, and RouterOS does not send any for Wi-Fi on AX devices. See http://forum.mikrotik.com/t/wifiwave2-snmp-metrics-missing-hap-ax2/162297/1 .

Now you would have uptime, and up/down and tx/rx stats for the physical wifi interface via SNMP… But not any signal or wi-fi client, etc data.

Thank you for the answers guys. My apologies for the late reply. I don’t know why I don’t get notifications.

With the information from Amm0, I think it is pretty safe to give up on that. I will use Speedtest + Grafana to track wired connection to my NAS and call it then :slight_smile:

Some times the turtle wins the race.

I believe 7.17rc (which is likely going to stable soon) has some new SNMP attributes – although I have NOT tested it. I maintain a webpage, https://tikoci.github.io/restraml/ , where you can diff CLI/REST API schemas across versions, and while I have all the MIBs for download, there isn’t an automated diff tool for SNMP. But here are the SNMP MIB diff from 7.16 to 7.17 to see the new attributes.

7c7
< TEXTUAL-CONVENTION, DisplayString, MacAddress, TruthValue, DateAndTime FROM SNMPv2-TC
---
> TEXTUAL-CONVENTION, DisplayString, MacAddress, DateAndTime FROM SNMPv2-TC
11c11
<   LAST-UPDATED "202410300000Z"
---
>   LAST-UPDATED "202405090000Z"
15c15
<   REVISION "202410300000Z"
---
>   REVISION "202405090000Z"
44d43
< mtxrWifi OBJECT IDENTIFIER ::= { mtXRouterOs 21 }
2989,2990c2988
<         controllerInit(14),
<         lowVoltageTooLow(15)
---
>         controllerInit(14)
3657,3885d3654
< 
< mtxrWifiCapsman OBJECT IDENTIFIER ::= { mtxrWifi 1 }
< 
< mtxrWifiCapsmanEnabled OBJECT-TYPE
<     SYNTAX TruthValue
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Indicates whether the Capsman is enabled."
<     ::= { mtxrWifiCapsman 1 }
< 
< mtxrWifiCapsmanInterfaces OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "List of interfaces associated with Capsman."
<     ::= { mtxrWifiCapsman 2 }
< 
< mtxrWifiCapsmanCACertificate OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "The CA certificate used by Capsman."
<     ::= { mtxrWifiCapsman 3 }
< 
< mtxrWifiCapsmanCertificate OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "The local certificate used by Capsman."
<     ::= { mtxrWifiCapsman 4 }
< 
< mtxrWifiCapsmanRequirePeerCertificate OBJECT-TYPE
<     SYNTAX TruthValue
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Whether a peer certificate is required."
<     ::= { mtxrWifiCapsman 5 }
< 
< mtxrWifiCapsmanPackagePath OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Path to the Capsman package directory."
<     ::= { mtxrWifiCapsman 6 }
< 
< mtxrWifiCapsmanUpgradePolicy OBJECT-TYPE
<     SYNTAX Integer32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Capsman upgrade policy."
<     ::= { mtxrWifiCapsman 7 }
< 
< mtxrWifiCapsmanGeneratedCaCertificate OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Automatically generated CA certificate."
<     ::= { mtxrWifiCapsman 8 }
< 
< mtxrWifiCapsmanGeneratedCertificate OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Automatically generated local certificate."
<     ::= { mtxrWifiCapsman 9 }
< 
< mtxrWifiCap OBJECT IDENTIFIER ::= { mtxrWifi 2 }
< 
< mtxrCapEnabled OBJECT-TYPE
<     SYNTAX TruthValue
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Indicates whether the CAP is enabled."
<     ::= { mtxrWifiCap 1 }
< 
< mtxrCapInterfaces OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "List of interfaces used by the CAP."
<     ::= { mtxrWifiCap 2 }
< 
< mtxrCapCertificate OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "The local certificate used by the CAP."
<     ::= { mtxrWifiCap 3 }
< 
< mtxrCapCapsManAddresses OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Addresses of associated CapsMan controllers."
<     ::= { mtxrWifiCap 4 }
< 
< mtxrCapCapsManNames OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Names of associated CapsMan controllers."
<     ::= { mtxrWifiCap 5 }
< 
< mtxrCapCapsManCertificateCommonNames OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Common names of CapsMan certificates."
<     ::= { mtxrWifiCap 6 }
< 
< mtxrCapLockToCapsMan OBJECT-TYPE
<     SYNTAX TruthValue
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Indicates if the CAP is locked to a specific CapsMan."
<     ::= { mtxrWifiCap 7 }
< 
< mtxrCapSlavesStatic OBJECT-TYPE
<     SYNTAX TruthValue
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Indicates if CAP slaves are set to static mode."
<     ::= { mtxrWifiCap 8 }
< 
< mtxrCapSlavesDatapath OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Datapath configuration of CAP slaves."
<     ::= { mtxrWifiCap 9 }
< 
< mtxrCapRequestedCertificate OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Requested certificate for the CAP."
<     ::= { mtxrWifiCap 10 }
< 
< mtxrCapLockedCapsManCommonName OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Locked CapsMan common name."
<     ::= { mtxrWifiCap 11 }
< 
< mtxrCapCurrentCapsManAddress OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Current CapsMan address being used."
<     ::= { mtxrWifiCap 12 }
< 
< mtxrCapCurrentCapsManIdentity OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Current identity of the connected CapsMan."
<     ::= { mtxrWifiCap 13 }
< 
< -- Remote Caps *************************************************
< 
< mtxrRemoteCapTable OBJECT-TYPE
<     SYNTAX SEQUENCE OF MtxrWifiRemoteCapEntry
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION ""
<     ::= { mtxrWifi 3 }
< 
< mtxrWifiRemoteCapEntry OBJECT-TYPE
<     SYNTAX MtxrWifiRemoteCapEntry
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION "Entry containing remote CAP statistics"
<     INDEX { mtxrRemoteCapId }
<     ::= { mtxrRemoteCapTable 1 }
< 
< MtxrWifiRemoteCapEntry ::= SEQUENCE {
<     mtxrRemoteCapId                ObjectIndex,
<     mtxrRemoteCapAddress           DisplayString,
<     mtxrRemoteCapIdentity          DisplayString,
<     mtxrRemoteCapBoardName         DisplayString,
<     mtxrRemoteCapSerial            DisplayString,
<     mtxrRemoteCapVersion           DisplayString,
<     mtxrRemoteCapBaseMac           MacAddress,
<     mtxrRemoteCapCommonName        DisplayString,
<     mtxrRemoteCapState             DisplayString
< }
< 
< mtxrRemoteCapId OBJECT-TYPE
<     SYNTAX ObjectIndex
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION "ID of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 1 }
< 
< mtxrRemoteCapAddress OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "IP address of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 2 }
< 
< mtxrRemoteCapIdentity OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Identity name of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 3 }
< 
< mtxrRemoteCapBoardName OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Board name of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 4 }
< 
< mtxrRemoteCapSerial OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Serial number of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 5 }
< 
< mtxrRemoteCapVersion OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "RouterOS version of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 6 }
3887,4123d3655
< mtxrRemoteCapBaseMac OBJECT-TYPE
<     SYNTAX MacAddress
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Base MAC address of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 7 }
< 
< mtxrRemoteCapCommonName OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Certificate common name of the remote CAP."
<     ::= { mtxrWifiRemoteCapEntry 8 }
< 
< mtxrRemoteCapState OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "State of the remote CAP (e.g., connected, disconnected)."
<     ::= { mtxrWifiRemoteCapEntry 9 }
<     
< -- Wifi Registration Table *************************************************
< 
< mtxrWifiRegistrationTable        OBJECT-TYPE
<     SYNTAX SEQUENCE OF MtxrWifiRegistrationTableEntry
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION ""
<     ::= { mtxrWifi 4 }
< 
< mtxrWifiRegistrationTableEntry OBJECT-TYPE
<     SYNTAX MtxrWifiRegistrationTableEntry
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION "Entry containing wifi registration statistics"
<     INDEX { mtxrWifiRegistrationMacAddress, mtxrWifiRegistrationInterface }
<     ::= { mtxrWifiRegistrationTable 1 }
< 
< MtxrWifiRegistrationTableEntry ::= SEQUENCE {
<     mtxrWifiRegistrationMacAddress         MacAddress,
<     mtxrWifiRegistrationInterface          ObjectIndex,
<     mtxrWifiRegistrationSsid               DisplayString,
<     mtxrWifiRegistrationUptime             TimeTicks,
<     mtxrWifiRegistrationLastActivity       Integer32,
<     mtxrWifiRegistrationSignal             Integer32,
<     mtxrWifiRegistrationAuthType           DisplayString,
<     mtxrWifiRegistrationBand               DisplayString,
<     mtxrWifiRegistrationTxRate             Gauge32,
<     mtxrWifiRegistrationRxRate             Gauge32,
<     mtxrWifiRegistrationTxPackets          Counter64,
<     mtxrWifiRegistrationRxPackets          Counter64,
<     mtxrWifiRegistrationTxBytes            Counter64,
<     mtxrWifiRegistrationRxBytes            Counter64,
<     mtxrWifiRegistrationTxBitsPerSecond    Integer32,
<     mtxrWifiRegistrationRxBitsPerSecond    Integer32,
<     mtxrWifiRegistrationVlanId             Integer32,
<     mtxrWifiRegistrationAuthorized         TruthValue
< }
< 
< mtxrWifiRegistrationMacAddress OBJECT-TYPE
<     SYNTAX MacAddress
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "MAC address of the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 1 }
< 
< mtxrWifiRegistrationInterface OBJECT-TYPE
<     SYNTAX ObjectIndex
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION "Interface id of the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 2 }
< 
< mtxrWifiRegistrationSsid OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "SSID of the connected access point."
<     ::= { mtxrWifiRegistrationTableEntry 3 }
< 
< mtxrWifiRegistrationUptime OBJECT-TYPE
<     SYNTAX TimeTicks
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Uptime of the registered connection."
<     ::= { mtxrWifiRegistrationTableEntry 4 }
< 
< mtxrWifiRegistrationLastActivity OBJECT-TYPE
<     SYNTAX Integer32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Time since the last activity of the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 5 }
< 
< mtxrWifiRegistrationSignal OBJECT-TYPE
<     SYNTAX Integer32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Signal strength of the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 6 }
< 
< mtxrWifiRegistrationAuthType OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Authentication type used by the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 7 }
< 
< mtxrWifiRegistrationBand OBJECT-TYPE
<     SYNTAX DisplayString
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Wireless band used by the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 8 }
< 
< mtxrWifiRegistrationTxRate OBJECT-TYPE
<     SYNTAX Gauge32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Transmission rate of the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 9 }
< 
< mtxrWifiRegistrationRxRate OBJECT-TYPE
<     SYNTAX Gauge32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Reception rate of the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 10 }
< 
< mtxrWifiRegistrationTxPackets OBJECT-TYPE
<     SYNTAX Counter64
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Number of transmitted packets."
<     ::= { mtxrWifiRegistrationTableEntry 11 }
< 
< mtxrWifiRegistrationRxPackets OBJECT-TYPE
<     SYNTAX Counter64
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Number of received packets."
<     ::= { mtxrWifiRegistrationTableEntry 12 }
< 
< mtxrWifiRegistrationTxBytes OBJECT-TYPE
<     SYNTAX Counter64
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Number of transmitted bytes."
<     ::= { mtxrWifiRegistrationTableEntry 13 }
< 
< mtxrWifiRegistrationRxBytes OBJECT-TYPE
<     SYNTAX Counter64
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Number of received bytes."
<     ::= {mtxrWifiRegistrationTableEntry 14 }
< 
< mtxrWifiRegistrationTxBitsPerSecond OBJECT-TYPE
<     SYNTAX Integer32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Transmission rate in bits per second."
<     ::= { mtxrWifiRegistrationTableEntry 15 }
< 
< mtxrWifiRegistrationRxBitsPerSecond OBJECT-TYPE
<     SYNTAX Integer32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Reception rate in bits per second."
<     ::= { mtxrWifiRegistrationTableEntry 16 }
< 
< mtxrWifiRegistrationVlanId OBJECT-TYPE
<     SYNTAX Integer32
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "VLAN ID of the registered device."
<     ::= { mtxrWifiRegistrationTableEntry 17 }
< 
< mtxrWifiRegistrationAuthorized OBJECT-TYPE
<     SYNTAX TruthValue
<     MAX-ACCESS read-only
<     STATUS current
<     DESCRIPTION "Indicates whether the device is authorized."
<     ::= { mtxrWifiRegistrationTableEntry 18 }
< 
< -- Wifi Interfaces ***********************************************
< 
< mtxrWifiInterfaces        OBJECT-TYPE
<     SYNTAX SEQUENCE OF MtxrWifiInterfacesEntry
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION ""
<     ::= { mtxrWifi 5 }
< 
< mtxrWifiInterfacesEntry OBJECT-TYPE
<     SYNTAX MtxrWifiInterfacesEntry
<     MAX-ACCESS not-accessible
<     STATUS current
<     DESCRIPTION "An entry representing WiFi interface"
<     INDEX { mtxrWifiInterfacesId }
<     ::= { mtxrWifiInterfaces 1 }
< 
< MtxrWifiInterfacesEntry ::= SEQUENCE {
<     mtxrWifiInterfacesId             ObjectIndex,
<     mtxrWifiInterfacesName           DisplayString,
<     mtxrWifiInterfacesSsid           DisplayString,
<     mtxrWifiInterfacesFreq           DisplayString
< }
< 
< mtxrWifiInterfacesId OBJECT-TYPE
<     SYNTAX      ObjectIndex
<     MAX-ACCESS  not-accessible
<     STATUS      current
<     DESCRIPTION "Unique identifier for each WiFi interface"
<     ::= { mtxrWifiInterfacesEntry 1 }
< 
< mtxrWifiInterfacesName OBJECT-TYPE
<     SYNTAX      DisplayString
<     MAX-ACCESS  read-only
<     STATUS      current
<     DESCRIPTION "Name of the WiFi interface"
<     ::= { mtxrWifiInterfacesEntry 2 }
< 
< mtxrWifiInterfacesSsid OBJECT-TYPE
<     SYNTAX      DisplayString
<     MAX-ACCESS  read-only
<     STATUS      current
<     DESCRIPTION "SSID associated with the WiFi interface"
<     ::= { mtxrWifiInterfacesEntry 3 }
< 
< mtxrWifiInterfacesFreq OBJECT-TYPE
<     SYNTAX      DisplayString
<     MAX-ACCESS  read-only
<     STATUS      current
<     DESCRIPTION "Frequency used by the WiFi interface"
<     ::= { mtxrWifiInterfacesEntry 4 }
<

That’s is indeed very true. I learned this wisdom and a bunch of terminologies today :slight_smile:

Do you suggest to wait for the latest version that exposes some SNMP attributes via REST API, and fetch it from there? Do you have any tool suggestions that can collect these data?

Have a look at this thread:
http://forum.mikrotik.com/t/tool-using-splunk-to-analyse-mikrotik-logs-4-0-graphing-everything/153043/1
You can use Splunk to graph more or less everything.

Thanks, I saw that thread before but was hoping to have these data stay at home rather than cloud. I guess Grafana can do it too.

FWIW, you can run Splunk locally, so no cloud required. @Jonte uses syslog data to capture monitoring data - instead of SNMP (or REST/API) which is why it’s pretty complete set of monitored things. Unfortunately, the log parsing is done via Splunk in @Jonte’s approach… so not so easy to use Graphina with it.

But I’d try 7.17 via SNMP with your current monitoring solution, as it does appear to have AX Wi-Fi things. While you could use REST/HTTP to obtain some data, it be a completely separate from SNMP & would be tricky to use to monitoring Wi-Fi clients since you can just poll for data using REST. Which is why @Jonte uses the logs, since that is more “real-time” stream of router activity.

I use Zabbix for monitoring all of my Mikrotiks and with 7.17rc the new SNMP MIB with wifi capsman support. (don’t use all the features, but seems alright)

There’s a Mikrotik SNMP Template in Zabbix, but obviously that doesn’t have 7.17rc MIB yet (aka wifi capsman SNMP OIDs).

Thanks, Zabbix is exactly what I need. Will wait for 7.17 upgrade before I give it a shot.