Skip to content

Commit 071f38c

Browse files
committed
fix the stopping
1 parent bf97c66 commit 071f38c

File tree

3 files changed

+73
-22
lines changed

3 files changed

+73
-22
lines changed

cmd/otel-allocator/watcher/promOperator.go

+52-15
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,9 @@ import (
1818
"context"
1919
"fmt"
2020
"log/slog"
21-
"os"
2221
"time"
2322

2423
"github.com/blang/semver/v4"
25-
"github.com/go-kit/log"
26-
"github.com/go-kit/log/level"
2724
"github.com/go-logr/logr"
2825
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
2926
promv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1"
@@ -53,6 +50,7 @@ const (
5350
)
5451

5552
func NewPrometheusCRWatcher(ctx context.Context, logger logr.Logger, cfg allocatorconfig.Config) (*PrometheusCRWatcher, error) {
53+
slogger := slog.New(logr.ToSlogHandler(logger))
5654
var resourceSelector *prometheus.ResourceSelector
5755
mClient, err := monitoringclient.NewForConfig(cfg.ClusterConfig)
5856
if err != nil {
@@ -92,9 +90,7 @@ func NewPrometheusCRWatcher(ctx context.Context, logger logr.Logger, cfg allocat
9290
},
9391
}
9492

95-
promOperatorLogger := level.NewFilter(log.NewLogfmtLogger(os.Stderr), level.AllowWarn())
96-
promOperatorSlogLogger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelWarn}))
97-
generator, err := prometheus.NewConfigGenerator(promOperatorLogger, prom, true)
93+
generator, err := prometheus.NewConfigGenerator(slogger, prom, prometheus.WithEndpointSliceSupport())
9894

9995
if err != nil {
10096
return nil, err
@@ -112,21 +108,21 @@ func NewPrometheusCRWatcher(ctx context.Context, logger logr.Logger, cfg allocat
112108
logger.Error(err, "Retrying namespace informer creation in promOperator CRD watcher")
113109
return true
114110
}, func() error {
115-
nsMonInf, err = getNamespaceInformer(ctx, map[string]struct{}{v1.NamespaceAll: {}}, promOperatorLogger, clientset, operatorMetrics)
111+
nsMonInf, err = getNamespaceInformer(ctx, map[string]struct{}{v1.NamespaceAll: {}}, slogger, clientset, operatorMetrics)
116112
return err
117113
})
118114
if getNamespaceInformerErr != nil {
119115
logger.Error(getNamespaceInformerErr, "Failed to create namespace informer in promOperator CRD watcher")
120116
return nil, getNamespaceInformerErr
121117
}
122118

123-
resourceSelector, err = prometheus.NewResourceSelector(promOperatorSlogLogger, prom, store, nsMonInf, operatorMetrics, eventRecorder)
119+
resourceSelector, err = prometheus.NewResourceSelector(slogger, prom, store, nsMonInf, operatorMetrics, eventRecorder)
124120
if err != nil {
125121
logger.Error(err, "Failed to create resource selector in promOperator CRD watcher")
126122
}
127123

