Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit 68f6665

Browse files
authored
Remove duplicates from substribed metrics (#52)
1 parent 674c33a commit 68f6665

9 files changed

+315
-50
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ virt-install --name=test_vm --arch=x86_64 --vcpus=1 --ram=512 --os-type=linux --
7676
```
7777
4. Load Snap libvirt collector plugin and create task:
7878
```
79-
wget https://raw.githubusercontent.com/intelsdi-x/snap-plugin-collector-libvirt/master/example/task-example.yaml
79+
wget https://raw.githubusercontent.com/intelsdi-x/snap-plugin-collector-libvirt/master/example/tasks/task-example.yaml
8080
snaptel plugin load snap-plugin-collector-libvirt
8181
snaptel task create -t task-example.yaml
8282
```
File renamed without changes.
File renamed without changes.
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
---
3+
version: 1
4+
schedule:
5+
type: "simple"
6+
interval: "1s"
7+
max-failures: 10
8+
workflow:
9+
collect:
10+
metrics:
11+
/intel/libvirt/test/cpu/cputime: {}
12+
/intel/libvirt/test/disk/hd0/rdbytes: {}
13+
/intel/libvirt/test/disk/hd0/rdreq: {}
14+
/intel/libvirt/test/disk/hd0/wrbytes: {}
15+
/intel/libvirt/test/disk/hd0/wrreq: {}
16+
/intel/libvirt/test/network/vir0/rxbytes: {}
17+
/intel/libvirt/test/network/vir0/txbytes: {}
18+
publish:
19+
- plugin_name: "file"
20+
config:
21+
file: "/tmp/libvirt_metrics.log"
22+

libvirt/libvirt.go

+21
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ type Libvirt interface {
3131
GetDomainInterfaces(domain libvirt.VirDomain) ([]string, error)
3232
GetDomainDisks(domain libvirt.VirDomain) ([]string, error)
3333
GetVCPUStatistics(domain libvirt.VirDomain) (map[string]int64, error)
34+
GetRequestedInstances(conn libvirt.VirConnection, domainNames []string) ([]libvirt.VirDomain, error)
35+
GetInstanceByDomainName(conn libvirt.VirConnection, domainName string) (libvirt.VirDomain, error)
3436
}
3537

3638
// GetInstanceIds return all names of active VirDomains
@@ -67,3 +69,22 @@ func GetInstances(conn libvirt.VirConnection) ([]libvirt.VirDomain, error) {
6769
}
6870
return libvirtDomains, nil
6971
}
72+
73+
// GetRequestedInstances return all instances from domainNames slice
74+
func GetRequestedInstances(conn libvirt.VirConnection, domainNames []string) ([]libvirt.VirDomain, error) {
75+
var libvirtDomains []libvirt.VirDomain
76+
for _, domainName := range domainNames {
77+
domain, err := GetInstanceByDomainName(conn, domainName)
78+
if err != nil {
79+
return libvirtDomains, err
80+
}
81+
libvirtDomains = append(libvirtDomains, domain)
82+
}
83+
return libvirtDomains, nil
84+
85+
}
86+
87+
// GetInstanceByDomainName return instance by DomainName
88+
func GetInstanceByDomainName(conn libvirt.VirConnection, domainName string) (libvirt.VirDomain, error) {
89+
return conn.LookupDomainByName(domainName)
90+
}

libvirt/libvirt_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ func TestLibirt(t *testing.T) {
3838
So(err, ShouldNotBeNil)
3939
So(len(interf), ShouldResemble, 0)
4040
})
41+
Convey("Get DomainNames", t, func() {
42+
conn, err := libvirt.NewVirConnection("test:///default")
43+
So(err, ShouldBeNil)
44+
domains, err := GetInstanceIds(conn)
45+
So(err, ShouldBeNil)
46+
So(len(domains), ShouldResemble, 1)
47+
})
4148
Convey("Get Interface Name when Interface exist", t, func() {
4249
buf, err := ioutil.ReadFile("./test_domain.xml")
4350
if err != nil {
@@ -133,4 +140,20 @@ func TestLibirt(t *testing.T) {
133140
expectedData := map[string]string{"nova_uuid": "5a26891c-efb0-4c6a-8bef-b54c45296136"}
134141
So(data, ShouldResemble, expectedData)
135142
})
143+
Convey("Get Instances from a slice", t, func() {
144+
conn, err := libvirt.NewVirConnection("test:///default")
145+
instances := []string{"test"}
146+
So(err, ShouldBeNil)
147+
domains, err := GetRequestedInstances(conn, instances)
148+
So(err, ShouldBeNil)
149+
So(len(domains), ShouldResemble, 1)
150+
})
151+
Convey("Get Instances from a slice, when instance doesn't exist", t, func() {
152+
conn, err := libvirt.NewVirConnection("test:///default")
153+
instances := []string{"testi1"}
154+
So(err, ShouldBeNil)
155+
domains, err := GetRequestedInstances(conn, instances)
156+
So(err, ShouldNotBeNil)
157+
So(len(domains), ShouldResemble, 0)
158+
})
136159
}

libvirtcollector/common.go

+74
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
package libvirtcollector
22

33
import (
4+
"bytes"
5+
"strings"
46
"time"
57

8+
wrapper "github.com/intelsdi-x/snap-plugin-collector-libvirt/libvirt"
69
"github.com/intelsdi-x/snap-plugin-lib-go/v1/plugin"
10+
libvirt "github.com/sandlbn/libvirt-go"
711
)
812

13+
func getLibvirtURI(cfg plugin.Config) string {
14+
uri, err := cfg.GetString("uri")
15+
if err != nil {
16+
return defaultURI
17+
}
18+
return uri
19+
}
20+
921
func createMetric(ns plugin.Namespace) plugin.Metric {
1022
metricType := plugin.Metric{
1123

@@ -22,6 +34,7 @@ func filterNamespace(metricType string, mts []plugin.Metric) (int, []plugin.Metr
2234
filteredMetrics = append(filteredMetrics, m)
2335
}
2436
}
37+
filteredMetrics = removeDuplicates(filteredMetrics)
2538
return len(filteredMetrics), filteredMetrics
2639
}
2740

@@ -65,3 +78,64 @@ func copyNamespaceElements(ns []plugin.NamespaceElement) []plugin.NamespaceEleme
6578
copy(newNs, ns)
6679
return newNs
6780
}
81+
82+
func removeDuplicates(elements []plugin.Metric) []plugin.Metric {
83+
// Use map to record duplicates as we find them.
84+
encountered := map[string]bool{}
85+
result := []plugin.Metric{}
86+
87+
for _, v := range elements {
88+
ns := strings.Join(v.Namespace.Strings(), "/")
89+
if !encountered[ns] {
90+
encountered[ns] = true
91+
result = append(result, v)
92+
}
93+
}
94+
// Return the new slice.
95+
return result
96+
}
97+
98+
func metricStored(elements []plugin.Metric, newNamespace []plugin.NamespaceElement) bool {
99+
for _, v := range elements {
100+
ns := strings.Join(v.Namespace.Strings(), "")
101+
if ns == joinNamespaceElements(newNamespace) {
102+
return true
103+
}
104+
}
105+
return false
106+
}
107+
108+
func joinNamespaceElements(ns []plugin.NamespaceElement) string {
109+
var buffer bytes.Buffer
110+
for _, v := range ns {
111+
buffer.WriteString(v.Value)
112+
}
113+
return buffer.String()
114+
}
115+
116+
func contains(s []string, e string) bool {
117+
for _, a := range s {
118+
if a == e {
119+
return true
120+
}
121+
}
122+
return false
123+
}
124+
125+
func getInstances(conn libvirt.VirConnection, elements []plugin.Metric) ([]libvirt.VirDomain, error) {
126+
127+
instances := []string{}
128+
129+
for _, v := range elements {
130+
domain := v.Namespace.Strings()[nsDomainPosition]
131+
132+
if domain == "*" {
133+
return wrapper.GetInstances(conn)
134+
}
135+
if !contains(instances, domain) {
136+
instances = append(instances, domain)
137+
}
138+
}
139+
return wrapper.GetRequestedInstances(conn, instances)
140+
141+
}

0 commit comments

Comments
 (0)