mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-11 22:14:02 +01:00
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
// SPDX-FileCopyrightText: 2022 Free Mobile
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
//go:build !release
|
|
|
|
package reporter
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
// NewMock creates a new reporter for tests. Currently, this is the same as a
|
|
// production reporter, except when running benchmarks.
|
|
func NewMock(t testing.TB) *Reporter {
|
|
t.Helper()
|
|
config := DefaultConfiguration()
|
|
r, err := New(config)
|
|
if err != nil {
|
|
t.Fatalf("New() error:\n%+v", err)
|
|
}
|
|
if _, ok := t.(*testing.B); ok {
|
|
r.Logger.Logger = r.Logger.Level(zerolog.WarnLevel)
|
|
}
|
|
return r
|
|
}
|
|
|
|
// GetMetrics returns a map from metric name to its value (as a
|
|
// string). It keeps only metrics matching the provided prefix.
|
|
func (r *Reporter) GetMetrics(prefix string, subset ...string) map[string]string {
|
|
results := make(map[string]string)
|
|
req := httptest.NewRequest("GET", "/api/v0/metrics", nil)
|
|
w := httptest.NewRecorder()
|
|
r.MetricsHTTPHandler().ServeHTTP(w, req)
|
|
|
|
lines := strings.Split(w.Body.String(), "\n")
|
|
outer:
|
|
for _, line := range lines {
|
|
// Very basic parsing
|
|
if strings.HasPrefix(line, "#") || !strings.HasPrefix(line, prefix) {
|
|
continue
|
|
}
|
|
var result []string
|
|
if idx := strings.Index(line, "} "); idx >= 0 {
|
|
result = []string{line[:idx+1], line[idx+2:]}
|
|
} else {
|
|
result = strings.SplitN(line, " ", 2)
|
|
if len(result) != 2 {
|
|
continue
|
|
}
|
|
}
|
|
trimmed := strings.TrimPrefix(result[0], prefix)
|
|
nonnegative := 0
|
|
if len(subset) > 0 {
|
|
for _, oPrefix := range subset {
|
|
if oPrefix[0] == '-' {
|
|
if strings.HasPrefix(trimmed, oPrefix[1:]) {
|
|
continue outer
|
|
}
|
|
} else {
|
|
nonnegative++
|
|
if strings.HasPrefix(trimmed, oPrefix) {
|
|
results[trimmed] = result[1]
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if nonnegative == 0 {
|
|
results[trimmed] = result[1]
|
|
}
|
|
}
|
|
|
|
return results
|
|
}
|