libvirt plugin

This commit is contained in:
Philippe Hässig 2015-09-24 17:21:25 +02:00
parent 1accab02ed
commit 5fe64c7641
6 changed files with 127 additions and 0 deletions

View File

@ -9,6 +9,7 @@ changed to just run docker commands in the Makefile. See `make docker-run` and
- HAProxy plugin tag has changed from `host` to `server` - HAProxy plugin tag has changed from `host` to `server`
### Features ### Features
- [#357](https://github.com/influxdb/telegraf/pull/357): Libvirt plugin. Thanks @neckhair!
- [#325](https://github.com/influxdb/telegraf/pull/325): NSQ output. Thanks @jrxFive! - [#325](https://github.com/influxdb/telegraf/pull/325): NSQ output. Thanks @jrxFive!
- [#318](https://github.com/influxdb/telegraf/pull/318): Prometheus output. Thanks @oldmantaiter! - [#318](https://github.com/influxdb/telegraf/pull/318): Prometheus output. Thanks @oldmantaiter!
- [#338](https://github.com/influxdb/telegraf/pull/338): Restart Telegraf on package upgrade. Thanks @linsomniac! - [#338](https://github.com/influxdb/telegraf/pull/338): Restart Telegraf on package upgrade. Thanks @linsomniac!

View File

@ -176,6 +176,7 @@ Telegraf currently has support for collecting metrics from:
* jolokia (remote JMX with JSON over HTTP) * jolokia (remote JMX with JSON over HTTP)
* kafka_consumer * kafka_consumer
* leofs * leofs
* libvirt
* lustre2 * lustre2
* memcached * memcached
* mongodb * mongodb

View File

@ -12,6 +12,7 @@ import (
_ "github.com/influxdb/telegraf/plugins/jolokia" _ "github.com/influxdb/telegraf/plugins/jolokia"
_ "github.com/influxdb/telegraf/plugins/kafka_consumer" _ "github.com/influxdb/telegraf/plugins/kafka_consumer"
_ "github.com/influxdb/telegraf/plugins/leofs" _ "github.com/influxdb/telegraf/plugins/leofs"
_ "github.com/influxdb/telegraf/plugins/libvirt"
_ "github.com/influxdb/telegraf/plugins/lustre2" _ "github.com/influxdb/telegraf/plugins/lustre2"
_ "github.com/influxdb/telegraf/plugins/memcached" _ "github.com/influxdb/telegraf/plugins/memcached"
_ "github.com/influxdb/telegraf/plugins/mongodb" _ "github.com/influxdb/telegraf/plugins/mongodb"

32
plugins/libvirt/README.md Normal file
View File

@ -0,0 +1,32 @@
# Telegraf Plugin: libvirt
#### Description
The libvirt plugin collects libvirt statistics.
To test this plugin set the following configuration:
```toml
[libvirt]
uri = "test:///default"
```
This mocks a libvirt deamon with one running domain. The URI for a connection to a local qemu would be
`qemu:///system`.
## Resources
* http://wiki.libvirt.org/page/UbuntuKVMWalkthrough
* http://godoc.org/github.com/alexzorin/libvirt-go
## Measurements:
Meta:
- units: int64
- tags: `domain=vader`
Measurements names:
- libvirt_cpu_time
- libvirt_max_mem
- libvirt_memory
- libvirt_nr_virt_cpu

View File

@ -0,0 +1,69 @@
package libvirt
import (
lv "github.com/alexzorin/libvirt-go"
"github.com/influxdb/telegraf/plugins"
)
const sampleConfig = `
# specify a libvirt connection uri
uri = "qemu:///system"
`
type Libvirt struct {
Uri string
}
func (l *Libvirt) SampleConfig() string {
return sampleConfig
}
func (l *Libvirt) Description() string {
return "Read domain infos from a libvirt deamon"
}
func (l *Libvirt) Gather(acc plugins.Accumulator) error {
connection, err := lv.NewVirConnectionReadOnly(l.Uri)
if err != nil {
return err
}
defer connection.CloseConnection()
domains, err := connection.ListDomains()
if err != nil {
return err
}
for _, domainId := range domains {
domain, err := connection.LookupDomainById(domainId)
if err != nil {
return err
}
domainName, _ := domain.GetName()
tags := map[string]string{"domain": domainName}
l.gatherDomain(acc, domain, tags)
}
return nil
}
func (m *Libvirt) gatherDomain(acc plugins.Accumulator, domain lv.VirDomain, tags map[string]string) error {
domainInfo, err := domain.GetInfo()
if err != nil {
return err
}
acc.Add("cpu_time", domainInfo.GetCpuTime(), tags)
acc.Add("max_mem", domainInfo.GetMaxMem(), tags)
acc.Add("memory", domainInfo.GetMemory(), tags)
acc.Add("nr_virt_cpu", domainInfo.GetNrVirtCpu(), tags)
return nil
}
func init() {
plugins.Add("libvirt", func() plugins.Plugin {
return &Libvirt{}
})
}

View File

@ -0,0 +1,23 @@
package libvirt
import (
"testing"
"github.com/influxdb/telegraf/testutil"
"github.com/stretchr/testify/assert"
)
func TestLibvirt(t *testing.T) {
var acc testutil.Accumulator
l := &Libvirt{Uri: "test:///default"}
l.Gather(&acc)
assert.True(t, acc.HasUIntValue("cpu_time"))
assert.True(t, acc.HasUIntValue("memory"))
assert.True(t, acc.HasUIntValue("max_mem"))
expectedTags := map[string]string{"domain": "test"}
expectedNumberOfCpus := uint16(2)
assert.NoError(t, acc.ValidateTaggedValue("nr_virt_cpu", expectedNumberOfCpus, expectedTags))
}