Couchbase input plugin
This commit is contained in:
parent
0682a95c48
commit
bf703d39ab
3
Godeps
3
Godeps
|
@ -5,6 +5,9 @@ github.com/amir/raidman 53c1b967405155bfc8758557863bf2e14f814687
|
||||||
github.com/aws/aws-sdk-go 13a12060f716145019378a10e2806c174356b857
|
github.com/aws/aws-sdk-go 13a12060f716145019378a10e2806c174356b857
|
||||||
github.com/beorn7/perks 3ac7bf7a47d159a033b107610db8a1b6575507a4
|
github.com/beorn7/perks 3ac7bf7a47d159a033b107610db8a1b6575507a4
|
||||||
github.com/cenkalti/backoff 4dc77674aceaabba2c7e3da25d4c823edfb73f99
|
github.com/cenkalti/backoff 4dc77674aceaabba2c7e3da25d4c823edfb73f99
|
||||||
|
github.com/couchbase/go-couchbase cb664315a324d87d19c879d9cc67fda6be8c2ac1
|
||||||
|
github.com/couchbase/gomemcached a5ea6356f648fec6ab89add00edd09151455b4b2
|
||||||
|
github.com/couchbase/goutils 5823a0cbaaa9008406021dc5daf80125ea30bba6
|
||||||
github.com/dancannon/gorethink e7cac92ea2bc52638791a021f212145acfedb1fc
|
github.com/dancannon/gorethink e7cac92ea2bc52638791a021f212145acfedb1fc
|
||||||
github.com/davecgh/go-spew 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d
|
github.com/davecgh/go-spew 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d
|
||||||
github.com/eapache/go-resiliency b86b1ec0dd4209a588dc1285cdd471e73525c0b3
|
github.com/eapache/go-resiliency b86b1ec0dd4209a588dc1285cdd471e73525c0b3
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/aerospike"
|
_ "github.com/influxdata/telegraf/plugins/inputs/aerospike"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/apache"
|
_ "github.com/influxdata/telegraf/plugins/inputs/apache"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/bcache"
|
_ "github.com/influxdata/telegraf/plugins/inputs/bcache"
|
||||||
|
_ "github.com/influxdata/telegraf/plugins/inputs/couchbase"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/couchdb"
|
_ "github.com/influxdata/telegraf/plugins/inputs/couchdb"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/disque"
|
_ "github.com/influxdata/telegraf/plugins/inputs/disque"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/dns_query"
|
_ "github.com/influxdata/telegraf/plugins/inputs/dns_query"
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
# Telegraf Plugin: Couchbase
|
||||||
|
|
||||||
|
### Configuration:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Read per-node and per-bucket metrics from Couchbase
|
||||||
|
[[inputs.couchbase]]
|
||||||
|
## specify servers via a url matching:
|
||||||
|
## [protocol://][:password]@address[:port]
|
||||||
|
## e.g.
|
||||||
|
## http://couchbase-0.example.com/
|
||||||
|
## http://admin:secret@couchbase-0.example.com:8091/
|
||||||
|
##
|
||||||
|
## If no servers are specified, then localhost is used as the host.
|
||||||
|
## If no protocol is specifed, HTTP is used.
|
||||||
|
## If no port is specified, 8091 is used.
|
||||||
|
servers = ["http://localhost:8091"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Measurements:
|
||||||
|
|
||||||
|
### Per-node measurements
|
||||||
|
|
||||||
|
Meta:
|
||||||
|
- units: bytes
|
||||||
|
- tags: `cluster`, `hostname`
|
||||||
|
|
||||||
|
Measurement names:
|
||||||
|
- memory_free
|
||||||
|
- memory_total
|
||||||
|
|
||||||
|
### Per-bucket measurements
|
||||||
|
|
||||||
|
Meta:
|
||||||
|
- units: varies
|
||||||
|
- tags: `cluster`, `bucket`
|
||||||
|
|
||||||
|
Measurement names:
|
||||||
|
- quotaPercentUsed (unit: percent)
|
||||||
|
- opsPerSec (unit: count)
|
||||||
|
- diskFetches (unit: count)
|
||||||
|
- itemCount (unit: count)
|
||||||
|
- diskUsed (unit: bytes)
|
||||||
|
- dataUsed (unit: bytes)
|
||||||
|
- memUsed (unit: bytes)
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
package couchbase
|
||||||
|
|
||||||
|
import (
|
||||||
|
couchbase "github.com/couchbase/go-couchbase"
|
||||||
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Couchbase struct {
|
||||||
|
Servers []string
|
||||||
|
}
|
||||||
|
|
||||||
|
var sampleConfig = `
|
||||||
|
## specify servers via a url matching:
|
||||||
|
## [protocol://][:password]@address[:port]
|
||||||
|
## e.g.
|
||||||
|
## http://couchbase-0.example.com/
|
||||||
|
## http://admin:secret@couchbase-0.example.com:8091/
|
||||||
|
##
|
||||||
|
## If no servers are specified, then localhost is used as the host.
|
||||||
|
## If no protocol is specifed, HTTP is used.
|
||||||
|
## If no port is specified, 8091 is used.
|
||||||
|
servers = ["http://localhost:8091"]
|
||||||
|
`
|
||||||
|
|
||||||
|
func (r *Couchbase) SampleConfig() string {
|
||||||
|
return sampleConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Couchbase) Description() string {
|
||||||
|
return "Read metrics from one or many couchbase clusters"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads stats from all configured clusters. Accumulates stats.
|
||||||
|
// Returns one of the errors encountered while gathering stats (if any).
|
||||||
|
func (r *Couchbase) Gather(acc telegraf.Accumulator) error {
|
||||||
|
if len(r.Servers) == 0 {
|
||||||
|
r.gatherServer("http://localhost:8091/", acc)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
|
var outerr error
|
||||||
|
|
||||||
|
for _, serv := range r.Servers {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(serv string) {
|
||||||
|
defer wg.Done()
|
||||||
|
outerr = r.gatherServer(serv, acc)
|
||||||
|
}(serv)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
return outerr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Couchbase) gatherServer(addr string, acc telegraf.Accumulator) error {
|
||||||
|
client, err := couchbase.Connect(addr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pool, err := client.GetPool("default")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for i := 0; i < len(pool.Nodes); i++ {
|
||||||
|
node := pool.Nodes[i]
|
||||||
|
tags := map[string]string{"cluster": addr, "hostname": node.Hostname}
|
||||||
|
fields := make(map[string]interface{})
|
||||||
|
fields["memory_free"] = node.MemoryFree
|
||||||
|
fields["memory_total"] = node.MemoryTotal
|
||||||
|
acc.AddFields("couchbase_node", fields, tags)
|
||||||
|
}
|
||||||
|
for bucketName, bucket := range pool.BucketMap {
|
||||||
|
tags := map[string]string{"cluster": addr, "bucket": bucketName}
|
||||||
|
acc.AddFields("couchbase_bucket", bucket.BasicStats, tags)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
inputs.Add("couchbase", func() telegraf.Input {
|
||||||
|
return &Couchbase{}
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue