[collectd] curl_json configuration question (hierarchy)
Dudlo
collectd at mozog.com
Fri Dec 4 19:34:15 CET 2015
I am using the most recent curl_json plugin for collectd. It works but I'd
like to configure it to generate more 'hierarchical' data.
I have a server that returns some performance date in this (pseudo-code)
JSON:
{
"serverA": {
"service1": {
"requests":"17",
"successes":"15",
"failures":"2",
... and 7 other values ...
}
"service2": {
"requests":"28",
... and 9 other values ...
}
...
"service20" {
...
}
}
}
My collectd.conf looks like:
LoadPlugin curl_json
<Plugin curl_json>
<URL "http://myserver/serviceMetrics">
Instance "serviceMetrics"
<Key "*/*/requests">
Type "gauge"
</Key>
<Key "*/*/successes">
Type "gauge"
</Key>
... and some 8 other specs
</URL>
</Plugin>
When pushed to Graphite, this generates a "flat" list of 200 values (20
services, 10 values per service). The graphite/whisper data structure
looks like:
Metrics
\---collectd
\---serverA
\---curl_json-serviceMetrics
gauge-serverA-service1-requests
gauge-serverA-service1-successes
... other 8 for service1
gauge-serverA-service2-requests
... other 9 for service2
... and on for service3 - service10
This is nice for a first pass and would work but it is hard to manage to
choose from 200+ items on the flat list when graphing.
I would really like a deeper hierarchy sliced by the service:
Metrics
\---collectd
\---serverA
\---curl_json-serviceMetrics
+---service1
| gauge-serverA-service1-requests
| gauge-serverA-service1-successes
| ... other 8 for service1
+---service2
| gauge-serverA-service2-requests
| ... other 9 for service2
... and on for service3 - service10
I do not know how to achieve it. I see:
*** Option 1 - doable but unpractical. Change the collectd.conf to:
<Plugin curl_json>
<URL "http://myserver/serviceMetrics">
Instance "serviceMetrics-service1"
<Key "*/service1/requests">
Type "gauge"
</Key>
<Key "*/service1/successes">
Type "gauge"
</Key>
... and some 8 other specs
</URL>
<URL "http://myserver/serviceMetrics">
Instance "serviceMetrics-service2"
<Key "*/service2/requests">
Type "gauge"
</Key>
<Key "*/service2/successes">
Type "gauge"
</Key>
... and some 8 other specs
</URL>
... and 8 more sections for service3 - service10
</Plugin>
There are two issues:
1. The services are dynamic. There may be 5 or 25 of them and there are no
name patterns in there (unlike the pseud-code in my example here). So I
would have to update collectd.conf with every service
addition/deletion/name change.
2. It is expensive - I'd have to redundantly call the serviceMetrics web
service 20 times (for each service), every time reading only one service
section.
*** Option 2 - impossible with curl_json plugin.
Ideally, I'd like to "force" the hierarchy on the value using the Instance
clause inside the <Key>, something like:
<Plugin curl_json>
<URL "http://myserver/serviceMetrics">
Instance "serviceMetrics"
<Key "*/*/requests">
Type "gauge"
Instance "*/requests"
</Key>
<Key "*/*/successes">
Type "gauge"
Instance "*/successes"
</Key>
... and some 8 other specs
</URL>
</Plugin>
The 'Instance "*/requests" ' clause does not work. It simply sets the
name to the literal string (replacing special characters with
underscores). In a way, I would like to use the concept of "capturing
group" as in regex replacement. Sadly, curl_json is not ready for it.
I even tried changing the web service definition to use multi-value type,
as in load type (in types.db, load type is defined as
"shortterm:GAUGE:0:5000, midterm:GAUGE:0:5000, longterm:GAUGE:0:5000").
Again, curl_json is not ready for such data structure - it expects a
single numeric value.
Is there a way I could coerce curl_json into generating values in a
hierarchy?
Thank you,
dudlo
More information about the collectd
mailing list