Skip to content

Commit d580ecf

Browse files
committed
Merge pull request #802 from anushree-n/collectorCollect
Collection of custom metrics
2 parents 9e1101f + 6cc9d44 commit d580ecf

File tree

2 files changed

+100
-2
lines changed

2 files changed

+100
-2
lines changed

collector/generic_collector.go

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ import (
1818
"encoding/json"
1919
"fmt"
2020
"io/ioutil"
21+
"net/http"
2122
"regexp"
23+
"strconv"
24+
"strings"
2225
"time"
2326

2427
"github.com/google/cadvisor/info/v1"
@@ -92,6 +95,70 @@ func (collector *GenericCollector) Name() string {
9295

9396
//Returns collected metrics and the next collection time of the collector
9497
func (collector *GenericCollector) Collect() (time.Time, []v1.Metric, error) {
95-
//TO BE IMPLEMENTED
96-
return time.Now(), nil, nil
98+
minNextColTime := collector.configFile.MetricsConfig[0].PollingFrequency
99+
for _, metricConfig := range collector.configFile.MetricsConfig {
100+
if metricConfig.PollingFrequency < minNextColTime {
101+
minNextColTime = metricConfig.PollingFrequency
102+
}
103+
}
104+
currentTime := time.Now()
105+
nextCollectionTime := currentTime.Add(time.Duration(minNextColTime * time.Second))
106+
107+
uri := collector.configFile.Endpoint
108+
response, err := http.Get(uri)
109+
if err != nil {
110+
return nextCollectionTime, nil, err
111+
}
112+
113+
defer response.Body.Close()
114+
115+
pageContent, err := ioutil.ReadAll(response.Body)
116+
if err != nil {
117+
return nextCollectionTime, nil, err
118+
}
119+
120+
metrics := make([]v1.Metric, len(collector.configFile.MetricsConfig))
121+
var errorSlice []error
122+
123+
for ind, metricConfig := range collector.configFile.MetricsConfig {
124+
regex, err := regexp.Compile(metricConfig.Regex)
125+
if err != nil {
126+
return nextCollectionTime, nil, err
127+
}
128+
129+
matchString := regex.FindStringSubmatch(string(pageContent))
130+
if matchString != nil {
131+
if metricConfig.Units == "float" {
132+
regVal, err := strconv.ParseFloat(strings.TrimSpace(matchString[1]), 64)
133+
if err != nil {
134+
errorSlice = append(errorSlice, err)
135+
}
136+
metrics[ind].FloatPoints = []v1.FloatPoint{
137+
{Value: regVal, Timestamp: currentTime},
138+
}
139+
} else if metricConfig.Units == "integer" || metricConfig.Units == "int" {
140+
regVal, err := strconv.ParseInt(strings.TrimSpace(matchString[1]), 10, 64)
141+
if err != nil {
142+
errorSlice = append(errorSlice, err)
143+
}
144+
metrics[ind].IntPoints = []v1.IntPoint{
145+
{Value: regVal, Timestamp: currentTime},
146+
}
147+
148+
} else {
149+
errorSlice = append(errorSlice, fmt.Errorf("Unexpected value of 'units' for metric '%v' in config ", metricConfig.Name))
150+
}
151+
} else {
152+
errorSlice = append(errorSlice, fmt.Errorf("No match found for regexp: %v for metric '%v' in config", metricConfig.Regex, metricConfig.Name))
153+
}
154+
155+
metrics[ind].Name = metricConfig.Name
156+
if metricConfig.MetricType == "gauge" {
157+
metrics[ind].Type = v1.MetricGauge
158+
} else if metricConfig.MetricType == "counter" {
159+
metrics[ind].Type = v1.MetricCumulative
160+
}
161+
}
162+
163+
return nextCollectionTime, metrics, compileErrors(errorSlice)
97164
}

collector/generic_collector_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@
1515
package collector
1616

1717
import (
18+
"fmt"
1819
"io/ioutil"
20+
"net/http"
21+
"net/http/httptest"
1922
"os"
2023
"testing"
2124

25+
"github.com/google/cadvisor/info/v1"
2226
"github.com/stretchr/testify/assert"
2327
)
2428

@@ -115,3 +119,30 @@ func TestConfig(t *testing.T) {
115119
assert.Equal(collector.configFile.Endpoint, "http://localhost:8000/nginx_status")
116120
assert.Equal(collector.configFile.MetricsConfig[0].Name, "activeConnections")
117121
}
122+
123+
func TestMetricCollection(t *testing.T) {
124+
assert := assert.New(t)
125+
126+
//Collect nginx metrics from a fake nginx endpoint
127+
fakeCollector, err := NewCollector("nginx", "config/sample_config.json")
128+
assert.NoError(err)
129+
130+
tempServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
131+
fmt.Fprintln(w, "Active connections: 3\nserver accepts handled requests")
132+
fmt.Fprintln(w, "5 5 32\nReading: 0 Writing: 1 Waiting: 2")
133+
}))
134+
defer tempServer.Close()
135+
fakeCollector.configFile.Endpoint = tempServer.URL
136+
137+
_, metrics, errMetric := fakeCollector.Collect()
138+
assert.NoError(errMetric)
139+
assert.Equal(metrics[0].Name, "activeConnections")
140+
assert.Equal(metrics[0].Type, v1.MetricGauge)
141+
assert.Nil(metrics[0].FloatPoints)
142+
assert.Equal(metrics[1].Name, "reading")
143+
assert.Equal(metrics[2].Name, "writing")
144+
assert.Equal(metrics[3].Name, "waiting")
145+
146+
//Assert: Number of active connections = Number of connections reading + Number of connections writing + Number of connections waiting
147+
assert.Equal(metrics[0].IntPoints[0].Value, (metrics[1].IntPoints[0].Value)+(metrics[2].IntPoints[0].Value)+(metrics[3].IntPoints[0].Value))
148+
}

0 commit comments

Comments
 (0)