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:
Vincent Bernat
2025-07-20 17:35:46 +02:00
parent dc23ae3c21
commit 4c0b15e1cd
15 changed files with 187 additions and 170 deletions

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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",

View File

@@ -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)
}

View File

@@ -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",
}

View File

@@ -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

View File

@@ -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(

View File

@@ -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)

View File

@@ -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{

View File

@@ -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),
}

View File

@@ -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 {