Skip to content

Commit 8d56d47

Browse files
authored
Merge pull request #152 from harness/FFM-8101
FFM-8101 Add prometheus metric to track forwarding on metrics to SAAS
2 parents 67703d3 + 96a718d commit 8d56d47

File tree

1 file changed

+44
-16
lines changed

1 file changed

+44
-16
lines changed

services/metric_service.go

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ type MetricService struct {
3131
tokens map[string]string
3232
metricsLock *sync.Mutex
3333

34-
sdkUsage counter
34+
sdkUsage counter
35+
metricsForwarded counter
3536
}
3637

3738
// NewMetricService creates a MetricService
@@ -59,10 +60,18 @@ func NewMetricService(l log.Logger, addr string, accountID string, tokens map[st
5960
Name: "ff_proxy_sdk_usage",
6061
Help: "Tracks what SDKs are using the FF Proxy",
6162
},
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+
),
6372
}
6473

65-
reg.MustRegister(m.sdkUsage)
74+
reg.MustRegister(m.sdkUsage, m.metricsForwarded)
6675
return m, nil
6776
}
6877

@@ -111,23 +120,42 @@ func (m MetricService) SendMetrics(ctx context.Context, clusterIdentifier string
111120
m.metricsLock.Unlock()
112121

113122
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)
118125
}
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"
124133
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"
129135
}
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
130152
}
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
131159
}
132160

133161
func addAuthToken(ctx context.Context, req *http.Request) error {

0 commit comments

Comments
 (0)