Network Management
Diagnostics: Troubleshoot UnDP issues
This article shows How to Troubleshoot UnDP issues
First published date
Last published date
Overview
Product section
Resolution
UnDP General Info:
UnDP - How to run UnDP:
- Go to Start -> All Programs -> Solarwinds Orion -> Network Performance Monitor -> Universal Device Poller
- This is the UnDP tool, you can type any OID and as long as your device supports that OID, you can test and assign it to elements as see fit.
UnDP Troubleshooting:
- Useful Tip. We also ship with SNMPWalk to see which OIDs are available on a device.
- C:\Program Files (x86)\SolarWinds\Orion\SnmpWalk.exe
UNDP Logs and Tables
- UnDP Win32 App
- Application:
- C:\Program Files (x86)\SolarWinds\Orion\NPM\UniversalDevicePoller.exe
- Config File
- C:\Program Files (x86)\SolarWinds\Orion\NPM\UniversalDevicePoller.exe.config
- Logs
- UnDP Win32 App Log
- C:\ProgramData\SolarWinds\Logs\Orion\NPM\UniversalDevicePoller.Log
- UnDP polling logs can be found under the NPM BL
- C:\ProgramData\Solarwinds\Logs\Orion\NPM.BusinessLayer.log
- UnDP Win32 App Log
- Tables
- CustomPollersAssignment
- CustomPollersEnums
- CustomPollersLabels
- CustomPollersParsers
- CustomPollers
- CustomPollersScratchStatistics
- CustomPollersStatistics_Detail
- CustomPollersStatistics_Hourly
- CustomPollerStatistics_Daily
- CustomPollersStatus
- CustomPollersThresholds
*******************************************************************************************************************
UnDP - Major Changes in latest releases
Latest Changes in v10.4
UnDP is now polled via the COLLECTOR Service:
Universal Device Poller (UnDP) Improvements (NPM v10.4 upwards)
- Multiple UnDP in a single chart
- UnDP Parse Transform function
- UnDP Polling and Retention settings
http://thwack.solarwinds.com/message/186567#186567
Latest UnDP changes in v10.4:
- Polling Interval - We added new option into the UnDP application (see screenshot).
- User now has the chance to change/overwrite polling interval value for universal device poller.
- If he decides to edit the polling interval for specific UnDP he needs to edit number in minutes (within the range 1-600).
- This value will be stored into the database together with other information about the poller.
- This value is optional so he can just ignore polling interval text box or enter zero which means node statistics poll interval will be used (same behaviour as before).
Important Note: Transformation needs to have the same polling interval as all the pollers in the transformation formula to achieve correct functionality.
- New transform function - new function called 'parse' has been added. Function has two parameters - regular expression and formula.
Regular expression must contain named group called 'result', which will be used as result of the function. Only first match is returned.
Examples:
parse((?<result>\d+), Current temperature is 55) => 55
parse(((?<result>\d+)F), Current temperature is 55 Celsius (159F)) => 159
Regular expression syntax can be found here:
http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet (© 2006 - 2018 Mike Brind, available at https://www.mikesdotnetting.com, obtained on November 30, 2018)
- Regular Expression (RegEx) syntax testing sites:
- http://www.regexr.com/ (© 2018 Media Temple, available at http://www.regexr.com/, obtained on November 30, 2018)
- http://regexhero.net/tester/ (© 2009-2018 BucketSoft, LLC, available at http://regexhero.net/, obtained on November 30, 2018)
*******************************************************************************************************************
Creating a Universal Device Poller (UnDP)
Orion monitors a lot of objects by default, but if there is something in particular that you need to monitor on a device that is not monitored by default, you can use the Universal Device Poller.This allows you to monitor any OID that your devices support. Orion v9.0 also included the ability to monitor OIDs in tables in this way.
The MIB Database and the Universal Device Poller
When you use the Universal Device Poller, you have an option to browse the MIB Tree to the OID that you need to monitor.If you cannot find the OID you need in the MIB tree, this simply means that it doesn’t exist in our MIB database – if you know the exact OID that you need to poll, you can type it in directly.
If you are typing this indirectly, you will need to expand the “Advanced options” section to define the type of value this is, and how it should be polled.
This is picked up automatically if the OID is already in the database.
To add MIBs to the Orion MIB database, you need to first contact the vendor and ask for the MIB files in .mib or .my format,
then create a support ticket and attach those files to your case.
Scalar and Table values
Scalar objects in the MIBs are also known as “Leaf” values. They can contain a single variable, and are usually polled with a Get or a GetNext request.A Table entry can contain multiple “Leaves”, which could be thought of as column names. Each entry in the table could be considered a “row” in the table.
For example, the Interfaces Table on the right will have an entry on every interface on a device. Many vendors will also include Virtual Interfaces in this table.
By examining and polling the Interfaces table, you can poll the Speed, Administrative Status and Operation status of each interface entry.
The “Get Table” option allows you to poll for all values in the column of a particular table. You can also use another column as your labels for these values.
Using the Interfaces table as an example, this would allow you to poll the Operation status of each interface, and then label these with the name of each interface.
Advanced Options
You will need to define your Advanced Options depending on the type of OID that you are polling.
As you select the value from the MIB Tree, take note of the “Type” listed for it. This will help when deciding how to set the value up in the “Advanced Options” section.
- Rate: Rates are always defined as Integers of any type, or as Gauges.
- Some common “Types” of these would be Integer, Integer32, UInteger, Guage32 etc.
Common values that you would poll as a Rate would be bandwidth in bits per second – when you define this, you will need to set up the Units, and Time Frame. - Other Integer values you might come across would be specific values – for example, the number of Users currently logged into the system, or the number of Interfaces on the device.
These can also be set up as Rate pollers, but might not need a Unit or Time Frame.
- Some common “Types” of these would be Integer, Integer32, UInteger, Guage32 etc.
- Counter: You will see counter values defined as type Counter, Counter32 or Counter64.
- Typical counter values would keep track of transmission errors, discards, number of bytes transmitted, etc., and will be an increasing number.
- When we poll Counter values using the Universal Device Poller, the value itself is stored in the database, but the difference (delta) between the current value and previous value is used when generating graphs based on the Counter.
- Raw Values: Raw Values essentially allow you to poll ‘everything else’.
- The “Text” type will cover any string of characters – like contact names, descriptions, or serial numbers.
You can also define the MAC Address types, IP Address, Boolean and TimeTicks types here. E
numerations are widely used to keep the MIB sizes on devices small. - Information like the status of an Interface is commonly returned as an integer, where different integer values correspond to different statuses, instead of reporting the status as a string value (eg. 1 = Up, 2 = Down, 3 = Unknown).
- When you set a poller up as an Enumeration, you will have the option to Map Values, and define what each of these returned values mean.
- The “Text” type will cover any string of characters – like contact names, descriptions, or serial numbers.
- SNMP Get Type: This defines the type of query you need to run to retrieve that information.
- Scalar values are retrieved using either Get or GetNext, and a Get Table is used to retrieve all values from a particular “column” in a table value.
- The Get Next and Get Table types are only available if you are polling a Node – only a Get request can be used when polling an Interface value.
- Polling Type: Here you can choose whether the universal poller should be defined to poll against your Nodes, or your monitored Interfaces.
Some devices will store additional information about their interfaces in a different MIB. By selecting “Interfaces”, you can choose to poll just specific interfaces for those values, and this will allow you to place graphs, gauges or tables on the Interface details page.
*******************************************************************************************************************
Creating a UnDP Poller Transformation
UnDP Transforms
Universal Device Poller – Transform Results Definition
The transform definition is the algebraic formula used by your poller transform to compute the new performance measure that you want. Transforms are defined using basic algebraic operations, including addition, subtraction, multiplication, division, and exponents, where available pollers, listed in the Add Poller menu, serve as variables. Additionally, the Transform Results Wizard provides many predefined functions in the Add Function menu, as listed in the following table.
|
POLLER TRANSFORMATION |
DEFINITION |
|---|---|
|
Average |
Provides an average of the results of multiple pollers |
|
Minimum |
Provides the minimum of multiple poller results |
|
Maximum |
Provides the maximum of multiple poller results |
|
Truncate |
Truncates a polled value to a designated number of decimal places; e.g. Truncate({HiPrecision},4) truncates the result of the poller named HiPrecision to four decimal places. |
|
ColumnAverage |
Provides an average of the column values in a polled table |
|
ColumnMinimum |
Gives the minimum of a column of values in a polled table |
|
ColumnMaximum |
Gives the maximum of a column of values in a polled table |
|
ColumnSum |
Provides the sum of a column of values in a polled table |
|
Temperature > Celsius to Fahrenheit |
Provides the Fahrenheit equivalent of a poller result originally presented in Celsius |
|
Temperature > Fahrenheit to Celsius |
Provides the Celsius equivalent of a poller result originally presented in Fahrenheit |
|
X to Kilobyte |
Provides the number of Kilobytes equivalent to a poller result originally presented in Bytes |
|
X to Megabyte |
Provides the number of Megabytes equivalent to a poller result originally presented in Bytes |
|
X to Gigabyte |
Provides the number of Gigabytes equivalent to a poller result originally presented in Bytes |
|
X to Terabyte |
Provides the number of Terabyte s equivalent to a poller result originally presented in Bytes |
|
Kilobyte to Megabyte |
Provides the number of Megabytes equivalent to a poller result originally presented in Kilobytes |
|
Kilobyte to Gigabyte |
Provides the number of Gigabytes equivalent to a poller result originally presented in Kilobytes |
|
Kilobyte to Terabyte |
Provides the number of Terabytes equivalent to a poller result originally presented in Kilobytes |
|
Megabyte to Gigabyte |
Provides the number of Gigabytes equivalent to a poller result originally presented in Megabytes |
|
Megabyte to Terabyte |
Provides the number of Terabytes equivalent to a poller result originally presented in Megabytes |
|
Gigabyte to Terabyte |
Provides the number of Terabytes equivalent to a poller result originally presented in Gigabytes |
|
Parse |
Using C# regular expression syntax, retrieves the first match for a provided poller result in a string poller result, e.g. parse((?<TempTell>)\d+), Current temperature is 55) returns 55. For more information about C# regular expressions, see the appendix "Regular Expression Pattern Matching" in the SolarWinds Orion NPM Administrator Guide. |
*******************************************************************************************************************
UnDP KBs:
Universal Device Poller (UnDP) Test comes back with "OID Not Supported"
Make sure that the Poller is set for Get Next, or Get Table.
If the OID still comes back as unsupported, then the Device is not responding to the OID that you have set.
The best way to see what your device responds to is to use our Toolset and perform a MIB Walk.
MIB Walk will discover and produce reports detailing which MIBs and OIDs are supported on a particular device.
More information about SolarWinds SNMP Walk: A new tool for collecting SNMP MIB walks.
How does adding a MIB to the SolarWinds MIB Database help me?
While adding your MIBs to the SolarWinds MIB Database does not automatically ensure that Orion can poll all available data from your monitored devices, adding MIBs to the MIB database will help you if you are using Universal Device Pollers or traps to monitor your network, as indicated in the following sections. Note: After submitting your MIBs to the SolarWinds MIB Database,
you must download and install the new, updated MIB database to gain the benefits of your added MIBs.
Universal Device Poller
If you do not immediately know the OID that you want to poll, you can use the Universal Device Poller application to browse the MIB tree to find the data you want to poll. If you already know the MIB and/or OID for the data you want to poll, you do not need to add the corresponding MIBs to the SolarWinds database. Of course, adding your MIBs may be of assistance to another SolarWinds user in the future.
The following resource provides more information about Universal Device Pollers:
Traps
If your Orion server receives a trap from a monitored device, and the relevant MIB for the trap does not exist in the installed SolarWinds MIB Database, Orion may not display the correct data. Providing the relvant MIBs for your devices will resolve this issue, once the updated MIB database is installed.
Updating the MIB Database does not help if a Vendor is "Unknown"
Updating the MIB database will not help the case where a monitored device displays its Vendor as "Unknown". Devices that display with "Unknown" vendors do not have a SysObjectID corresponding to the device vendor in the Orion database.
To correct an "Unknown" vendor condition:
- Click Start > All Programs > SolarWinds Orion > Network Performance Monitor > System Manager.
- In the node tree in the left pane, right-click the device that is displaying with an "Unknown" vendor, and then click Node Details.
- Scroll down in the listed node details, and then make note of SysObjectID.
- Provide the SysObjectID, the device model, and the correct Vendor in a MIB addition request to support@solarwinds.com.
After you have provided this information, SolarWinds Development will likely add the device into an upcoming Orion release.
Note: After this update, Orion will not necessarily be able to poll your device for any additional information. In this case, adding a MIB is a cosmetic improvement.
Identifying Broken Universal Device Pollers
- Identifying Broken Universal Device Pollers
Use the following procedure to identify broken Universal Device Pollers (UnDPs) in your Orion NPM installation.
To identify broken UnDPs:
- Log on as an administrator to your Orion NPM server.
- Open the
NPM.BusinessLayer.logfile. - Note: By default, this file is located in
Install_Volume:\Documents and Settings\All Users\Application Data\SolarWinds\Logs\Orion\NPM.BusinessLayer.log - Search
NPM.BusinessLayer.logfor all instances of the following line:Custom poller error: A value was not returned.
- For each instance of
Custom poller error: A value was not returned., note the indicatedassignmentidandnode. - If you have SQL Server Management Studio installed, complete the following steps:
- Launch SQL Server Management Studio (Start > All Programs > Microsoft SQL Server > SQL Server Management Studio )
- Run SQL Server Management Studio on the SQL server hosting your Orion database.
- Log in to the instance hosting your Orion database.
- Expand Server\Instance > Databases.
- Right-click your Orion database, and then click New Query.
- Copy the following query into the new query field:
-- Scripts are not supported under any SolarWinds support program or service. -- Scripts are provided AS IS without warranty of any kind. SolarWinds further -- disclaims all warranties including, without limitation, any implied warranties -- of merchantability or of fitness for a particular purpose. The risk arising -- out of the use or performance of the scripts and documentation stays with you. -- In no event shall SolarWinds or anyone else involved in the creation, -- production, or delivery of the scripts be liable for any damages whatsoever -- (including, without limitation, damages for loss of business profits, business -- interruption, loss of business information, or other pecuniary loss) arising -- out of the use of or inability to use the scripts or documentation. SELECT * FROM CustomPollerAssignment WHERE CustomPollerAssignmentID = 'assignmentid' SELECT * FROM Nodes WHERE NodeID = 'node'
Note: Provide the values forassignmentidandnodeas recorded from theNPM.BusinessLayer.logfile. - Click Execute.
- If you do not have SQL Server Management Studio installed, complete the following steps:
- Click Start > All Programs > SolarWinds Orion > Advanced Features > Database Manager.
- If your Orion database is not listed in the left pane, complete the following steps:
- Click Add SQL Server.
- Using the format
Server/Instance, select or provide the SQL Server instance you are using as your Orion database. - Select the appropriate login method, providing credentials as required, and then click Connect to Database Server.
- Expand your Orion database in the left pane.
- Right-click the CustomPollerAssignment table, and then click Query Table.
- Replace the existing query with the following query:
-- Scripts are not supported under any SolarWinds support program or service. -- Scripts are provided AS IS without warranty of any kind. SolarWinds further -- disclaims all warranties including, without limitation, any implied warranties -- of merchantability or of fitness for a particular purpose. The risk arising -- out of the use or performance of the scripts and documentation stays with you. -- In no event shall SolarWinds or anyone else involved in the creation, -- production, or delivery of the scripts be liable for any damages whatsoever -- (including, without limitation, damages for loss of business profits, business -- interruption, loss of business information, or other pecuniary loss) arising -- out of the use of or inability to use the scripts or documentation. SELECT * FROM CustomPollerAssignment WHERE CustomPollerAssignmentID = 'assignmentid'
Note: Provide the value forassignmentidas recorded from theNPM.BusinessLayer.logfile. - Click Refresh.
- The results of the query provide the broken Universal Device Pollers. Record them for reference in the Universal Device Poller application.
- Right-click the Nodes table, and then click Query Table.
- Replace the existing query with the following query:
-- Scripts are not supported under any SolarWinds support program or service. -- Scripts are provided AS IS without warranty of any kind. SolarWinds further -- disclaims all warranties including, without limitation, any implied warranties -- of merchantability or of fitness for a particular purpose. The risk arising -- out of the use or performance of the scripts and documentation stays with you. -- In no event shall SolarWinds or anyone else involved in the creation, -- production, or delivery of the scripts be liable for any damages whatsoever -- (including, without limitation, damages for loss of business profits, business -- interruption, loss of business information, or other pecuniary loss) arising -- out of the use of or inability to use the scripts or documentation. SELECT * FROM Nodes WHERE NodeID = 'node'
Note: Provide the value fornodeas recorded from theNPM.BusinessLayer.logfile. - Click Refresh.
- The results of the query provide the nodes to which the broken Universal Device Pollers are assigned. Record them for reference in the Universal Device Poller application.
- Click Start > All Programs > SolarWinds Orion > Network Performance Monitor > Universal Device Poller.
- Edit or delete your broken Universal Device Pollers , as appropriate.
A Universal Device Poller defined on my Additional Polling Engine is not working
If you have defined a Universal Device Poller on an Additional Polling Engine but it does not seem to be polling any data, complete the following steps to diagnose and then address the issue:
- Confirm that your Universal Device poller (UnDP) functions correctly by moving both your UnDP and the node you want to poll with your UnDP to your primary polling engine, as follows:
- If the test is not successful, the OID you supplied when defining the UnDP is not recognized by the node you want to monitor. Consult the manufacturer of your monitored node or use SolarWinds SNMP Walk: A new tool for collecting SNMP MIB walks to determine the correct OID to use for your UnDP.
- If the test is successful, move the node back to your Additional Polling Engine, using the Poller Engine Load Balancer, and then restore your UnDP on the Additional Polling Engine.
- Test your UnDP on your primary polling engine.
- Create your desired UnDP on your primary polling engine.
- Reassign the node previously monitored with your Additional Polling Engine to your primary polling engine.
- Confirm that the Additional Polling Engine is receiving statistics from your monitored node. A few minutes after moving the monitored node back to the Additional Polling Engine, you should be able to click the node and open its Node Details view in the web console.
- If the Additional Polling Engine is not receiving statistics from your monitored node, confirm that port 161 is open in any relevant firewalls for both inbound and outbound UDP traffic between the Additional Polling Engine and the monitored node. For more information, see the SolarWinds Technical Reference, "Port Requirements for SolarWinds Products ".
- If the Additional Polling Engine is receiving statistics from your monitored node, but the UnDP still is not receiving statistics, confirm that port 17777 is open in any relevant firewalls for both inbound and outbound TCP traffic between the primary Orion server and the Additional Polling Engine. For more information, see the SolarWinds Technical Reference, "Port Requirements for SolarWinds Products".
- If the UnDP is still not receiving statistics from your monitored node, the credentials file used to connect the Additional Polling Engine to the Job Engine on your primary server may be corrupt. Complete the following procedure to fix a potentially corrupt Job Engine credentials file:
- Rename the existing Job Engine credentials file, ucdat1.xml, as ucdat1_OLD.xml.
Note: For Additional Polling Engines installed on Windows Server 2008, this file is located, by default, in C:\ProgramData\SolarWinds\JobEngine\. For Additional Polling Engines installed on Windows Server 2003, it is located, by default, in C:\Documents and Settings\All Users\Application Data\SolarWinds\JobEngine\. - Click Start > All Programs > SolarWinds Orion > Configuration and Auto-Discovery > Configuration Wizard.
- Complete the Configuration Wizard using your existing settings. This should reinstall the Job Engine credentials file.
- Rename the existing Job Engine credentials file, ucdat1.xml, as ucdat1_OLD.xml.
- If your UnDP is still not polling statistics from your monitored node, please submit a technical support ticket.
*******************************************************************************************************************
HOW to MERGE more than one UnDP Get Table Results and Display on NPM Web Console
Create 3 Custom Pollers, They are all GET TABLE for their OID.
Next Only add first one to Display to WEB Node Details Page.
You select this from UnDP App, right lick one of pollers and WEB DISPLAYand then check TABLE in NODE TABLES.
Then EDIT that Resource on WEB and you will see other pollers for that node unticked>
Then tell it to Merge with Other Custom UnDP Pollers as shown below.
End result on web is as follows:
Example create few undp get tables and – each need to have same child branch to make table.
In node tables MERGE each to 1 table view.
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.4.2.1.1.1 |
hrSWRunIndex.1 | 1 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.4.2.1.1.4 |
hrSWRunIndex.4 | 4 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.4.2.1.1.156 |
hrSWRunIndex.156 | 156 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.4.2.1.2.1 |
hrSWRunName.1 |
System Idle Process |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.4.2.1.2.4 |
hrSWRunName.4 |
System |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.4.2.1.2.156 |
hrSWRunName.156 |
VMwareTray.exe |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.5.1.1.1.1 |
hrSWRunPerfCPU.1 |
202268 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.5.1.1.1.4 |
hrSWRunPerfCPU.4 |
49634 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.5.1.1.1.156 |
hrSWRunPerfCPU.156 |
100 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.5.1.1.2.1 |
hrSWRunPerfMem.1 |
28 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.5.1.1.2.4 |
hrSWRunPerfMem.4 |
236 |
|
HOST-RESOURCES-MIB |
1.3.6.1.2.1.25.5.1.1.2.156 |
hrSWRunPerfMem.156 |
3148 |
*******************************************************************************************************************
How to setup UnDP Alerts:
To Setup UnDP Alerts, do as follows:
- If you Open System Manager-> Alerts-> Configure Advanced Alerts
- Set the Trigger Condition's "Type of property to Monitor" = ‘CUSTOM NODE POLLER’
- After adding a condition, you will now see Custom Node Poller variables to Trigger on, like OID, PollerName, Poller's Rate, etc...
Example:
Set ALERT TRIGGER AS
PollerName is equal to MyPollername
Status is equal to 2 (Custom Node Poller Status)
Set Trigger Action AS:
to Email or whatever Alert Action you prefer.
Here is some sample output. Best to return all Status, RawStatus,Rate Values to begin with, if Customer doesnt know which field is going to be populated depending PollerType.
Alert me when a CUSTOM POLLER ....
Node ${NodeName} is ${Status}.
Vendor: ${Vendor}
PollerID = ${CustomPollers.CustomPollerID}
ID = ${PollerID}
Descr =${CustomPollers.Description}
Total = ${CustomPollerStatus.Total}
Status = ${CustomPollerStatus.Status}
Rate = ${CustomPollerStatus.Rate}
RawStatus = ${CustomPollerStatus.RawStatus}
NumValue = ${CustomPollerStatus.Value} -> Returns 1 or 2 for example
Value = ${CustomPollerStatus.Value} -> Returns UP or Down or OK for example
Value = ${Value} -> Returns UP or Down or OK for example
If using New Alertingv3 then you need to use SWIS variables:
RawStatus: ${N=SwisEntity;M=RawStatus}
Status: ${N=SwisEntity;M=Status}
DateTime: ${N=SwisEntity;M=DateTime;F=DateTime}
DisplayName: ${N=SwisEntity;M=DisplayName}
Rate: ${N=SwisEntity;M=Rate}
RowID: ${N=SwisEntity;M=RowID}
RowLabel: ${N=SwisEntity;M=RowLabel}
ResponceTime: ${N=SwisEntity;M=RowStatus;F=ResponceTime}
Total: ${N=SwisEntity;M=Total}
RowStatus: ${N=SwisEntity;M=RowStatus;F=OriginalValue}
UnDP get Table Alerts - v10.3 and backwards: (Can only Alert on Get Table as a whole)
Above will work for a GET, GET NEXT SNMP Poll, but unfortunately you cannot fully alert on a UnDP Table as all rows returned are treated as one Value. This has already been Feature Requested to improve this situation and was fixed in v10.4.
So say you have OID 1.3.6.1.1.2.2.2.7, you poll this using a UnDP Poller named 'Test'
It's a GetTable that returns values. So say it has 5 records in that Table. 1,7,4,6,8
For example:
1.3.6.1.1.2.2.2.7.1 returns 1
1.3.6.1.1.2.2.2.7.2 returns 7
1.3.6.1.1.2.2.2.7.3 returns 4
1.3.6.1.1.2.2.2.7.4 returns 6
1.3.6.1.1.2.2.2.7.5 returns 8
And you setup Alert Type ‘Custom Node Poller’, for Custom Poller 'test' that will Trigger if Status is greater than 5,
it will Alert once, but wont read all 5 values returned separately, instead it reads as if all one field.
Alerts reads 1.3.6.1.1.2.2.2.7 as 1,7,4,6,8.
So Your Alert trigger could be Alert if over 5. As 3 records are over 5, Alert will trigger.
But only Once. Not 3 Separate Times. Cant split these up for a GET TABLE OID.
UnDP get Table Alerts - v10.4 Introduced New Feature: (Can now Alert on Get Table, Individually)
To Setup UnDP Alerts, do as follows:
- If you Open System Manager-> Alerts-> Configure Advanced Alerts
- Set the Trigger Condition's "Type of property to Monitor" = ‘CUSTOM NODE TABLE POLLER’
So for Example Above it would now Alert Trigger 3 Separate Times, not just once as used to in v10.3.
***********************************************************************************************************
Alert Variable Configuration for New Alerting:
Alert Variables:
An issue on an object you are monitoring occurred at: ${N=Alerting;M=AlertTriggerTime;F=DateTime}.
This message was brought to you by the alert named: ${N=Alerting;M=AlertName}
If using New Alertingv3 then you need to use SWIS variables:
- Node Name: ${NodeName}
- Node Name: ${NodeID}
- UnDPDisplayName: ${N=SwisEntity;M=DisplayName}
- DateTime: ${N=SwisEntity;M=DateTime;F=DateTime}
- Report Date and Time: ${N=SwisEntity;M=DateTime}
UNDP STATUS TABLE – ROWS:
- ResponceTime: ${N=SwisEntity;M=RowStatus;F=ResponceTime}
- RowID: ${N=SwisEntity;M=RowID}
- RowLabel: ${N=SwisEntity;M=RowLabel}
- RowStatus: ${N=SwisEntity;M=RowStatus;F=OriginalValue}
- RawStatus: ${N=SwisEntity;M=RawStatus}
- Status: ${N=SwisEntity;M=Status}
- Rate: ${N=SwisEntity;M=Rate}
- Total: ${N=SwisEntity;M=Total}
Poller Details:
- View full Undp Poller Detail: ${N=SwisEntity;M=CustomPollerAssignment.Node.DetailsUrl}
- View full Orion Node Detail: ${CustomNodePollerDetailsURL}
- Click here to acknowledge the alert: ${N=Alerting;M=AcknowledgeUrl}
- View full object details here: ${N=SwisEntity;M=DetailsUrl}.
- View full alert details here: ${N=Alerting;M=AlertDetailsUrl}
************************************************************************
Sample Variable Output
Alert Variables:
An issue on an object you are monitoring occurred at: Wednesday, September 30, 2015 9:59 AM.
This message was brought to you by the alert named: UNDP - CustomPollerStatusTable - ALERT
If using New Alertingv3 then you need to use SWIS variables:
Node Name: OrionServer
Node ID: 177
UnDPDisplayName: aVolumeSize1
DateTime: Monday, May 18, 2015 2:22 PM
Report Date and Time: 5/18/2015 2:22:26 PM
UNDP STATUS TABLE – ROWS:
ResponceTime: 1 milliseconds
RowID: 2
RowLabel: aVolumeSize1
RowStatus: 1
RawStatus: 7045721
Status: 7045721
Rate: 7045721
Total:
Poller Details:
- View full Undp Poller Detail: http://OrionServer:80/Orion/NetPerfMon/NodeDetails.aspx?NetObject=N:177
- View full alert details here: http://OrioServer:80/Orion/View.aspx?NetObject=AAT:136
- Click here to acknowledge the alert: http://OrionServer:80/Orion/Netperfmon/AckAlert.aspx?AlertDefID=1036
************************************************************************
How to define Custom SQL Variables in Alert Output (OldAlerting)
You can use this to Pull Data from any Table. I usually just write the Query from scratch. If you want you can explicitly tell it eg which Node, Interfaces, UnDP Poller to Pull from that Table or Depending on Record being read in Alert Trigger, you can pass the variable to it in Alert Action output.
Below are few examples that might show type of Queries that can be created.
Few Example SQL Statements.
-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.
Node ID 1 is Status ${SQL:Select SUBSTRING(StatusDescription,15,4) FROM NODES}, Name ${SQL:Select Caption from Nodes where NodeID = 1}
Node ID 2 is Status ${SQL:Select SUBSTRING(StatusDescription,15,4) FROM NODES}, Name ${SQL:Select Caption from Nodes where NodeID = 2}
Would Output:
- Node ID 1 is Down, Name Tok-2621 - x.x.2.1
- Node ID 2 is Down, Name Core-3750
Passing Variables:
Can only pass Variables that have been read from Alert trigger.
So important to know what it is using Type of Property to Monitor = "Node"
-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.
${SQL:Select ResponseTime from Nodes where NodeID = ${NodeID}}
Passing Info on UnDP Pollers into a Basic Node Alerts.
Often see customers wanted to output current Status of a Nodes assigned UnDP Current Status
Here is good example on how this can be done:
Created UnDP Poller - sysName = 1.3.6.1.2.1.1.5
-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.
System name: ${SQL:Select Rate From CustomPollerAssignment as Assignment, CustomPollerStatus as Status, CustomPollers
where Assignment.PollerID = CustomPollers.PollerID and
Assignment.CustomPollerAssignmentID = Status.CustomPollerAssignmentID and
Assignment.NodeID = ${NodeID} and
Assignment.AssignmentName like 'sysName%'}
Note: Be sure to remove any the line shifts in the query.
************************************************************************
How to define Custom SQL Variables in Alert Output (NewAlerting)
SQL Adv Query
-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.
Select ResponseTime from Nodes where NodeID = ${NodeID}
-- hrStorageDescr (Hardcoding a variable):
${SQL:
Select CPStatus.Status as Output1
From CustomPollerAssignment as CPAssignment, CustomPollerStatus as CPStatus, CustomPollers as CPs where
CPAssignment.PollerID = CPs.PollerID and
CPAssignment.CustomPollerAssignmentID = CPStatus.CustomPollerAssignmentID and
CPAssignment.NodeID = 177 and CPStatus.RowID = 1 and
CPs.UniqueName like '%hrStorageDescr%'
}
-- hrStorageDescr (Passing a Variable):
${SQL:
Select CPStatus.Status as Output1
From CustomPollerAssignment as CPAssignment, CustomPollerStatus as CPStatus, CustomPollers as CPs where
CPAssignment.PollerID = CPs.PollerID and
CPAssignment.CustomPollerAssignmentID = CPStatus.CustomPollerAssignmentID and
CPAssignment.NodeID = ${N=SwisEntity;M=CustomPollerAssignment.Node.NodeID} and
CPStatus.RowID = '${N=SwisEntity;M=RowID}'
CPS.UniqueName like '%hrStorageDescr%'
}
-- hrStorageDescr (Passing a Variable) (Replacing Status with LABEL):
${SQL:
Select CPLabels .Label as Output1
From CustomPollerAssignment as CPAssignment, CustomPollerStatus as CPStatus, CustomPollers as CPs, CustomPollerLabels as CPLabels where
CPAssignment.PollerID = CPs.PollerID and
CPAssignment.CustomPollerAssignmentID = CPStatus.CustomPollerAssignmentID and
CPStatus.CustomPollerAssignmentID = CPLabels .CustomPollerAssignmentID and
CPStatus.RowID = CPLabels .RowID and
CPAssignment.NodeID = ${N=SwisEntity;M=CustomPollerAssignment.Node.NodeID} and
CPStatus.RowID = '${N=SwisEntity;M=RowID}'
CPS.UniqueName like '%hrStorageDescr%'
}
Customer Example:
Alert Where Status =1, but show other 4 UnDP Table lines fromt he same ROWID
(Screenshots property of © 2021 Microsoft Corporation. All rights reserved.)
************************************************************************
How to drill down into a particular UnDP Custom Poller using SQL
NPM 12.2 or higher has stored SQL view:
- The View merges 3 UnDP tables together, you can use SQL below or check for these in diagnostics.
-- Scripts are not supported under any SolarWinds support program or service. -- Scripts are provided AS IS without warranty of any kind. SolarWinds further -- disclaims all warranties including, without limitation, any implied warranties -- of merchantability or of fitness for a particular purpose. The risk arising -- out of the use or performance of the scripts and documentation stays with you. -- In no event shall SolarWinds or anyone else involved in the creation, -- production, or delivery of the scripts be liable for any damages whatsoever -- (including, without limitation, damages for loss of business profits, business -- interruption, loss of business information, or other pecuniary loss) arising -- out of the use of or inability to use the scripts or documentation. SELECT TOP 1000 * FROM [dbo].[CustomPollerStatusTable]
These 3 SQL queries can be useful for troubleshooting Polled values and/or UnDP Alerts.
First Level find UNDP you need to drill down into
-- Scripts are not supported under any SolarWinds support program or service. -- Scripts are provided AS IS without warranty of any kind. SolarWinds further -- disclaims all warranties including, without limitation, any implied warranties -- of merchantability or of fitness for a particular purpose. The risk arising -- out of the use or performance of the scripts and documentation stays with you. -- In no event shall SolarWinds or anyone else involved in the creation, -- production, or delivery of the scripts be liable for any damages whatsoever -- (including, without limitation, damages for loss of business profits, business -- interruption, loss of business information, or other pecuniary loss) arising -- out of the use of or inability to use the scripts or documentation. Select Top 1000 * From CustomPollers order by enabled, groupname
Second Level use CustomPollerID to drill down into its assignments
-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.
Select Top 1000 *
From CustomPollerAssignment
where custompollerid = '{ed6182f1-878a-4fbf-a9e0-d7167e90793e}'
Example Below only has 1 Node assigned, but if mass Assigned you see multiple records by Node.
Third Level use CustomPollerAssignmentID to drill down into last polled values
-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.
Select Top 1000 *
From CustomPollerStatus
where custompollerassignmentid <> '{6c253517-24d6-41e1-9a06-de788d9806ce}'
Once you know what is polled back, you can setup Alerts as needed to these columns.
********************************************************************
Here is a SQL Query that will pull back all in 1 go, by just knowing CustomPoller Name.
Could also be used in Alerts Variables, where exporting UNDP Value on a simple Node Alert.
SELECT Top 100
-- Scripts are not supported under any SolarWinds support program or service. -- Scripts are provided AS IS without warranty of any kind. SolarWinds further -- disclaims all warranties including, without limitation, any implied warranties -- of merchantability or of fitness for a particular purpose. The risk arising -- out of the use or performance of the scripts and documentation stays with you. -- In no event shall SolarWinds or anyone else involved in the creation, -- production, or delivery of the scripts be liable for any damages whatsoever -- (including, without limitation, damages for loss of business profits, business -- interruption, loss of business information, or other pecuniary loss) arising -- out of the use of or inability to use the scripts or documentation. Nodes.Caption AS NodeName, Nodes.NodeID As NodeID, Nodes.Vendor AS Vendor, Nodes.IP_Address AS IP_Address, CustomNodePollers_CustomPollers.UniqueName AS Poller_Name, CustomNodePollerStatus_CustomPollerStatus.Total AS Total, CustomNodePollerStatus_CustomPollerStatus.Status AS Status, CustomNodePollerStatus_CustomPollerStatus.Rate AS Rate, CustomNodePollerStatus_CustomPollerStatus.RawStatus AS RawStatus, CustomNodePollerStatus_CustomPollerStatus.RowID AS RowID, CustomNodePollerStatus_CustomPollerStatus.RowStatus AS RowStatus, CustomNodePollerStatus_CustomPollerStatus.DateTime FROM ( Nodes INNER JOIN CustomPollerAssignment CustomNodePollerAssignment_CustomPollerAssignment ON (Nodes.NodeID = CustomNodePollerAssignment_CustomPollerAssignment.NodeID) INNER JOIN CustomPollerStatus CustomNodePollerStatus_CustomPollerStatus ON (CustomNodePollerAssignment_CustomPollerAssignment.CustomPollerAssignmentID = CustomNodePollerStatus_CustomPollerStatus.CustomPollerAssignmentID) INNER JOIN CustomPollers CustomNodePollers_CustomPollers ON (CustomNodePollerAssignment_CustomPollerAssignment.CustomPollerID = CustomNodePollers_CustomPollers.CustomPollerID) ) WHERE ( (CustomNodePollers_CustomPollers.UniqueName = 'hrSWRunName') OR (CustomNodePollers_CustomPollers.UniqueName = 'hrSWRunPerfCPU') ) AND (Nodes.NodeID = 131)
********************************************************************
Here is how you can get ENUM TextValue via multiple Joins.
SELECT Top 100
-- Scripts are not supported under any SolarWinds support program or service. -- Scripts are provided AS IS without warranty of any kind. SolarWinds further -- disclaims all warranties including, without limitation, any implied warranties -- of merchantability or of fitness for a particular purpose. The risk arising -- out of the use or performance of the scripts and documentation stays with you. -- In no event shall SolarWinds or anyone else involved in the creation, -- production, or delivery of the scripts be liable for any damages whatsoever -- (including, without limitation, damages for loss of business profits, business -- interruption, loss of business information, or other pecuniary loss) arising -- out of the use of or inability to use the scripts or documentation. Nodes.Caption AS NodeName, Nodes.NodeID As NodeID, Nodes.Vendor AS Vendor, Nodes.IP_Address AS IP_Address, CustomPollers.UniqueName AS Poller_Name, CustomPollerStatus.Status AS CPS_Status, CustomPollerEnums.TextValue AS CPE_Status, CustomPollerStatus.DateTime FROM ( (Nodes INNER JOIN CustomPollerAssignment ON (Nodes.NodeID = CustomPollerAssignment.NodeID)) INNER JOIN CustomPollerStatus CustomPollerStatus ON (CustomPollerAssignment.CustomPollerAssignmentID = CustomPollerStatus.CustomPollerAssignmentID)) INNER JOIN CustomPollers CustomPollers ON (CustomPollerAssignment.CustomPollerID = CustomPollers.CustomPollerID) INNER JOIN CustomPollerEnums ON (CustomPollerEnums.CustomPollerID = CustomPollerAssignment.CustomPollerID) WHERE ( (CustomPollers.UniqueName = 'ASAactive') AND (Nodes.NodeID = 712) )
*******************************************************************************************************************
UnDP Labels:
-
- WHEN 'SameTable' THEN CustomPollerLabels.LabelWHEN 'Generic' THEN CustomPollers.LabelDetail + CustomPollerStatus.RowIDWHEN 'Interface' THEN ISNULL(Interfaces.Caption, N'Unknown')
When you create new custom table poller you can select one of these label types:
- Custom Label: as label is used <custom text> + <polled RowID>
- Interface name: as label is used <interface captiont> where InterfaceIndex = <polled RowID>. In case such interface does not exists "UNKNOWN" is used
- Value polled from the same table: as label is used value polled from the selected column
ALERTLOG Errors:
DBNULL to type string not found
(Screenshots property of © 2021 Microsoft Corporation. All rights reserved.)
Resolution:
Fixed by Manually Editing 2 Labels in CustomPollers TABLE.
Or when creating UnDp, USE CUSTOM LABEL And fill it in.
************************************************************************
Custom Pollers
|
CustomPollerID
|
UniqueName |
MIB |
SNMPGetType |
NetObjectPrefix |
PollerType |
Format |
Enabled |
ColumnNumber |
LabelType |
LabelDetail |
PollerID |
|
a98da0df-f6a1-463f-ac53-3032bc96aeb7 |
State |
S5-CHASSIS-MIB:s5ChasComOperState |
GetSubTree |
N |
S |
TRUE |
0 |
SameTable |
1.3.6.1.4.1.45.1.6.3.3.1.1.10 |
a98da0df-f6a1-463f-ac53-3032bc96aeb7 | |
|
4b9fe3f2-12ca-4cf0-8ee9-93fa6b1abc87 |
Temp_Status |
CPQHLTH-MIB:cpqHeTemperatureCondition |
GetSubTree |
N |
S |
Enumeration |
TRUE |
0 |
Interface |
4b9fe3f2-12ca-4cf0-8ee9-93fa6b1abc8 |
Example 1: - "Temp_Status"
You have a custom table poller "Temp_Status" with "Interfaces" as LabelType.
select * from custompollers where custompollerid='4b9fe3f2-12ca-4cf0-8ee9-93fa6b1abc87'
This poller is assigned also to NodeId = 22850.
select * from custompollerassignment where custompollerid='4b9fe3f2-12ca-4cf0-8ee9-93fa6b1abc87'
Polled RowIds are 0.1,0.2,0.3,0.4,0.5,0.6,0.7
select * from custompollerstatus where custompollerassignmentid='464c67b2-127e-423a-b65b-119234944df7'
So we are looking for Interfaces.Caption where NodeId=22850 and InterfaceIndex=<RowId>
Such interface does not exist, as a result we get "UNKNOWN"
select * from alertstatus where activeobject like '464C67B2-127E-423A-B65B-119234944DF7%'
Example 2: "State"
You have a custom table poller "State" with "SameTable" as LabelType.
As label is used the same OID as form poller itself (1.3.6.1.4.1.45.1.6.3.3.1.1.10).
select * from custompollers where custompollerid='a98da0df-f6a1-463f-ac53-3032bc96aeb7'
This poller is also assigned to NodeId = 682.
select * from custompollerassignment where custompollerid='a98da0df-f6a1-463f-ac53-3032bc96aeb7'
Polled Labels are integer values.
select * from custompollerlabels where custompollerassignmentid='a346def7-4306-4d42-8272-e1b26c17a6da'
So AlertStatus.ObjectName= <integer value> + 'on'+ <Nodes.Caption>
select * from alertstatus where activeobject like 'A346DEF7-4306-4D42-8272-E1B26C17A6DA%'
So it works as designed.
To fix this you should change his custom table pollers labels to get the values he woudl like to see as ObjectNames.
Online Admin Guide UnDP:
UnDP Videos: