@@ -31,7 +31,8 @@ type MetricService struct {
31
31
tokens map [string ]string
32
32
metricsLock * sync.Mutex
33
33
34
- sdkUsage counter
34
+ sdkUsage counter
35
+ metricsForwarded counter
35
36
}
36
37
37
38
// NewMetricService creates a MetricService
@@ -59,10 +60,18 @@ func NewMetricService(l log.Logger, addr string, accountID string, tokens map[st
59
60
Name : "ff_proxy_sdk_usage" ,
60
61
Help : "Tracks what SDKs are using the FF Proxy" ,
61
62
},
62
- []string {"envID" , "sdk_type" , "sdk_version" , "sdk_language" }),
63
+ []string {"envID" , "sdk_type" , "sdk_version" , "sdk_language" },
64
+ ),
65
+ metricsForwarded : prometheus .NewCounterVec (
66
+ prometheus.CounterOpts {
67
+ Name : "ff_proxy_metrics_forwarded" ,
68
+ Help : "Tracks the number of metrics forwarded from the Proxy to SaaS Feature Flags" ,
69
+ },
70
+ []string {"envID" , "error" },
71
+ ),
63
72
}
64
73
65
- reg .MustRegister (m .sdkUsage )
74
+ reg .MustRegister (m .sdkUsage , m . metricsForwarded )
66
75
return m , nil
67
76
}
68
77
@@ -111,23 +120,42 @@ func (m MetricService) SendMetrics(ctx context.Context, clusterIdentifier string
111
120
m .metricsLock .Unlock ()
112
121
113
122
for envID , metric := range metricsCopy {
114
- token , ok := m .tokens [envID ]
115
- if ! ok {
116
- m .log .Warn ("No token found for environment. Skipping sending metrics for env." , "environment" , envID )
117
- continue
123
+ if err := m .sendMetrics (ctx , envID , metric , clusterIdentifier ); err != nil {
124
+ m .log .Error ("sending metrics failed" , "environment" , envID , "error" , err )
118
125
}
119
- ctx = context .WithValue (ctx , tokenKey , token )
120
- res , err := m .client .PostMetricsWithResponse (ctx , envID , & clientgen.PostMetricsParams {Cluster : & clusterIdentifier }, clientgen.PostMetricsJSONRequestBody {
121
- MetricsData : metric .MetricsData ,
122
- TargetData : metric .TargetData ,
123
- }, addAuthToken )
126
+ }
127
+
128
+ }
129
+
130
+ func (m MetricService ) sendMetrics (ctx context.Context , envID string , metric domain.MetricsRequest , clusterIdentifier string ) (err error ) {
131
+ defer func () {
132
+ errLabel := "false"
124
133
if err != nil {
125
- m .log .Error ("sending metrics failed" , "error" , err )
126
- }
127
- if res != nil && res .StatusCode () != 200 {
128
- m .log .Error ("sending metrics failed" , "environment" , envID , "status code" , res .StatusCode ())
134
+ errLabel = "true"
129
135
}
136
+ m .metricsForwarded .WithLabelValues (envID , errLabel ).Inc ()
137
+ }()
138
+
139
+ token , ok := m .tokens [envID ]
140
+ if ! ok {
141
+ m .log .Warn ("No token found for environment. Skipping sending metrics for env." , "environment" , envID )
142
+ return nil
143
+ }
144
+
145
+ ctx = context .WithValue (ctx , tokenKey , token )
146
+ res , err := m .client .PostMetricsWithResponse (ctx , envID , & clientgen.PostMetricsParams {Cluster : & clusterIdentifier }, clientgen.PostMetricsJSONRequestBody {
147
+ MetricsData : metric .MetricsData ,
148
+ TargetData : metric .TargetData ,
149
+ }, addAuthToken )
150
+ if err != nil {
151
+ return err
130
152
}
153
+
154
+ if res != nil && res .StatusCode () != 200 {
155
+ return fmt .Errorf ("got non 200 status code from feature flags: status_code=%d" , res .StatusCode ())
156
+ }
157
+
158
+ return nil
131
159
}
132
160
133
161
func addAuthToken (ctx context.Context , req * http.Request ) error {
0 commit comments