128124
return &PrometheusCRWatcher{
129-
logger: logger,
125+
logger: slogger,
130126
kubeMonitoringClient: mClient,
131127
k8sClient: clientset,
132128
informers: monitoringInformers,
@@ -145,7 +141,7 @@ func NewPrometheusCRWatcher(ctx context.Context, logger logr.Logger, cfg allocat
145141
}
146142

147143
type PrometheusCRWatcher struct {
148-
logger logr.Logger
144+
logger *slog.Logger
149145
kubeMonitoringClient monitoringclient.Interface
150146
k8sClient kubernetes.Interface
151147
informers map[string]*informers.ForResource
@@ -162,7 +158,7 @@ type PrometheusCRWatcher struct {
162158
store *assets.StoreBuilder
163159
}
164160

165-
func getNamespaceInformer(ctx context.Context, allowList map[string]struct{}, promOperatorLogger log.Logger, clientset kubernetes.Interface, operatorMetrics *operator.Metrics) (cache.SharedIndexInformer, error) {
161+
func getNamespaceInformer(ctx context.Context, allowList map[string]struct{}, promOperatorLogger *slog.Logger, clientset kubernetes.Interface, operatorMetrics *operator.Metrics) (cache.SharedIndexInformer, error) {
166162
kubernetesVersion, err := clientset.Discovery().ServerVersion()
167163
if err != nil {
168164
return nil, err
@@ -252,7 +248,7 @@ func (w *PrometheusCRWatcher) Watch(upstreamEvents chan Event, upstreamErrors ch
252248
} {
253249
sync, err := k8sutil.LabelSelectionHasChanged(old.Labels, cur.Labels, selector)
254250
if err != nil {
255-
w.logger.Error(err, "Failed to check label selection between namespaces while handling namespace updates", "selector", name)
251+
w.logger.Error(err.Error(), "Failed to check label selection between namespaces while handling namespace updates", "selector", name)
256252
return
257253
}
258254

@@ -273,17 +269,20 @@ func (w *PrometheusCRWatcher) Watch(upstreamEvents chan Event, upstreamErrors ch
273269
for name, resource := range w.informers {
274270
resource.Start(w.stopChannel)
275271

276-
if ok := cache.WaitForNamedCacheSync(name, w.stopChannel, resource.HasSynced); !ok {
277-
success = false
272+
if ok := w.WaitForNamedCacheSync(name, resource.HasSynced); !ok {
273+
w.logger.Info("skipping informer", "informer", name)
274+
continue
278275
}
279276

280277
// only send an event notification if there isn't one already
281278
resource.AddEventHandler(cache.ResourceEventHandlerFuncs{
282279
// these functions only write to the notification channel if it's empty to avoid blocking
283280
// if scrape config updates are being rate-limited
284281
AddFunc: func(obj interface{}) {
282+
w.logger.Info("added", "obj", obj)
285283
select {
286284
case notifyEvents <- struct{}{}:
285+
w.logger.Info("added")
287286
default:
288287
}
289288
},
@@ -378,7 +377,7 @@ func (w *PrometheusCRWatcher) LoadConfig(ctx context.Context) (*promconfig.Confi
378377
"",
379378
nil,
380379
nil,
381-
monitoringv1.TSDBSpec{},
380+
&monitoringv1.TSDBSpec{},
382381
nil,
383382
nil,
384383
serviceMonitorInstances,
@@ -415,3 +414,41 @@ func (w *PrometheusCRWatcher) LoadConfig(ctx context.Context) (*promconfig.Confi
415414
return promCfg, nil
416415
}
417416
}
417+
418+
// WaitForNamedCacheSync adds a timeout to the informer's wait for the cache to be ready.
419+
// If the PrometheusCRWatcher is unable to load an informer within 15 seconds, the method is
420+
// cancelled and returns false. A successful informer load will return true. This method also
421+
// will be cancelled if the target allocator's stopChannel is called before it returns.
422+
//
423+
// This method is inspired by the upstream prometheus-operator implementation, with a shorter timeout
424+
// and support for the PrometheusCRWatcher's stopChannel.
425+
// https://github.com/prometheus-operator/prometheus-operator/blob/293c16c854ce69d1da9fdc8f0705de2d67bfdbfa/pkg/operator/operator.go#L433
426+
func (w *PrometheusCRWatcher) WaitForNamedCacheSync(controllerName string, inf cache.InformerSynced) bool {
427+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*15)
428+
t := time.NewTicker(time.Second * 5)
429+
defer t.Stop()
430+
431+
go func() {
432+
for {
433+
select {
434+
case <-t.C:
435+
w.logger.Debug("cache sync not yet completed")
436+
case <-ctx.Done():
437+
return
438+
case <-w.stopChannel:
439+
w.logger.Warn("stop received, shutting down cache syncing")
440+
cancel()
441+
return
442+
}
443+
}
444+
}()
445+
446+
ok := cache.WaitForNamedCacheSync(controllerName, ctx.Done(), inf)
447+
if !ok {
448+
w.logger.Error("failed to sync cache")
449+
} else {
450+
w.logger.Debug("successfully synced cache")
451+
}
452+
453+
return ok
454+
}

go.mod

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module github.com/open-telemetry/opentelemetry-operator
22

3-
go 1.22.0
3+
go 1.23
4+
5+
toolchain go1.23.2
46

57
retract v1.51.0
68

@@ -22,9 +24,9 @@ require (
2224
github.com/openshift/api v0.0.0-20240124164020-e2ce40831f2e
2325
github.com/operator-framework/api v0.27.0
2426
github.com/operator-framework/operator-lib v0.15.0
25-
github.com/prometheus-operator/prometheus-operator v0.76.0
26-
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2
27-
github.com/prometheus-operator/prometheus-operator/pkg/client v0.76.2
27+
github.com/prometheus-operator/prometheus-operator v0.77.2
28+
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.77.2
29+
github.com/prometheus-operator/prometheus-operator/pkg/client v0.77.2
2830
github.com/prometheus/client_golang v1.20.5
2931
github.com/prometheus/common v0.60.0
3032
github.com/prometheus/prometheus v0.54.1
@@ -205,16 +207,16 @@ require (
205207
go.uber.org/atomic v1.11.0 // indirect
206208
golang.org/x/arch v0.8.0 // indirect
207209
golang.org/x/crypto v0.28.0 // indirect
208-
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect
209-
golang.org/x/mod v0.20.0 // indirect
210+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
211+
golang.org/x/mod v0.21.0 // indirect
210212
golang.org/x/net v0.30.0 // indirect
211213
golang.org/x/oauth2 v0.23.0 // indirect
212214
golang.org/x/sync v0.8.0 // indirect
213215
golang.org/x/sys v0.26.0 // indirect
214216
golang.org/x/term v0.25.0 // indirect
215217
golang.org/x/text v0.19.0 // indirect
216218
golang.org/x/time v0.6.0 // indirect
217-
golang.org/x/tools v0.24.0 // indirect
219+
golang.org/x/tools v0.25.0 // indirect
218220
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
219221
google.golang.org/api v0.198.0 // indirect
220222
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect

go.sum

+12
Original file line numberDiff line numberDiff line change
@@ -539,10 +539,16 @@ github.com/prometheus-community/prom-label-proxy v0.11.0 h1:IO02WiiFMfcIqvjhwMbC
539539
github.com/prometheus-community/prom-label-proxy v0.11.0/go.mod h1:lfvrG70XqsxWDrSh1843QXBG0fSg8EbIXmAo8xGsvw8=
540540
github.com/prometheus-operator/prometheus-operator v0.76.0 h1:EjGJiQVF3BUy/iygeRlN6iMBIAySMGZobEm7+7A95pI=
541541
github.com/prometheus-operator/prometheus-operator v0.76.0/go.mod h1:y4PxsSBsOBwK1vXIw9U8DGLi8EptquItyP2IpqUtTGs=
542+
github.com/prometheus-operator/prometheus-operator v0.77.2 h1:HRewl8m49URAOfRTZql2YjjNGZ8+25srcGji5wx/tic=
543+
github.com/prometheus-operator/prometheus-operator v0.77.2/go.mod h1:y2XLK9xQ4ulaAtWmvKDM+hQNl7w2Wv/iE+tuF5Xnb8A=
542544
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2 h1:BpGDC87A2SaxbKgONsFLEX3kRcRJee2aLQbjXsuz0hA=
543545
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2/go.mod h1:Rd8YnCqz+2FYsiGmE2DMlaLjQRB4v2jFNnzCt9YY4IM=
546+
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.77.2 h1:F/MALZ518KfI1zEg+Kg8/uTzoXKDyqw+LNC/5irJlJE=
547+
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.77.2/go.mod h1:D0KY8md81DQKdaR/cXwnhoWB3MYYyc/UjvqE8GFkIvA=
544548
github.com/prometheus-operator/prometheus-operator/pkg/client v0.76.2 h1:yncs8NglhE3hB+viNsabCAF9TBBDOBljHUyxHC5fSGY=
545549
github.com/prometheus-operator/prometheus-operator/pkg/client v0.76.2/go.mod h1:AfbzyEUFxJmSoTiMcgNHHjDKcorBVd9TIwx0viURgEw=
550+
github.com/prometheus-operator/prometheus-operator/pkg/client v0.77.2 h1:rEBVlnqBSkNc6ufXnDu/GtSyS2jL1l6imtufzJUfOXI=
551+
github.com/prometheus-operator/prometheus-operator/pkg/client v0.77.2/go.mod h1:Q+R7L3DIlJ2a8R+W+7wjk0B25Ci/VTy7V07Zvq327x0=
546552
github.com/prometheus/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I=
547553
github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE=
548554
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@@ -706,6 +712,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
706712
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
707713
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI=
708714
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
715+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
716+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
709717
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
710718
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
711719
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -730,6 +738,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91
730738
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
731739
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
732740
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
741+
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
742+
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
733743
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
734744
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
735745
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -931,6 +941,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
931941
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
932942
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
933943
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
944+
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
945+
golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
934946
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
935947
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
936948
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

0 commit comments

Comments
 (0)