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  }