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
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
70 stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
71 Identifier: nil,
72
73 EnvoyMetrics: []*io_prometheus_client.MetricFamily{ignoredMetric, acceptedMetric},
74 })
75
76
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
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
92 stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
93 Identifier: nil,
94 EnvoyMetrics: []*io_prometheus_client.MetricFamily{acceptedMetric},
95 })
96
97
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
105 clientMock, stubbedAgent := agentMetricsSetupTest()
106 ctx := dlog.NewTestContext(t, true)
107
108
109 stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
110 Identifier: nil,
111 EnvoyMetrics: []*io_prometheus_client.MetricFamily{acceptedMetric},
112 })
113
114
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
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
128 stubbedAgent.MetricsRelayHandler(ctx, &envoyMetrics.StreamMetricsMessage{
129 Identifier: nil,
130 EnvoyMetrics: []*io_prometheus_client.MetricFamily{},
131 })
132
133
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