...

Source file src/github.com/datawire/ambassador/v2/pkg/agent/agent_metrics_test.go

Documentation: github.com/datawire/ambassador/v2/pkg/agent

     1  package agent
     2  
     3  import (
     4  	"github.com/datawire/ambassador/v2/pkg/api/agent"
     5  	envoyMetrics "github.com/datawire/ambassador/v2/pkg/api/envoy/service/metrics/v3"
     6  	"github.com/datawire/dlib/dlog"
     7  	io_prometheus_client "github.com/prometheus/client_model/go"
     8  	"github.com/stretchr/testify/assert"
     9  	"google.golang.org/grpc/peer"
    10  	"net"
    11  	"testing"
    12  	"time"
    13  )
    14  
    15  var (
    16  	counterType    = io_prometheus_client.MetricType_COUNTER
    17  	acceptedMetric = &io_prometheus_client.MetricFamily{
    18  		Name: StrToPointer("cluster.apple_prod_443.upstream_rq_total"),
    19  		Type: &counterType,
    20  		Metric: []*io_prometheus_client.Metric{
    21  			{
    22  				Counter: &io_prometheus_client.Counter{
    23  					Value: Float64ToPointer(42),
    24  				},
    25  				TimestampMs: Int64ToPointer(time.Now().Unix() * 1000),
    26  			},
    27  		},
    28  	}
    29  	ignoredMetric = &io_prometheus_client.MetricFamily{
    30  		Name: StrToPointer("cluster.apple_prod_443.metric_to_ignore"),
    31  		Type: &counterType,
    32  		Metric: []*io_prometheus_client.Metric{
    33  			{
    34  				Counter: &io_prometheus_client.Counter{
    35  					Value: Float64ToPointer(42),
    36  				},
    37  				TimestampMs: Int64ToPointer(time.Now().Unix() * 1000),
    38  			},
    39  		},
    40  	}
    41  )
    42  
    43  func agentMetricsSetupTest() (*MockClient, *Agent) {
    44  	clientMock := &MockClient{}
    45  
    46  	stubbedAgent := &Agent{
    47  		metricsBackoffUntil: time.Time{},
    48  		comm: &RPCComm{
    49  			client: clientMock,
    50  		},
    51  		aggregatedMetrics: map[string][]*io_prometheus_client.MetricFamily{},
    52  	}
    53  
    54  	return clientMock, stubbedAgent
    55  }
    56  
    57  func TestMetricsRelayHandler(t *testing.T) {
    58  
    59  	t.Run("will relay metrics from the stack", func(t *testing.T) {
    60  		//given
    61  		clientMock, stubbedAgent := agentMetricsSetupTest()
    62  		ctx := peer.NewContext(dlog.NewTestContext(t, true), &peer.Peer{
    63  			Addr: &net.IPAddr{
    64  				IP: net.ParseIP("192.168.0.1"),
    65  			},
    66  		})
    67  		stubbedAgent.aggregatedMetrics["192.168.0.1"] = []*io_prometheus_client.MetricFamily{acceptedMetric}
    68  
    69  		//when
    70  		stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
    71  			Identifier: nil,
    72  			// ignored since time to report.
    73  			EnvoyMetrics: []*io_prometheus_client.MetricFamily{ignoredMetric, acceptedMetric},
    74  		})
    75  
    76  		//then
    77  		assert.Equal(t, []*agent.StreamMetricsMessage{{
    78  			EnvoyMetrics: []*io_prometheus_client.MetricFamily{acceptedMetric},
    79  		}}, clientMock.SentMetrics, "metrics should be propagated to cloud")
    80  	})
    81  	t.Run("will not relay the metrics since it is in cool down period.", func(t *testing.T) {
    82  		//given
    83  		clientMock, stubbedAgent := agentMetricsSetupTest()
    84  		ctx := peer.NewContext(dlog.NewTestContext(t, true), &peer.Peer{
    85  			Addr: &net.IPAddr{
    86  				IP: net.ParseIP("192.168.0.1"),
    87  			},
    88  		})
    89  		stubbedAgent.metricsBackoffUntil = time.Now().Add(defaultMinReportPeriod)
    90  
    91  		//when
    92  		stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
    93  			Identifier:   nil,
    94  			EnvoyMetrics: []*io_prometheus_client.MetricFamily{acceptedMetric},
    95  		})
    96  
    97  		//then
    98  		assert.Equal(t, stubbedAgent.aggregatedMetrics["192.168.0.1"],
    99  			[]*io_prometheus_client.MetricFamily{acceptedMetric},
   100  			"metrics should be added to the stack")
   101  		assert.Equal(t, 0, len(clientMock.SentMetrics), "nothing send to cloud")
   102  	})
   103  	t.Run("peer IP is not available", func(t *testing.T) {
   104  		// given
   105  		clientMock, stubbedAgent := agentMetricsSetupTest()
   106  		ctx := dlog.NewTestContext(t, true)
   107  
   108  		//when
   109  		stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
   110  			Identifier:   nil,
   111  			EnvoyMetrics: []*io_prometheus_client.MetricFamily{acceptedMetric},
   112  		})
   113  
   114  		//then
   115  		assert.Equal(t, 0, len(stubbedAgent.aggregatedMetrics), "no metrics")
   116  		assert.Equal(t, 0, len(clientMock.SentMetrics), "nothing send to cloud")
   117  	})
   118  	t.Run("not metrics available in aggregatedMetrics", func(t *testing.T) {
   119  		// given
   120  		clientMock, stubbedAgent := agentMetricsSetupTest()
   121  		ctx := peer.NewContext(dlog.NewTestContext(t, true), &peer.Peer{
   122  			Addr: &net.IPAddr{
   123  				IP: net.ParseIP("192.168.0.1"),
   124  			},
   125  		})
   126  
   127  		//when
   128  		stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
   129  			Identifier:   nil,
   130  			EnvoyMetrics: []*io_prometheus_client.MetricFamily{},
   131  		})
   132  
   133  		//then
   134  		assert.Equal(t, 0, len(stubbedAgent.aggregatedMetrics), "no metrics")
   135  		assert.Equal(t, 0, len(clientMock.SentMetrics), "nothing send to cloud")
   136  	})
   137  }
   138  

View as plain text