github.com/cilium/cilium@v1.16.2/pkg/hubble/metrics/drop/handler_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Hubble
     3  
     4  package drop
     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 TestDropHandler(t *testing.T) {
    20  	registry := prometheus.NewRegistry()
    21  	opts := api.Options{"sourceContext": "namespace", "destinationContext": "namespace"}
    22  
    23  	dropHandler := &dropHandler{}
    24  
    25  	t.Run("Init", func(t *testing.T) {
    26  		require.NoError(t, dropHandler.Init(registry, opts))
    27  	})
    28  
    29  	t.Run("Status", func(t *testing.T) {
    30  		require.Equal(t, "destination=namespace,source=namespace", dropHandler.Status())
    31  	})
    32  
    33  	t.Run("ProcessFlow_ShouldReportNothingForForwardedFlow", func(t *testing.T) {
    34  		flow := &pb.Flow{
    35  			EventType: &pb.CiliumEventType{Type: monitorAPI.MessageTypePolicyVerdict},
    36  			L4: &pb.Layer4{
    37  				Protocol: &pb.Layer4_TCP{
    38  					TCP: &pb.TCP{},
    39  				},
    40  			},
    41  			Source:      &pb.Endpoint{Namespace: "foo"},
    42  			Destination: &pb.Endpoint{Namespace: "bar"},
    43  			Verdict:     pb.Verdict_FORWARDED,
    44  		}
    45  		dropHandler.ProcessFlow(context.TODO(), flow)
    46  
    47  		metricFamilies, err := registry.Gather()
    48  		require.NoError(t, err)
    49  		require.Empty(t, metricFamilies)
    50  
    51  	})
    52  
    53  	t.Run("ProcessFlow_ShouldReportDroppedFlow", func(t *testing.T) {
    54  		flow := &pb.Flow{
    55  			EventType: &pb.CiliumEventType{Type: monitorAPI.MessageTypePolicyVerdict},
    56  			L4: &pb.Layer4{
    57  				Protocol: &pb.Layer4_TCP{
    58  					TCP: &pb.TCP{},
    59  				},
    60  			},
    61  			Source:         &pb.Endpoint{Namespace: "foo"},
    62  			Destination:    &pb.Endpoint{Namespace: "bar"},
    63  			Verdict:        pb.Verdict_DROPPED,
    64  			DropReason:     uint32(pb.DropReason_POLICY_DENIED),
    65  			DropReasonDesc: pb.DropReason_POLICY_DENIED,
    66  		}
    67  		dropHandler.ProcessFlow(context.TODO(), flow)
    68  
    69  		metricFamilies, err := registry.Gather()
    70  		require.NoError(t, err)
    71  
    72  		assert.Equal(t, "hubble_drop_total", *metricFamilies[0].Name)
    73  		require.Len(t, metricFamilies[0].Metric, 1)
    74  		metric := metricFamilies[0].Metric[0]
    75  
    76  		assert.Equal(t, "destination", *metric.Label[0].Name)
    77  		assert.Equal(t, "bar", *metric.Label[0].Value)
    78  
    79  		assert.Equal(t, "protocol", *metric.Label[1].Name)
    80  		assert.Equal(t, "TCP", *metric.Label[1].Value)
    81  
    82  		assert.Equal(t, "reason", *metric.Label[2].Name)
    83  		assert.Equal(t, "POLICY_DENIED", *metric.Label[2].Value)
    84  
    85  		assert.Equal(t, "source", *metric.Label[3].Name)
    86  		assert.Equal(t, "foo", *metric.Label[3].Value)
    87  
    88  		assert.Equal(t, 1., *metric.Counter.Value)
    89  
    90  		//send another flow with same labels
    91  		dropHandler.ProcessFlow(context.TODO(), flow)
    92  		metricFamilies, _ = registry.Gather()
    93  		metric = metricFamilies[0].Metric[0]
    94  		assert.Equal(t, 2., *metric.Counter.Value)
    95  	})
    96  }