github.com/cilium/cilium@v1.16.2/pkg/hubble/metrics/drop/handler.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Hubble 3 4 package drop 5 6 import ( 7 "context" 8 9 "github.com/prometheus/client_golang/prometheus" 10 11 flowpb "github.com/cilium/cilium/api/v1/flow" 12 v1 "github.com/cilium/cilium/pkg/hubble/api/v1" 13 "github.com/cilium/cilium/pkg/hubble/metrics/api" 14 ) 15 16 type dropHandler struct { 17 drops *prometheus.CounterVec 18 context *api.ContextOptions 19 } 20 21 func (d *dropHandler) Init(registry *prometheus.Registry, options api.Options) error { 22 c, err := api.ParseContextOptions(options) 23 if err != nil { 24 return err 25 } 26 d.context = c 27 28 contextLabels := d.context.GetLabelNames() 29 labels := append(contextLabels, "reason", "protocol") 30 31 d.drops = prometheus.NewCounterVec(prometheus.CounterOpts{ 32 Namespace: api.DefaultPrometheusNamespace, 33 Name: "drop_total", 34 Help: "Number of drops", 35 }, labels) 36 37 registry.MustRegister(d.drops) 38 return nil 39 } 40 41 func (d *dropHandler) Status() string { 42 return d.context.Status() 43 } 44 45 func (d *dropHandler) Context() *api.ContextOptions { 46 return d.context 47 } 48 49 func (d *dropHandler) ListMetricVec() []*prometheus.MetricVec { 50 return []*prometheus.MetricVec{d.drops.MetricVec} 51 } 52 53 func (d *dropHandler) ProcessFlow(ctx context.Context, flow *flowpb.Flow) error { 54 if flow.GetVerdict() != flowpb.Verdict_DROPPED { 55 return nil 56 } 57 58 contextLabels, err := d.context.GetLabelValues(flow) 59 if err != nil { 60 return err 61 } 62 63 labels := append(contextLabels, flow.GetDropReasonDesc().String(), v1.FlowProtocol(flow)) 64 65 d.drops.WithLabelValues(labels...).Inc() 66 return nil 67 }