mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-12 06:24:10 +01:00
inlet/outlet: rename a few metrics
For example: ``` 17:35 ❱ curl -s 127.0.0.1:8080/api/v0/outlet/metrics | promtool check metrics akvorado_outlet_core_classifier_exporter_cache_size_items counter metrics should have "_total" suffix akvorado_outlet_core_classifier_interface_cache_size_items counter metrics should have "_total" suffix akvorado_outlet_flow_decoder_netflow_flowset_records_sum counter metrics should have "_total" suffix akvorado_outlet_flow_decoder_netflow_flowset_records_sum non-histogram and non-summary metrics should not have "_sum" suffix akvorado_outlet_flow_decoder_netflow_flowset_sum counter metrics should have "_total" suffix akvorado_outlet_flow_decoder_netflow_flowset_sum non-histogram and non-summary metrics should not have "_sum" suffix akvorado_outlet_kafka_buffered_fetch_records_total non-counter metrics should not have "_total" suffix akvorado_outlet_kafka_buffered_produce_records_total non-counter metrics should not have "_total" suffix akvorado_outlet_metadata_cache_refreshs counter metrics should have "_total" suffix akvorado_outlet_routing_provider_bmp_peers_total non-counter metrics should not have "_total" suffix akvorado_outlet_routing_provider_bmp_routes_total non-counter metrics should not have "_total" suffix ``` Also ensure metrics using errors as label don't have a too great cardinality by using constants for error messages used.
This commit is contained in:
@@ -8,7 +8,6 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -21,7 +20,9 @@ import (
|
||||
"akvorado/common/reporter"
|
||||
)
|
||||
|
||||
// ProviderFunc is the callback function to call when a datasource is refreshed implementZ.
|
||||
// ProviderFunc is the callback function to call when a datasource is refreshed.
|
||||
// The error returned is used for metrics. One should avoid having too many
|
||||
// different errors.
|
||||
type ProviderFunc func(ctx context.Context, name string, source RemoteDataSource) (int, error)
|
||||
|
||||
// Component represents a remote data source fetcher.
|
||||
@@ -49,9 +50,27 @@ func New[T interface{}](r *reporter.Reporter, provider ProviderFunc, dataType st
|
||||
return &c, nil
|
||||
}
|
||||
|
||||
// Fetch retrieves data from a configured RemoteDataSource, and returns a list of results
|
||||
// decoded from JSON to generic type.
|
||||
// Fetch should be used in UpdateRemoteDataSource implementations to update internal data from results.
|
||||
var (
|
||||
// ErrBuildRequest is triggered when we cannot build an HTTP request
|
||||
ErrBuildRequest = errors.New("cannot build HTTP request")
|
||||
// ErrFetchDataSource is triggered when we cannot fetch the data source
|
||||
ErrFetchDataSource = errors.New("cannot fetch data source")
|
||||
// ErrStatusCode is triggered if status code is not 200
|
||||
ErrStatusCode = errors.New("unexpected HTTP status code")
|
||||
// ErrJSONDecode is triggered for any decoding issue
|
||||
ErrJSONDecode = errors.New("cannot decode JSON")
|
||||
// ErrMapResult is triggered when we cannot map the JSON result to the expected structure
|
||||
ErrMapResult = errors.New("cannot map JSON")
|
||||
// ErrJQExecute is triggered when we cannot execute the jq filter
|
||||
ErrJQExecute = errors.New("cannot execute jq filter")
|
||||
// ErrEmpty is triggered if the results are empty
|
||||
ErrEmpty = errors.New("empty result")
|
||||
)
|
||||
|
||||
// Fetch retrieves data from a configured RemoteDataSource, and returns a list
|
||||
// of results decoded from JSON to generic type. Fetch should be used in
|
||||
// UpdateRemoteDataSource implementations to update internal data from results.
|
||||
// It outputs errors without details because they are used for metrics.
|
||||
func (c *Component[T]) Fetch(ctx context.Context, name string, source RemoteDataSource) ([]T, error) {
|
||||
var results []T
|
||||
l := c.r.With().Str("name", name).Str("url", source.URL).Logger()
|
||||
@@ -61,31 +80,30 @@ func (c *Component[T]) Fetch(ctx context.Context, name string, source RemoteData
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
}}
|
||||
req, err := http.NewRequestWithContext(ctx, source.Method, source.URL, nil)
|
||||
if err != nil {
|
||||
l.Err(err).Msg("unable to build new request")
|
||||
return results, ErrBuildRequest
|
||||
}
|
||||
for headerName, headerValue := range source.Headers {
|
||||
req.Header.Set(headerName, headerValue)
|
||||
}
|
||||
req.Header.Set("accept", "application/json")
|
||||
if err != nil {
|
||||
l.Err(err).Msg("unable to build new request")
|
||||
return results, fmt.Errorf("unable to build new request: %w", err)
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
l.Err(err).Msg("unable to fetch data source")
|
||||
return results, fmt.Errorf("unable to fetch data source: %w", err)
|
||||
return results, ErrFetchDataSource
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != 200 {
|
||||
err := fmt.Errorf("unexpected status code %d: %s", resp.StatusCode, resp.Status)
|
||||
l.Error().Msg(err.Error())
|
||||
return results, err
|
||||
l.Error().Int("status", resp.StatusCode).Msg("unexpected status code")
|
||||
return results, ErrStatusCode
|
||||
}
|
||||
reader := bufio.NewReader(resp.Body)
|
||||
decoder := json.NewDecoder(reader)
|
||||
var got interface{}
|
||||
if err := decoder.Decode(&got); err != nil {
|
||||
l.Err(err).Msg("cannot decode JSON output")
|
||||
return results, fmt.Errorf("cannot decode JSON output: %w", err)
|
||||
return results, ErrJSONDecode
|
||||
}
|
||||
|
||||
iter := source.Transform.Query.RunWithContext(ctx, got)
|
||||
@@ -96,7 +114,7 @@ func (c *Component[T]) Fetch(ctx context.Context, name string, source RemoteData
|
||||
}
|
||||
if err, ok := v.(error); ok {
|
||||
l.Err(err).Msg("cannot execute jq filter")
|
||||
return results, fmt.Errorf("cannot execute jq filter: %w", err)
|
||||
return results, ErrJQExecute
|
||||
}
|
||||
var result T
|
||||
config := &mapstructure.DecoderConfig{
|
||||
@@ -110,14 +128,13 @@ func (c *Component[T]) Fetch(ctx context.Context, name string, source RemoteData
|
||||
}
|
||||
if err := decoder.Decode(v); err != nil {
|
||||
l.Err(err).Msgf("cannot map returned value for %#v", v)
|
||||
return results, fmt.Errorf("cannot map returned value: %w", err)
|
||||
return results, ErrMapResult
|
||||
}
|
||||
results = append(results, result)
|
||||
}
|
||||
if len(results) == 0 {
|
||||
err := errors.New("empty results")
|
||||
l.Error().Msg(err.Error())
|
||||
return results, err
|
||||
l.Error().Msg("empty result")
|
||||
return results, ErrEmpty
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ func (c *Component) startBMPClient(ctx context.Context) {
|
||||
conn, err := d.DialContext(ctx, "tcp", c.config.Target)
|
||||
if err != nil {
|
||||
c.r.Err(err).Msg("cannot connect to target")
|
||||
c.metrics.errors.WithLabelValues(err.Error()).Inc()
|
||||
c.metrics.errors.WithLabelValues("cannot connect").Inc()
|
||||
return
|
||||
}
|
||||
c.metrics.connections.Inc()
|
||||
@@ -116,7 +116,7 @@ func (c *Component) startBMPClient(ctx context.Context) {
|
||||
// Send the packets on the wire
|
||||
if _, err := conn.Write(buf.Bytes()); err != nil {
|
||||
c.r.Err(err).Msg("cannot write BMP message to target")
|
||||
c.metrics.errors.WithLabelValues(err.Error()).Inc()
|
||||
c.metrics.errors.WithLabelValues("cannot write").Inc()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ func (c *Component) startBMPClient(ctx context.Context) {
|
||||
buf.Write(pkt)
|
||||
if _, err := conn.Write(buf.Bytes()); err != nil && err != io.EOF && !errors.Is(err, syscall.ECONNRESET) && !errors.Is(err, syscall.EPIPE) {
|
||||
c.r.Err(err).Msg("cannot write to remote")
|
||||
c.metrics.errors.WithLabelValues(err.Error()).Inc()
|
||||
c.metrics.errors.WithLabelValues("cannot write").Inc()
|
||||
close(done)
|
||||
return
|
||||
} else if err != nil {
|
||||
|
||||
@@ -87,7 +87,7 @@ func (c *Component) Start() error {
|
||||
for payload := range payloads {
|
||||
sequenceNumber++
|
||||
if _, err := conn.Write(payload); err != nil {
|
||||
c.metrics.errors.WithLabelValues(err.Error()).Inc()
|
||||
c.metrics.errors.WithLabelValues("cannot write").Inc()
|
||||
errLogger.Err(err).Msg("unable to send UDP payload")
|
||||
} else {
|
||||
c.metrics.sent.WithLabelValues(kind).Inc()
|
||||
|
||||
@@ -31,7 +31,7 @@ type Input struct {
|
||||
packets *reporter.CounterVec
|
||||
packetSizeSum *reporter.SummaryVec
|
||||
errors *reporter.CounterVec
|
||||
inDrops *reporter.GaugeVec
|
||||
inDrops *reporter.CounterVec
|
||||
}
|
||||
|
||||
address net.Addr // listening address, for testing purpoese
|
||||
@@ -62,7 +62,7 @@ func (configuration *Configuration) New(r *reporter.Reporter, daemon daemon.Comp
|
||||
)
|
||||
input.metrics.packetSizeSum = r.SummaryVec(
|
||||
reporter.SummaryOpts{
|
||||
Name: "summary_size_bytes",
|
||||
Name: "size_bytes",
|
||||
Help: "Summary of packet size.",
|
||||
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
|
||||
},
|
||||
@@ -75,8 +75,8 @@ func (configuration *Configuration) New(r *reporter.Reporter, daemon daemon.Comp
|
||||
},
|
||||
[]string{"listener", "worker"},
|
||||
)
|
||||
input.metrics.inDrops = r.GaugeVec(
|
||||
reporter.GaugeOpts{
|
||||
input.metrics.inDrops = r.CounterVec(
|
||||
reporter.CounterOpts{
|
||||
Name: "in_dropped_packets_total",
|
||||
Help: "Dropped packets due to listen queue full.",
|
||||
},
|
||||
@@ -156,10 +156,8 @@ func (in *Input) Start() error {
|
||||
if err != nil {
|
||||
errLogger.Err(err).Msg("unable to decode UDP control message")
|
||||
} else {
|
||||
if count < 100 || count%100 == 0 {
|
||||
in.metrics.inDrops.WithLabelValues(listen, worker).Set(
|
||||
float64(oobMsg.Drops))
|
||||
}
|
||||
in.metrics.inDrops.WithLabelValues(listen, worker).Add(
|
||||
float64(oobMsg.Drops))
|
||||
}
|
||||
if oobMsg.Received.IsZero() {
|
||||
oobMsg.Received = time.Now()
|
||||
|
||||
@@ -38,14 +38,14 @@ func TestUDPInput(t *testing.T) {
|
||||
// Check metrics
|
||||
gotMetrics := r.GetMetrics("akvorado_inlet_flow_input_udp_")
|
||||
expectedMetrics := map[string]string{
|
||||
`bytes_total{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "12",
|
||||
`packets_total{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "1",
|
||||
`in_dropped_packets_total{listener="127.0.0.1:0",worker="0"}`: "0",
|
||||
`summary_size_bytes_count{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "1",
|
||||
`summary_size_bytes_sum{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "12",
|
||||
`summary_size_bytes{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0",quantile="0.5"}`: "12",
|
||||
`summary_size_bytes{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0",quantile="0.9"}`: "12",
|
||||
`summary_size_bytes{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0",quantile="0.99"}`: "12",
|
||||
`bytes_total{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "12",
|
||||
`packets_total{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "1",
|
||||
`in_dropped_packets_total{listener="127.0.0.1:0",worker="0"}`: "0",
|
||||
`size_bytes_count{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "1",
|
||||
`size_bytes_sum{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0"}`: "12",
|
||||
`size_bytes{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0",quantile="0.5"}`: "12",
|
||||
`size_bytes{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0",quantile="0.9"}`: "12",
|
||||
`size_bytes{exporter="127.0.0.1",listener="127.0.0.1:0",worker="0",quantile="0.99"}`: "12",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Fatalf("Input metrics (-got, +want):\n%s", diff)
|
||||
|
||||
@@ -69,7 +69,7 @@ func (c *Component) initMetrics() {
|
||||
|
||||
c.metrics.classifierExporterCacheSize = c.r.CounterFunc(
|
||||
reporter.CounterOpts{
|
||||
Name: "classifier_exporter_cache_size_items",
|
||||
Name: "classifier_exporter_cache_items_total",
|
||||
Help: "Number of items in the exporter classifier cache",
|
||||
},
|
||||
func() float64 {
|
||||
@@ -78,7 +78,7 @@ func (c *Component) initMetrics() {
|
||||
)
|
||||
c.metrics.classifierInterfaceCacheSize = c.r.CounterFunc(
|
||||
reporter.CounterOpts{
|
||||
Name: "classifier_interface_cache_size_items",
|
||||
Name: "classifier_interface_cache_items_total",
|
||||
Help: "Number of items in the interface classifier cache",
|
||||
},
|
||||
func() float64 {
|
||||
|
||||
@@ -149,8 +149,8 @@ func TestCore(t *testing.T) {
|
||||
|
||||
gotMetrics := r.GetMetrics("akvorado_outlet_core_", "-flows_processing_")
|
||||
expectedMetrics := map[string]string{
|
||||
`classifier_exporter_cache_size_items`: "0",
|
||||
`classifier_interface_cache_size_items`: "0",
|
||||
`classifier_exporter_cache_items_total`: "0",
|
||||
`classifier_interface_cache_items_total`: "0",
|
||||
`flows_errors_total{error="SNMP cache miss",exporter="192.0.2.142"}`: "1",
|
||||
`flows_errors_total{error="SNMP cache miss",exporter="192.0.2.143"}`: "3",
|
||||
`received_flows_total{exporter="192.0.2.142"}`: "1",
|
||||
@@ -178,8 +178,8 @@ func TestCore(t *testing.T) {
|
||||
time.Sleep(20 * time.Millisecond)
|
||||
gotMetrics = r.GetMetrics("akvorado_outlet_core_", "classifier_", "-flows_processing_", "flows_", "received_", "forwarded_")
|
||||
expectedMetrics = map[string]string{
|
||||
`classifier_exporter_cache_size_items`: "0",
|
||||
`classifier_interface_cache_size_items`: "0",
|
||||
`classifier_exporter_cache_items_total`: "0",
|
||||
`classifier_interface_cache_items_total`: "0",
|
||||
`flows_errors_total{error="SNMP cache miss",exporter="192.0.2.142"}`: "1",
|
||||
`flows_errors_total{error="SNMP cache miss",exporter="192.0.2.143"}`: "3",
|
||||
`received_flows_total{exporter="192.0.2.142"}`: "2",
|
||||
@@ -219,8 +219,8 @@ func TestCore(t *testing.T) {
|
||||
|
||||
gotMetrics = r.GetMetrics("akvorado_outlet_core_", "classifier_", "-flows_processing_", "flows_", "forwarded_", "received_")
|
||||
expectedMetrics = map[string]string{
|
||||
`classifier_exporter_cache_size_items`: "0",
|
||||
`classifier_interface_cache_size_items`: "0",
|
||||
`classifier_exporter_cache_items_total`: "0",
|
||||
`classifier_interface_cache_items_total`: "0",
|
||||
`flows_errors_total{error="SNMP cache miss",exporter="192.0.2.142"}`: "1",
|
||||
`flows_errors_total{error="SNMP cache miss",exporter="192.0.2.143"}`: "3",
|
||||
`flows_errors_total{error="sampling rate missing",exporter="192.0.2.142"}`: "1",
|
||||
|
||||
@@ -34,11 +34,11 @@ type Decoder struct {
|
||||
sampling map[string]*samplingRateSystem
|
||||
|
||||
metrics struct {
|
||||
errors *reporter.CounterVec
|
||||
stats *reporter.CounterVec
|
||||
setRecordsStatsSum *reporter.CounterVec
|
||||
setStatsSum *reporter.CounterVec
|
||||
templatesStats *reporter.CounterVec
|
||||
errors *reporter.CounterVec
|
||||
packets *reporter.CounterVec
|
||||
records *reporter.CounterVec
|
||||
sets *reporter.CounterVec
|
||||
templates *reporter.CounterVec
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,35 +55,35 @@ func New(r *reporter.Reporter, dependencies decoder.Dependencies) decoder.Decode
|
||||
nd.metrics.errors = nd.r.CounterVec(
|
||||
reporter.CounterOpts{
|
||||
Name: "errors_total",
|
||||
Help: "Netflows processed errors.",
|
||||
Help: "Number of NetFlow errors processed.",
|
||||
},
|
||||
[]string{"exporter", "error"},
|
||||
)
|
||||
nd.metrics.stats = nd.r.CounterVec(
|
||||
nd.metrics.packets = nd.r.CounterVec(
|
||||
reporter.CounterOpts{
|
||||
Name: "flows_total",
|
||||
Help: "Netflows processed.",
|
||||
Name: "packets_total",
|
||||
Help: "Number of NetFlow packets received.",
|
||||
},
|
||||
[]string{"exporter", "version"},
|
||||
)
|
||||
nd.metrics.setRecordsStatsSum = nd.r.CounterVec(
|
||||
nd.metrics.sets = nd.r.CounterVec(
|
||||
reporter.CounterOpts{
|
||||
Name: "flowset_records_sum",
|
||||
Help: "Netflows FlowSets sum of records.",
|
||||
Name: "sets_total",
|
||||
Help: "Number of NetFlow flowsets received.",
|
||||
},
|
||||
[]string{"exporter", "version", "type"},
|
||||
)
|
||||
nd.metrics.setStatsSum = nd.r.CounterVec(
|
||||
nd.metrics.records = nd.r.CounterVec(
|
||||
reporter.CounterOpts{
|
||||
Name: "flowset_sum",
|
||||
Help: "Netflows FlowSets sum.",
|
||||
Name: "records_total",
|
||||
Help: "Number of NetFlow records received.",
|
||||
},
|
||||
[]string{"exporter", "version", "type"},
|
||||
)
|
||||
nd.metrics.templatesStats = nd.r.CounterVec(
|
||||
nd.metrics.templates = nd.r.CounterVec(
|
||||
reporter.CounterOpts{
|
||||
Name: "templates_total",
|
||||
Help: "Netflows Template count.",
|
||||
Help: "Number of NetFlow templates received.",
|
||||
},
|
||||
[]string{"exporter", "version", "obs_domain_id", "template_id", "type"},
|
||||
)
|
||||
@@ -115,7 +115,7 @@ func (s *templateSystem) AddTemplate(version uint16, obsDomainID uint32, templat
|
||||
typeStr = "template"
|
||||
}
|
||||
|
||||
s.nd.metrics.templatesStats.WithLabelValues(
|
||||
s.nd.metrics.templates.WithLabelValues(
|
||||
s.key,
|
||||
strconv.Itoa(int(version)),
|
||||
strconv.Itoa(int(obsDomainID)),
|
||||
@@ -220,8 +220,8 @@ func (nd *Decoder) Decode(in decoder.RawFlow, options decoder.Option, bf *schema
|
||||
return 0, fmt.Errorf("NetFlow v5 decoding error: %w", err)
|
||||
}
|
||||
versionStr = "5"
|
||||
nd.metrics.setStatsSum.WithLabelValues(key, versionStr, "PDU").Inc()
|
||||
nd.metrics.setRecordsStatsSum.WithLabelValues(key, versionStr, "PDU").
|
||||
nd.metrics.sets.WithLabelValues(key, versionStr, "PDU").Inc()
|
||||
nd.metrics.records.WithLabelValues(key, versionStr, "PDU").
|
||||
Add(float64(len(packetNFv5.Records)))
|
||||
if options.TimestampSource == pb.RawFlow_TS_NETFLOW_PACKET || options.TimestampSource == pb.RawFlow_TS_NETFLOW_FIRST_SWITCHED {
|
||||
ts = uint64(packetNFv5.UnixSecs)
|
||||
@@ -267,39 +267,39 @@ func (nd *Decoder) Decode(in decoder.RawFlow, options decoder.Option, bf *schema
|
||||
nd.decodeNFv9IPFIX(version, obsDomainID, flowSets, sampling, ts, sysUptime, options, bf, finalize2)
|
||||
default:
|
||||
nd.errLogger.Warn().Str("exporter", key).Msg("unknown NetFlow version")
|
||||
nd.metrics.stats.WithLabelValues(key, "unknown").
|
||||
nd.metrics.packets.WithLabelValues(key, "unknown").
|
||||
Inc()
|
||||
return 0, errors.New("unkown NetFlow version")
|
||||
}
|
||||
nd.metrics.stats.WithLabelValues(key, versionStr).Inc()
|
||||
nd.metrics.packets.WithLabelValues(key, versionStr).Inc()
|
||||
|
||||
nb := 0
|
||||
for _, fs := range flowSets {
|
||||
switch fsConv := fs.(type) {
|
||||
case netflow.TemplateFlowSet:
|
||||
nd.metrics.setStatsSum.WithLabelValues(key, versionStr, "TemplateFlowSet").
|
||||
nd.metrics.sets.WithLabelValues(key, versionStr, "TemplateFlowSet").
|
||||
Inc()
|
||||
nd.metrics.setRecordsStatsSum.WithLabelValues(key, versionStr, "TemplateFlowSet").
|
||||
nd.metrics.records.WithLabelValues(key, versionStr, "TemplateFlowSet").
|
||||
Add(float64(len(fsConv.Records)))
|
||||
case netflow.IPFIXOptionsTemplateFlowSet:
|
||||
nd.metrics.setStatsSum.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
nd.metrics.sets.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
Inc()
|
||||
nd.metrics.setRecordsStatsSum.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
nd.metrics.records.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
Add(float64(len(fsConv.Records)))
|
||||
case netflow.NFv9OptionsTemplateFlowSet:
|
||||
nd.metrics.setStatsSum.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
nd.metrics.sets.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
Inc()
|
||||
nd.metrics.setRecordsStatsSum.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
nd.metrics.records.WithLabelValues(key, versionStr, "OptionsTemplateFlowSet").
|
||||
Add(float64(len(fsConv.Records)))
|
||||
case netflow.OptionsDataFlowSet:
|
||||
nd.metrics.setStatsSum.WithLabelValues(key, versionStr, "OptionsDataFlowSet").
|
||||
nd.metrics.sets.WithLabelValues(key, versionStr, "OptionsDataFlowSet").
|
||||
Inc()
|
||||
nd.metrics.setRecordsStatsSum.WithLabelValues(key, versionStr, "OptionsDataFlowSet").
|
||||
nd.metrics.records.WithLabelValues(key, versionStr, "OptionsDataFlowSet").
|
||||
Add(float64(len(fsConv.Records)))
|
||||
case netflow.DataFlowSet:
|
||||
nd.metrics.setStatsSum.WithLabelValues(key, versionStr, "DataFlowSet").
|
||||
nd.metrics.sets.WithLabelValues(key, versionStr, "DataFlowSet").
|
||||
Inc()
|
||||
nd.metrics.setRecordsStatsSum.WithLabelValues(key, versionStr, "DataFlowSet").
|
||||
nd.metrics.records.WithLabelValues(key, versionStr, "DataFlowSet").
|
||||
Add(float64(len(fsConv.Records)))
|
||||
nb += len(fsConv.Records)
|
||||
}
|
||||
|
||||
@@ -55,9 +55,9 @@ func TestDecode(t *testing.T) {
|
||||
// Check metrics
|
||||
gotMetrics := r.GetMetrics("akvorado_outlet_flow_decoder_netflow_")
|
||||
expectedMetrics := map[string]string{
|
||||
`flows_total{exporter="::ffff:127.0.0.1",version="9"}`: "1",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`packets_total{exporter="::ffff:127.0.0.1",version="9"}`: "1",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`templates_total{exporter="::ffff:127.0.0.1",obs_domain_id="0",template_id="257",type="options_template",version="9"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -79,11 +79,11 @@ func TestDecode(t *testing.T) {
|
||||
// Check metrics
|
||||
gotMetrics = r.GetMetrics("akvorado_outlet_flow_decoder_netflow_")
|
||||
expectedMetrics = map[string]string{
|
||||
`flows_total{exporter="::ffff:127.0.0.1",version="9"}`: "2",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "4",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "1",
|
||||
`packets_total{exporter="::ffff:127.0.0.1",version="9"}`: "2",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "4",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "1",
|
||||
`templates_total{exporter="::ffff:127.0.0.1",obs_domain_id="0",template_id="257",type="options_template",version="9"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -105,13 +105,13 @@ func TestDecode(t *testing.T) {
|
||||
// Check metrics
|
||||
gotMetrics = r.GetMetrics("akvorado_outlet_flow_decoder_netflow_")
|
||||
expectedMetrics = map[string]string{
|
||||
`flows_total{exporter="::ffff:127.0.0.1",version="9"}`: "3",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "4",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`packets_total{exporter="::ffff:127.0.0.1",version="9"}`: "3",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "4",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`templates_total{exporter="::ffff:127.0.0.1",obs_domain_id="0",template_id="257",type="options_template",version="9"}`: "1",
|
||||
`templates_total{exporter="::ffff:127.0.0.1",obs_domain_id="0",template_id="260",type="template",version="9"}`: "1",
|
||||
}
|
||||
@@ -216,20 +216,21 @@ func TestDecode(t *testing.T) {
|
||||
}
|
||||
gotMetrics = r.GetMetrics(
|
||||
"akvorado_outlet_flow_decoder_netflow_",
|
||||
"flows_total",
|
||||
"flowset_",
|
||||
"packets_",
|
||||
"sets_",
|
||||
"records_",
|
||||
"templates_",
|
||||
)
|
||||
expectedMetrics = map[string]string{
|
||||
`flows_total{exporter="::ffff:127.0.0.1",version="9"}`: "4",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="DataFlowSet",version="9"}`: "4",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "4",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_records_sum{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="DataFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`flowset_sum{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`packets_total{exporter="::ffff:127.0.0.1",version="9"}`: "4",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="DataFlowSet",version="9"}`: "4",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "4",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`records_total{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="DataFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="OptionsDataFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="OptionsTemplateFlowSet",version="9"}`: "1",
|
||||
`sets_total{exporter="::ffff:127.0.0.1",type="TemplateFlowSet",version="9"}`: "1",
|
||||
`templates_total{exporter="::ffff:127.0.0.1",obs_domain_id="0",template_id="257",type="options_template",version="9"}`: "1",
|
||||
`templates_total{exporter="::ffff:127.0.0.1",obs_domain_id="0",template_id="260",type="template",version="9"}`: "1",
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ package static
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"akvorado/common/helpers"
|
||||
"akvorado/common/remotedatasourcefetcher"
|
||||
@@ -102,7 +103,7 @@ func (p *Provider) UpdateRemoteDataSource(ctx context.Context, name string, sour
|
||||
p.exportersLock.Unlock()
|
||||
exporters, err := helpers.NewSubnetMap[ExporterConfiguration](finalMap)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
return 0, errors.New("cannot create subnetmap")
|
||||
}
|
||||
p.exporters.Swap(exporters)
|
||||
return len(results), nil
|
||||
|
||||
@@ -102,7 +102,7 @@ func New(r *reporter.Reporter, configuration Configuration, dependencies Depende
|
||||
})
|
||||
c.metrics.cacheRefresh = r.Counter(
|
||||
reporter.CounterOpts{
|
||||
Name: "cache_refreshs",
|
||||
Name: "cache_refreshs_total",
|
||||
Help: "Number of entries refreshed in cache.",
|
||||
})
|
||||
c.metrics.providerBusyCount = r.CounterVec(
|
||||
|
||||
@@ -141,7 +141,7 @@ func TestAutoRefresh(t *testing.T) {
|
||||
`misses_total`: "1",
|
||||
`size_entries`: "1",
|
||||
`refresh_runs_total`: runs,
|
||||
`refreshs`: "1",
|
||||
`refreshs_total`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" && runs == "31" {
|
||||
t.Fatalf("Metrics (-got, +want):\n%s", diff)
|
||||
|
||||
@@ -39,14 +39,14 @@ func (p *Provider) initMetrics() {
|
||||
)
|
||||
p.metrics.peers = p.r.GaugeVec(
|
||||
reporter.GaugeOpts{
|
||||
Name: "peers_total",
|
||||
Name: "peers",
|
||||
Help: "Number of peers up.",
|
||||
},
|
||||
[]string{"exporter"},
|
||||
)
|
||||
p.metrics.routes = p.r.GaugeVec(
|
||||
reporter.GaugeOpts{
|
||||
Name: "routes_total",
|
||||
Name: "routes",
|
||||
Help: "Number of routes up.",
|
||||
},
|
||||
[]string{"exporter"},
|
||||
@@ -77,7 +77,7 @@ func (p *Provider) initMetrics() {
|
||||
Name: "ignored_updates_total",
|
||||
Help: "Number of ignored BGP updates.",
|
||||
},
|
||||
[]string{"exporter", "reason", "error"},
|
||||
[]string{"exporter", "error"},
|
||||
)
|
||||
p.metrics.panics = p.r.CounterVec(
|
||||
reporter.CounterOpts{
|
||||
|
||||
@@ -90,8 +90,8 @@ func TestBMP(t *testing.T) {
|
||||
expectedMetrics := map[string]string{
|
||||
`received_messages_total{exporter="127.0.0.1",type="initiation"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "0",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "0",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -105,8 +105,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="initiation"}`: "1",
|
||||
`received_messages_total{exporter="127.0.0.1",type="termination"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "0",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "0",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -130,8 +130,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="initiation"}`: "1",
|
||||
`received_messages_total{exporter="127.0.0.1",type="termination"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "0",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "0",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
if tries > 0 {
|
||||
@@ -160,8 +160,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "8",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -188,8 +188,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "26",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "18",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "18",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -245,8 +245,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="initiation"}`: "1",
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "17",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "3",
|
||||
`routes_total{exporter="127.0.0.1"}`: "17",
|
||||
`peers{exporter="127.0.0.1"}`: "3",
|
||||
`routes{exporter="127.0.0.1"}`: "17",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -272,8 +272,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "25",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "17",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "17",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -301,8 +301,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "25",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "5",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "3",
|
||||
`routes_total{exporter="127.0.0.1"}`: "14",
|
||||
`peers{exporter="127.0.0.1"}`: "3",
|
||||
`routes{exporter="127.0.0.1"}`: "14",
|
||||
`removed_peers_total{exporter="127.0.0.1"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -356,8 +356,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "25",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -395,8 +395,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "25",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "10",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "10",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -448,8 +448,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "33",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -479,8 +479,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "3",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "1",
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers{exporter="127.0.0.1"}`: "1",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -512,7 +512,7 @@ func TestBMP(t *testing.T) {
|
||||
time.Sleep(20 * time.Millisecond)
|
||||
gotMetrics := r.GetMetrics("akvorado_outlet_routing_provider_bmp_", "routes")
|
||||
expectedMetrics := map[string]string{
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -533,7 +533,7 @@ func TestBMP(t *testing.T) {
|
||||
time.Sleep(20 * time.Millisecond)
|
||||
gotMetrics := r.GetMetrics("akvorado_outlet_routing_provider_bmp_", "routes")
|
||||
expectedMetrics := map[string]string{
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -555,7 +555,7 @@ func TestBMP(t *testing.T) {
|
||||
time.Sleep(20 * time.Millisecond)
|
||||
gotMetrics := r.GetMetrics("akvorado_outlet_routing_provider_bmp_", "routes")
|
||||
expectedMetrics := map[string]string{
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -588,7 +588,7 @@ func TestBMP(t *testing.T) {
|
||||
time.Sleep(20 * time.Millisecond)
|
||||
gotMetrics := r.GetMetrics("akvorado_outlet_routing_provider_bmp_", "routes")
|
||||
expectedMetrics := map[string]string{
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -625,8 +625,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "16",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -658,8 +658,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "41",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -698,8 +698,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "41",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -728,8 +728,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "25",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`routes_total{exporter="127.0.0.1"}`: "17",
|
||||
`peers{exporter="127.0.0.1"}`: "4",
|
||||
`routes{exporter="127.0.0.1"}`: "17",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -788,8 +788,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`closed_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "1",
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers{exporter="127.0.0.1"}`: "1",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -816,8 +816,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`closed_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "0",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "0",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
`removed_peers_total{exporter="127.0.0.1"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -843,15 +843,15 @@ func TestBMP(t *testing.T) {
|
||||
send(t, conn, "bmp-reach-unknown-family.pcap")
|
||||
time.Sleep(20 * time.Millisecond)
|
||||
gotMetrics := r.GetMetrics("akvorado_outlet_routing_provider_bmp_", "-locked_duration")
|
||||
ignoredMetric := `ignored_updates_total{error="unknown route family. AFI: 57, SAFI: 65",exporter="127.0.0.1",reason="afi-safi"}`
|
||||
ignoredMetric := `ignored_updates_total{error="afi-safi",exporter="127.0.0.1"}`
|
||||
expectedMetrics := map[string]string{
|
||||
`received_messages_total{exporter="127.0.0.1",type="initiation"}`: "1",
|
||||
`received_messages_total{exporter="127.0.0.1",type="peer-up-notification"}`: "1",
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "4",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "1",
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers{exporter="127.0.0.1"}`: "1",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
ignoredMetric: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -888,8 +888,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="route-monitoring"}`: "4",
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "1",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "2",
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers{exporter="127.0.0.1"}`: "2",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
`ignored_nlri_total{exporter="127.0.0.1",type="l2vpn-vpls"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -922,8 +922,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "2",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "2",
|
||||
`closed_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "2",
|
||||
`routes_total{exporter="127.0.0.1"}`: "4",
|
||||
`peers{exporter="127.0.0.1"}`: "2",
|
||||
`routes{exporter="127.0.0.1"}`: "4",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
t.Errorf("Metrics (-got, +want):\n%s", diff)
|
||||
@@ -952,8 +952,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "2",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "2",
|
||||
`closed_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "1",
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers{exporter="127.0.0.1"}`: "1",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
`removed_peers_total{exporter="127.0.0.1"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -982,8 +982,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "2",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "2",
|
||||
`closed_connections_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers_total{exporter="127.0.0.1"}`: "1",
|
||||
`routes_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers{exporter="127.0.0.1"}`: "1",
|
||||
`routes{exporter="127.0.0.1"}`: "2",
|
||||
`removed_peers_total{exporter="127.0.0.1"}`: "1",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -1005,8 +1005,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "2",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "2",
|
||||
`closed_connections_total{exporter="127.0.0.1"}`: "2",
|
||||
`peers_total{exporter="127.0.0.1"}`: "0",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "0",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
`removed_peers_total{exporter="127.0.0.1"}`: "2",
|
||||
}
|
||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
||||
@@ -1063,8 +1063,8 @@ func TestBMP(t *testing.T) {
|
||||
`received_messages_total{exporter="127.0.0.1",type="statistics-report"}`: "4",
|
||||
`opened_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`closed_connections_total{exporter="127.0.0.1"}`: "1",
|
||||
`peers_total{exporter="127.0.0.1"}`: "0",
|
||||
`routes_total{exporter="127.0.0.1"}`: "0",
|
||||
`peers{exporter="127.0.0.1"}`: "0",
|
||||
`routes{exporter="127.0.0.1"}`: "0",
|
||||
`removed_peers_total{exporter="127.0.0.1"}`: "4",
|
||||
`removed_partial_peers_total{exporter="127.0.0.1"}`: fmt.Sprintf("%d", peerRemovalPartial),
|
||||
}
|
||||
|
||||
@@ -149,22 +149,22 @@ func (p *Provider) serveConnection(conn *net.TCPConn) error {
|
||||
if ok {
|
||||
switch msgError.ErrorHandling {
|
||||
case bgp.ERROR_HANDLING_SESSION_RESET:
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "session-reset", err.Error()).Inc()
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "session-reset").Inc()
|
||||
continue
|
||||
case bgp.ERROR_HANDLING_AFISAFI_DISABLE:
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "afi-safi", err.Error()).Inc()
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "afi-safi").Inc()
|
||||
continue
|
||||
case bgp.ERROR_HANDLING_TREAT_AS_WITHDRAW:
|
||||
// This is a pickle. This can be an essential attribute (eg.
|
||||
// AS path) that's malformed or something quite minor for
|
||||
// our own usage (eg. a non-optional attribute), let's skip for now.
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "treat-as-withdraw", err.Error()).Inc()
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "treat-as-withdraw").Inc()
|
||||
continue
|
||||
case bgp.ERROR_HANDLING_ATTRIBUTE_DISCARD:
|
||||
// Optional attribute, let's handle it
|
||||
case bgp.ERROR_HANDLING_NONE:
|
||||
// Odd?
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "none", err.Error()).Inc()
|
||||
p.metrics.ignored.WithLabelValues(exporterStr, "none").Inc()
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user