Hi,
I'm trying to create a dynamic REST template for monitoring aspects of PowerDNS recursor. One of the metrics counts how long each thread has spent on queries - as threads are dynamic and vary depending on the machine I thought I'd try to build a placeholder but I think either the format of the PowerDNS API is foiling me or PRTG.
These are the entries I'm trying to monitor with the template:
[
{
"name": "cpu-msec-thread-0",
"type": "StatisticItem",
"value": "88195007"
},
{
"name": "cpu-msec-thread-1",
"type": "StatisticItem",
"value": "23439221"
},
{
"name": "cpu-msec-thread-10",
"type": "StatisticItem",
"value": "26430890"
},
{
"name": "cpu-msec-thread-11",
"type": "StatisticItem",
"value": "24616980"
},
{
"name": "cpu-msec-thread-12",
"type": "StatisticItem",
"value": "25795722"
},
{
"name": "cpu-msec-thread-2",
"type": "StatisticItem",
"value": "25027948"
},
{
"name": "cpu-msec-thread-3",
"type": "StatisticItem",
"value": "25910209"
},
{
"name": "cpu-msec-thread-4",
"type": "StatisticItem",
"value": "25116874"
},
{
"name": "cpu-msec-thread-5",
"type": "StatisticItem",
"value": "24945352"
},
{
"name": "cpu-msec-thread-6",
"type": "StatisticItem",
"value": "25538823"
},
{
"name": "cpu-msec-thread-7",
"type": "StatisticItem",
"value": "25172107"
},
{
"name": "cpu-msec-thread-8",
"type": "StatisticItem",
"value": "25194866"
},
{
"name": "cpu-msec-thread-9",
"type": "StatisticItem",
"value": "23597720"
},
{
"name": "fd-usage",
"type": "StatisticItem",
"value": "114"
},
{
"name": "malloc-bytes",
"type": "StatisticItem",
"value": "0"
},
{
"name": "real-memory-usage",
"type": "StatisticItem",
"value": "1257447424"
},
{
"name": "security-status",
"type": "StatisticItem",
"value": "1"
},
{
"name": "sys-msec",
"type": "StatisticItem",
"value": "193078605"
},
{
"name": "uptime",
"type": "StatisticItem",
"value": "2455604"
},
{
"name": "user-msec",
"type": "StatisticItem",
"value": "196111840"
}
]
I'm trying to get PRTG to work out how many "cpu-msec-thread-n" gauges to create.
The current version of the template looks like this:
{
"prtg": {
"description" : {
"device": "PowerDNS Recursor (System)",
"query": ":8082/api/v1/servers/localhost/statistics",
"comment": "PowerDNS Recursor system stats"
},
"result": [
{
"channel": "Recursor CPU thread Time",
"Unit": "Custom",
"CustomUnit": "ms",
"Mode": "Difference",
"value": {$["cpu-msec-thread-"][#0]}
},
{
"channel": "Recursor CPU system Time",
"Unit": "Custom",
"CustomUnit": "ms",
"Mode": "Difference",
"value": $["sys-msec"]
},
{
"channel": "Recursor CPU user Time",
"Unit": "Custom",
"CustomUnit": "ms",
"Mode": "Difference",
"value": $["user-msec"]
},
{
"channel": "Recursor Memory Usage",
"VolumeSize": "KiloByte",
"value": $["real-memory-usage"]
},
{
"channel": "Recursor File Descriptors",
"Unit": "Count",
"value": $["fd-usage"]
},
{
"channel": "Recursor Software Update Status",
"ValueLookup": "cleminan.pccw.powerdns.security.status",
"ShowChart": "0",
"ShowTable": "1",
"value": $["security-status"]
},
{
"channel": "Recursor Process Uptime",
"Unit": "TimeSeconds",
"value": $.uptime
}
]
}
}
I've had a play around with the format of the query string both:
"value": {$["cpu-msec-thread-"][#0]}
and
"value": {$["cpu-msec-thread-"[#0]]}
But with PRTG's handling of hyphens requiring a combination of punctuation it muddies the examples given.
https://www.paessler.com/manuals/prtg/rest_custom_sensor#jsonpath_expressions
Any help would be gratefully received.
Many thanks a.
Article Comments
Thanks for the response, however I think I may have larger problems.
I suspect PRTG is expecting:
"label": "value"
But PowerDNS recursor stats are all in the form:
{
"name": "cpu-msec-thread-0",
"type": "StatisticItem",
"value": "88195007"
},
The dnsdist load balancer has a JSON API for stats in the former format, but neither the PowerDNS Recursor or Authoritative servers utilise it.
Jan, 2020 - Permalink
The format is perfectly fine from what I can tell, but the name is somewhat difficult to get correctly. Did you have any success with the string I provided?
Jan, 2020 - Permalink
Unfortunately, - (dashes) within the selector will always cause the Sensor to think it's a mathematic equation, rather than a selector. Could you try $.*["cpu-msec-thread"][*][0] ? Not sure if that'll work though. Rule of thumb is to put the selector containing the dashes into [" and "].
Jan, 2020 - Permalink