Add influxdb plugin
This was primarily intended to consume InfluxDB-style expvars,
particularly InfluxDB's `/debug/vars` endpoint.
That endpoint follows a structure like
```json
{
"httpd::8086": {
"name": "httpd",
"tags": {
"bind": ":8086"
},
"values": {
"pointsWrittenOK": 33756,
"queryReq": 19,
"queryRespBytes": 26973,
"req": 428,
"writeReq": 205,
"writeReqBytes": 3939161
}
}
}
```
There are an arbitrary number of top-level keys in the JSON response at
the configured URLs, and this plugin will iterate through all of their
values looking for objects with keys "name", "tags", and "values"
indicating a metric to be consumed by telegraf.
Running this on current master of InfluxDB, I am able to record nearly
the same information that is normally stored in the `_internal`
database; the only measurement missing from `_internal` is `runtime`,
which is present under the "memstats" key but does not follow the format
and so is not consumed in this plugin.
```
$ influx -database=telegraf -execute 'SHOW FIELD KEYS FROM /influxdb/'
name: influxdb_influxdb_engine
----------------------------
fieldKey
blksWrite
blksWriteBytes
blksWriteBytesC
pointsWrite
pointsWriteDedupe
name: influxdb_influxdb_httpd
---------------------------
fieldKey
pingReq
pointsWrittenOK
queryReq
queryRespBytes
req
writeReq
writeReqBytes
name: influxdb_influxdb_shard
---------------------------
fieldKey
fieldsCreate
seriesCreate
writePointsOk
writeReq
name: influxdb_influxdb_subscriber
--------------------------------
fieldKey
pointsWritten
name: influxdb_influxdb_wal
-------------------------
fieldKey
autoFlush
flushDuration
idleFlush
memSize
metaFlush
pointsFlush
pointsWrite
pointsWriteReq
seriesFlush
name: influxdb_influxdb_write
---------------------------
fieldKey
pointReq
pointReqLocal
req
subWriteOk
writeOk
```
2015-12-05 22:15:58 +00:00
|
|
|
package influxdb_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
|
2016-01-20 18:57:35 +00:00
|
|
|
"github.com/influxdata/telegraf/plugins/inputs/influxdb"
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
Add influxdb plugin
This was primarily intended to consume InfluxDB-style expvars,
particularly InfluxDB's `/debug/vars` endpoint.
That endpoint follows a structure like
```json
{
"httpd::8086": {
"name": "httpd",
"tags": {
"bind": ":8086"
},
"values": {
"pointsWrittenOK": 33756,
"queryReq": 19,
"queryRespBytes": 26973,
"req": 428,
"writeReq": 205,
"writeReqBytes": 3939161
}
}
}
```
There are an arbitrary number of top-level keys in the JSON response at
the configured URLs, and this plugin will iterate through all of their
values looking for objects with keys "name", "tags", and "values"
indicating a metric to be consumed by telegraf.
Running this on current master of InfluxDB, I am able to record nearly
the same information that is normally stored in the `_internal`
database; the only measurement missing from `_internal` is `runtime`,
which is present under the "memstats" key but does not follow the format
and so is not consumed in this plugin.
```
$ influx -database=telegraf -execute 'SHOW FIELD KEYS FROM /influxdb/'
name: influxdb_influxdb_engine
----------------------------
fieldKey
blksWrite
blksWriteBytes
blksWriteBytesC
pointsWrite
pointsWriteDedupe
name: influxdb_influxdb_httpd
---------------------------
fieldKey
pingReq
pointsWrittenOK
queryReq
queryRespBytes
req
writeReq
writeReqBytes
name: influxdb_influxdb_shard
---------------------------
fieldKey
fieldsCreate
seriesCreate
writePointsOk
writeReq
name: influxdb_influxdb_subscriber
--------------------------------
fieldKey
pointsWritten
name: influxdb_influxdb_wal
-------------------------
fieldKey
autoFlush
flushDuration
idleFlush
memSize
metaFlush
pointsFlush
pointsWrite
pointsWriteReq
seriesFlush
name: influxdb_influxdb_write
---------------------------
fieldKey
pointReq
pointReqLocal
req
subWriteOk
writeOk
```
2015-12-05 22:15:58 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestBasic(t *testing.T) {
|
|
|
|
js := `
|
|
|
|
{
|
|
|
|
"_1": {
|
|
|
|
"name": "foo",
|
|
|
|
"tags": {
|
|
|
|
"id": "ex1"
|
|
|
|
},
|
|
|
|
"values": {
|
|
|
|
"i": -1,
|
|
|
|
"f": 0.5,
|
|
|
|
"b": true,
|
|
|
|
"s": "string"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"ignored": {
|
|
|
|
"willBeRecorded": false
|
|
|
|
},
|
|
|
|
"ignoredAndNested": {
|
|
|
|
"hash": {
|
|
|
|
"is": "nested"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"array": [
|
|
|
|
"makes parsing more difficult than necessary"
|
|
|
|
],
|
|
|
|
"string": "makes parsing more difficult than necessary",
|
|
|
|
"_2": {
|
|
|
|
"name": "bar",
|
|
|
|
"tags": {
|
|
|
|
"id": "ex2"
|
|
|
|
},
|
|
|
|
"values": {
|
|
|
|
"x": "x"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"pointWithoutFields_willNotBeIncluded": {
|
|
|
|
"name": "asdf",
|
|
|
|
"tags": {
|
|
|
|
"id": "ex3"
|
|
|
|
},
|
|
|
|
"values": {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
if r.URL.Path == "/endpoint" {
|
|
|
|
_, _ = w.Write([]byte(js))
|
|
|
|
} else {
|
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
|
|
}
|
|
|
|
}))
|
|
|
|
defer fakeServer.Close()
|
|
|
|
|
|
|
|
plugin := &influxdb.InfluxDB{
|
|
|
|
URLs: []string{fakeServer.URL + "/endpoint"},
|
|
|
|
}
|
|
|
|
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
require.NoError(t, plugin.Gather(&acc))
|
|
|
|
|
2016-01-27 23:15:14 +00:00
|
|
|
require.Len(t, acc.Metrics, 2)
|
2016-01-07 08:11:52 +00:00
|
|
|
fields := map[string]interface{}{
|
|
|
|
// JSON will truncate floats to integer representations.
|
|
|
|
// Since there's no distinction in JSON, we can't assume it's an int.
|
|
|
|
"i": -1.0,
|
|
|
|
"f": 0.5,
|
|
|
|
"b": true,
|
|
|
|
"s": "string",
|
|
|
|
}
|
|
|
|
tags := map[string]string{
|
|
|
|
"id": "ex1",
|
|
|
|
"url": fakeServer.URL + "/endpoint",
|
|
|
|
}
|
2016-01-22 18:54:12 +00:00
|
|
|
acc.AssertContainsTaggedFields(t, "influxdb_foo", fields, tags)
|
2016-01-07 08:11:52 +00:00
|
|
|
|
|
|
|
fields = map[string]interface{}{
|
|
|
|
"x": "x",
|
|
|
|
}
|
|
|
|
tags = map[string]string{
|
|
|
|
"id": "ex2",
|
|
|
|
"url": fakeServer.URL + "/endpoint",
|
|
|
|
}
|
2016-01-22 18:54:12 +00:00
|
|
|
acc.AssertContainsTaggedFields(t, "influxdb_bar", fields, tags)
|
Add influxdb plugin
This was primarily intended to consume InfluxDB-style expvars,
particularly InfluxDB's `/debug/vars` endpoint.
That endpoint follows a structure like
```json
{
"httpd::8086": {
"name": "httpd",
"tags": {
"bind": ":8086"
},
"values": {
"pointsWrittenOK": 33756,
"queryReq": 19,
"queryRespBytes": 26973,
"req": 428,
"writeReq": 205,
"writeReqBytes": 3939161
}
}
}
```
There are an arbitrary number of top-level keys in the JSON response at
the configured URLs, and this plugin will iterate through all of their
values looking for objects with keys "name", "tags", and "values"
indicating a metric to be consumed by telegraf.
Running this on current master of InfluxDB, I am able to record nearly
the same information that is normally stored in the `_internal`
database; the only measurement missing from `_internal` is `runtime`,
which is present under the "memstats" key but does not follow the format
and so is not consumed in this plugin.
```
$ influx -database=telegraf -execute 'SHOW FIELD KEYS FROM /influxdb/'
name: influxdb_influxdb_engine
----------------------------
fieldKey
blksWrite
blksWriteBytes
blksWriteBytesC
pointsWrite
pointsWriteDedupe
name: influxdb_influxdb_httpd
---------------------------
fieldKey
pingReq
pointsWrittenOK
queryReq
queryRespBytes
req
writeReq
writeReqBytes
name: influxdb_influxdb_shard
---------------------------
fieldKey
fieldsCreate
seriesCreate
writePointsOk
writeReq
name: influxdb_influxdb_subscriber
--------------------------------
fieldKey
pointsWritten
name: influxdb_influxdb_wal
-------------------------
fieldKey
autoFlush
flushDuration
idleFlush
memSize
metaFlush
pointsFlush
pointsWrite
pointsWriteReq
seriesFlush
name: influxdb_influxdb_write
---------------------------
fieldKey
pointReq
pointReqLocal
req
subWriteOk
writeOk
```
2015-12-05 22:15:58 +00:00
|
|
|
}
|