github.com/cilium/cilium@v1.16.2/pkg/hubble/metrics/flow/handler_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Hubble 3 4 package flow 5 6 import ( 7 "context" 8 "testing" 9 10 "github.com/prometheus/client_golang/prometheus" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 pb "github.com/cilium/cilium/api/v1/flow" 15 "github.com/cilium/cilium/pkg/hubble/metrics/api" 16 monitorAPI "github.com/cilium/cilium/pkg/monitor/api" 17 ) 18 19 func TestFlowHandler(t *testing.T) { 20 registry := prometheus.NewRegistry() 21 opts := api.Options{"sourceContext": "namespace", "destinationContext": "namespace"} 22 23 h := &flowHandler{} 24 25 t.Run("Init", func(t *testing.T) { 26 require.NoError(t, h.Init(registry, opts)) 27 }) 28 29 t.Run("Status", func(t *testing.T) { 30 require.Equal(t, "destination=namespace,source=namespace", h.Status()) 31 }) 32 33 t.Run("ProcessFlow", func(t *testing.T) { 34 flow1 := &pb.Flow{ 35 EventType: &pb.CiliumEventType{Type: monitorAPI.MessageTypeAccessLog}, 36 L7: &pb.Layer7{ 37 Record: &pb.Layer7_Http{Http: &pb.HTTP{}}, 38 }, 39 Source: &pb.Endpoint{Namespace: "foo"}, 40 Destination: &pb.Endpoint{Namespace: "bar"}, 41 Verdict: pb.Verdict_FORWARDED, 42 } 43 h.ProcessFlow(context.TODO(), flow1) 44 45 metricFamilies, err := registry.Gather() 46 require.NoError(t, err) 47 require.Len(t, metricFamilies, 1) 48 49 assert.Equal(t, "hubble_flows_processed_total", *metricFamilies[0].Name) 50 require.Len(t, metricFamilies[0].Metric, 1) 51 metric := metricFamilies[0].Metric[0] 52 53 assert.Equal(t, "destination", *metric.Label[0].Name) 54 assert.Equal(t, "bar", *metric.Label[0].Value) 55 56 assert.Equal(t, "protocol", *metric.Label[1].Name) 57 assert.Equal(t, "HTTP", *metric.Label[1].Value) 58 59 assert.Equal(t, "source", *metric.Label[2].Name) 60 assert.Equal(t, "foo", *metric.Label[2].Value) 61 62 assert.Equal(t, "subtype", *metric.Label[3].Name) 63 assert.Equal(t, "HTTP", *metric.Label[3].Value) 64 65 assert.Equal(t, "type", *metric.Label[4].Name) 66 assert.Equal(t, "L7", *metric.Label[4].Value) 67 68 assert.Equal(t, "verdict", *metric.Label[5].Name) 69 assert.Equal(t, "FORWARDED", *metric.Label[5].Value) 70 71 flow2 := &pb.Flow{ 72 EventType: &pb.CiliumEventType{ 73 // flow events cannot be derived from agent events 74 Type: monitorAPI.MessageTypeAgent, 75 }, 76 } 77 78 h.ProcessFlow(context.TODO(), flow2) 79 80 metricFamilies, err = registry.Gather() 81 require.NoError(t, err) 82 require.Len(t, metricFamilies, 1) 83 84 assert.Equal(t, "hubble_flows_processed_total", *metricFamilies[0].Name) 85 require.Len(t, metricFamilies[0].Metric, 2) 86 metric = metricFamilies[0].Metric[0] 87 88 assert.Equal(t, "subtype", *metric.Label[3].Name) 89 assert.Equal(t, "130", *metric.Label[3].Value) 90 91 assert.Equal(t, "type", *metric.Label[4].Name) 92 assert.Equal(t, "Unknown", *metric.Label[4].Value) 93 94 flow3 := &pb.Flow{ 95 EventType: &pb.CiliumEventType{ 96 Type: monitorAPI.MessageTypePolicyVerdict, 97 }, 98 L4: &pb.Layer4{ 99 Protocol: &pb.Layer4_UDP{ 100 UDP: &pb.UDP{ 101 DestinationPort: 53, 102 SourcePort: 31313, 103 }, 104 }, 105 }, 106 Verdict: pb.Verdict_DROPPED, 107 } 108 109 h.ProcessFlow(context.TODO(), flow3) 110 111 metricFamilies, err = registry.Gather() 112 require.NoError(t, err) 113 require.Len(t, metricFamilies, 1) 114 115 assert.Equal(t, "hubble_flows_processed_total", *metricFamilies[0].Name) 116 require.Len(t, metricFamilies[0].Metric, 3) 117 metric = metricFamilies[0].Metric[0] 118 119 assert.Equal(t, "protocol", *metric.Label[1].Name) 120 assert.Equal(t, "UDP", *metric.Label[1].Value) 121 122 assert.Equal(t, "subtype", *metric.Label[3].Name) 123 assert.Equal(t, "", *metric.Label[3].Value) 124 125 assert.Equal(t, "type", *metric.Label[4].Name) 126 assert.Equal(t, "PolicyVerdict", *metric.Label[4].Value) 127 128 assert.Equal(t, "verdict", *metric.Label[5].Name) 129 assert.Equal(t, "DROPPED", *metric.Label[5].Value) 130 }) 131 132 }