Skip to content

Commit 3d06360

Browse files
authored
Improve performance - prevent sending the same state to Otterize cloud more than once (#312)
1 parent 041c201 commit 3d06360

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

src/mapper/pkg/metrics_collection_traffic/metrics_collection_traffic_handler.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import (
1212
"k8s.io/apimachinery/pkg/types"
1313
ctrl "sigs.k8s.io/controller-runtime"
1414
"sigs.k8s.io/controller-runtime/pkg/client"
15+
"sync"
1516
)
1617

1718
type MetricsCollectionTrafficHandler struct {
1819
client.Client
1920
serviceIdResolver *serviceidresolver.Resolver
2021
otterizeCloud cloudclient.CloudClient
2122
cache *MetricsCollectionTrafficCache
23+
reportToCloudLock sync.Mutex
2224
}
2325

2426
func NewMetricsCollectionTrafficHandler(client client.Client, serviceIdResolver *serviceidresolver.Resolver, otterizeCloud cloudclient.CloudClient) *MetricsCollectionTrafficHandler {
@@ -108,6 +110,9 @@ func (r *MetricsCollectionTrafficHandler) HandleAllServicesInNamespace(ctx conte
108110
}
109111

110112
func (r *MetricsCollectionTrafficHandler) reportToCloud(ctx context.Context, namespace string, reason cloudclient.EligibleForMetricsCollectionReason, pods []cloudclient.K8sResourceEligibleForMetricsCollectionInput) error {
113+
r.reportToCloudLock.Lock()
114+
defer r.reportToCloudLock.Unlock()
115+
111116
// Remove duplicates - in case we have multiple pods that indicates on the same workload
112117
pods = lo.UniqBy(pods, func(item cloudclient.K8sResourceEligibleForMetricsCollectionInput) string {
113118
return item.Name

src/mapper/pkg/resourcevisibility/svc_reconciler.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"sigs.k8s.io/controller-runtime/pkg/client"
2121
"sigs.k8s.io/controller-runtime/pkg/controller"
2222
"slices"
23+
"sync"
2324
"time"
2425
)
2526

@@ -29,6 +30,7 @@ type ServiceReconciler struct {
2930
otterizeCloud cloudclient.CloudClient
3031
kubeFinder KubeFinder
3132
namespaceToReportedServicesCache *expirable.LRU[string, []byte]
33+
reportToCloudLock sync.Mutex
3234
}
3335

3436
type KubeFinder interface {
@@ -80,6 +82,9 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
8082
return ctrl.Result{}, errors.Wrap(err)
8183
}
8284

85+
r.reportToCloudLock.Lock()
86+
defer r.reportToCloudLock.Unlock()
87+
8388
hashSum, err := r.getCachedValue(servicesToReport)
8489
if err != nil {
8590
return ctrl.Result{}, errors.Wrap(err)

src/mapper/pkg/webhook_traffic/webhook_services_handler.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
k8serrors "k8s.io/apimachinery/pkg/api/errors"
1515
"k8s.io/apimachinery/pkg/types"
1616
"sigs.k8s.io/controller-runtime/pkg/client"
17+
"sync"
1718
"time"
1819
)
1920

@@ -23,9 +24,10 @@ type KubeFinder interface {
2324

2425
type WebhookServicesHandler struct {
2526
client.Client
26-
otterizeCloud cloudclient.CloudClient
27-
kubeFinder KubeFinder
28-
cache *WebhookServicesCache
27+
otterizeCloud cloudclient.CloudClient
28+
kubeFinder KubeFinder
29+
cache *WebhookServicesCache
30+
reportToCloudLock sync.Mutex
2931
}
3032

3133
func NewWebhookServicesHandler(client client.Client, otterizeCloud cloudclient.CloudClient, kubeFinder KubeFinder) *WebhookServicesHandler {
@@ -67,6 +69,9 @@ func (h *WebhookServicesHandler) HandleAll(ctx context.Context) error {
6769
}
6870

6971
func (h *WebhookServicesHandler) reportToCloud(ctx context.Context, allWebhookServices []cloudclient.K8sWebhookServiceInput) error {
72+
h.reportToCloudLock.Lock()
73+
defer h.reportToCloudLock.Unlock()
74+
7075
// dedup
7176
allWebhookServices = lo.UniqBy(allWebhookServices, K8sWebhookServiceInputKey)
7277

0 commit comments

Comments
 (0)