From 2c4672dee18863dae98228fda9d8fead72f6fec6 Mon Sep 17 00:00:00 2001 From: Tim Mwangi Date: Fri, 24 Feb 2023 07:17:43 -0800 Subject: [PATCH] fix: use a rwlock to avoid concurrent map read and write --- instrumentation/opentelemetry/metrics.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/instrumentation/opentelemetry/metrics.go b/instrumentation/opentelemetry/metrics.go index 014c371..02c2b2d 100644 --- a/instrumentation/opentelemetry/metrics.go +++ b/instrumentation/opentelemetry/metrics.go @@ -2,6 +2,7 @@ package opentelemetry // import "github.com/hypertrace/goagent/instrumentation/o import ( "net/http" + "sync" "github.com/hypertrace/goagent/sdk" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" @@ -23,6 +24,7 @@ const ( type HttpOperationMetricsHandler struct { operationNameGetter func(*http.Request) string counters map[string]instrument.Int64Counter + countersMutex sync.RWMutex } var _ sdk.HttpOperationMetricsHandler = (*HttpOperationMetricsHandler)(nil) @@ -44,6 +46,8 @@ func (mh *HttpOperationMetricsHandler) CreateRequestCount() { otel.Handle(err) } + mh.countersMutex.Lock() + defer mh.countersMutex.Unlock() mh.counters[RequestCount] = requestCountCounter } @@ -53,5 +57,8 @@ func (mh *HttpOperationMetricsHandler) AddToRequestCount(n int64, r *http.Reques labeler, _ := otelhttp.LabelerFromContext(ctx) operationName := mh.operationNameGetter(r) attributes := append(labeler.Get(), semconv.HTTPServerMetricAttributesFromHTTPRequest(operationName, r)...) + + mh.countersMutex.RLock() + defer mh.countersMutex.RUnlock() mh.counters[RequestCount].Add(ctx, n, attributes...) }