@@ -12,6 +12,7 @@ import (
12
12
13
13
workspacev1 "github.com/gitpod-io/gitpod/ws-manager/api/crd/v1"
14
14
"github.com/prometheus/client_golang/prometheus"
15
+ "github.com/prometheus/client_golang/prometheus/collectors"
15
16
"golang.org/x/xerrors"
16
17
"google.golang.org/grpc"
17
18
"k8s.io/apimachinery/pkg/runtime"
@@ -22,6 +23,7 @@ import (
22
23
"k8s.io/client-go/tools/clientcmd"
23
24
ctrl "sigs.k8s.io/controller-runtime"
24
25
"sigs.k8s.io/controller-runtime/pkg/manager"
26
+ "sigs.k8s.io/controller-runtime/pkg/metrics"
25
27
26
28
"github.com/gitpod-io/gitpod/common-go/log"
27
29
"github.com/gitpod-io/gitpod/ws-daemon/api"
@@ -48,7 +50,24 @@ func init() {
48
50
}
49
51
50
52
// NewDaemon produces a new daemon
51
- func NewDaemon (config Config , reg prometheus.Registerer ) (* Daemon , error ) {
53
+ func NewDaemon (config Config ) (* Daemon , error ) {
54
+ // Use the metrics registry from the controller manager. The manager's registry
55
+ // isn't configurable so we use this instead of the baseserver's default registry.
56
+ // Hack: cast the registry as a *prometheus.Registry, as that's the type required
57
+ // by baseserver.
58
+ registry , ok := metrics .Registry .(* prometheus.Registry )
59
+ if ok {
60
+ // These collectors are also registered by baseserver. Use the ones from baseserver
61
+ // and remove the collectors registered by controller-manager, to prevent an error
62
+ // for duplicate collectors.
63
+ registry .Unregister (collectors .NewGoCollector ())
64
+ registry .Unregister (collectors .NewProcessCollector (collectors.ProcessCollectorOpts {}))
65
+ } else {
66
+ log .Error ("failed to use controller-runtime metrics registry, not of expected type. Using default registry instead, but will not collect controller metrics..." )
67
+ registry = prometheus .NewRegistry ()
68
+ }
69
+ wrappedReg := prometheus .WrapRegistererWithPrefix ("gitpod_ws_daemon_" , registry )
70
+
52
71
restCfg , err := newClientConfig (config .Runtime .Kubeconfig )
53
72
if err != nil {
54
73
return nil , err
@@ -71,7 +90,7 @@ func NewDaemon(config Config, reg prometheus.Registerer) (*Daemon, error) {
71
90
return nil , xerrors .Errorf ("NODENAME env var isn't set" )
72
91
}
73
92
74
- markUnmountFallback , err := NewMarkUnmountFallback (reg )
93
+ markUnmountFallback , err := NewMarkUnmountFallback (wrappedReg )
75
94
if err != nil {
76
95
return nil , err
77
96
}
@@ -111,7 +130,7 @@ func NewDaemon(config Config, reg prometheus.Registerer) (*Daemon, error) {
111
130
},
112
131
},
113
132
procV2Plugin ,
114
- cgroup .NewPSIMetrics (reg ),
133
+ cgroup .NewPSIMetrics (wrappedReg ),
115
134
)
116
135
if err != nil {
117
136
return nil , err
@@ -121,18 +140,18 @@ func NewDaemon(config Config, reg prometheus.Registerer) (*Daemon, error) {
121
140
return nil , xerrors .Errorf ("only cgroup v2 is supported" )
122
141
}
123
142
124
- err = reg .Register (cgroupPlugins )
143
+ err = wrappedReg .Register (cgroupPlugins )
125
144
if err != nil {
126
145
return nil , xerrors .Errorf ("cannot register cgroup plugin metrics: %w" , err )
127
146
}
128
147
129
148
listener := []dispatch.Listener {
130
- cpulimit .NewDispatchListener (& config .CPULimit , reg ),
149
+ cpulimit .NewDispatchListener (& config .CPULimit , wrappedReg ),
131
150
markUnmountFallback ,
132
151
cgroupPlugins ,
133
152
}
134
153
135
- netlimiter := netlimit .NewConnLimiter (config .NetLimit , reg )
154
+ netlimiter := netlimit .NewConnLimiter (config .NetLimit , wrappedReg )
136
155
if config .NetLimit .Enabled {
137
156
listener = append (listener , netlimiter )
138
157
}
@@ -154,7 +173,7 @@ func NewDaemon(config Config, reg prometheus.Registerer) (*Daemon, error) {
154
173
Port : 9443 ,
155
174
Namespace : config .Runtime .KubernetesNamespace ,
156
175
HealthProbeBindAddress : "0" ,
157
- MetricsBindAddress : "0" ,
176
+ MetricsBindAddress : "0" , // Metrics are exposed through baseserver.
158
177
})
159
178
if err != nil {
160
179
return nil , err
@@ -172,7 +191,7 @@ func NewDaemon(config Config, reg prometheus.Registerer) (*Daemon, error) {
172
191
UIDMapperConfig : config .Uidmapper ,
173
192
ContainerRuntime : containerRuntime ,
174
193
CGroupMountPoint : config .CPULimit .CGroupBasePath ,
175
- MetricsRegistry : reg ,
194
+ MetricsRegistry : wrappedReg ,
176
195
})
177
196
if err != nil {
178
197
return nil , err
@@ -195,7 +214,7 @@ func NewDaemon(config Config, reg prometheus.Registerer) (*Daemon, error) {
195
214
dsptch .WorkspaceExistsOnNode ,
196
215
& iws.Uidmapper {Config : config .Uidmapper , Runtime : containerRuntime },
197
216
config .CPULimit .CGroupBasePath ,
198
- reg ,
217
+ wrappedReg ,
199
218
)
200
219
if err != nil {
201
220
return nil , xerrors .Errorf ("cannot create content service: %w" , err )
@@ -209,13 +228,14 @@ func NewDaemon(config Config, reg prometheus.Registerer) (*Daemon, error) {
209
228
}
210
229
211
230
return & Daemon {
212
- Config : config ,
213
- dispatch : dsptch ,
214
- content : contentService ,
215
- diskGuards : dsk ,
216
- hosts : hsts ,
217
- configReloader : configReloader ,
218
- mgr : mgr ,
231
+ Config : config ,
232
+ dispatch : dsptch ,
233
+ content : contentService ,
234
+ diskGuards : dsk ,
235
+ hosts : hsts ,
236
+ configReloader : configReloader ,
237
+ mgr : mgr ,
238
+ metricsRegistry : registry ,
219
239
}, nil
220
240
}
221
241
@@ -231,12 +251,13 @@ func newClientConfig(kubeconfig string) (*rest.Config, error) {
231
251
type Daemon struct {
232
252
Config Config
233
253
234
- dispatch * dispatch.Dispatch
235
- content * content.WorkspaceService
236
- diskGuards []* diskguard.Guard
237
- hosts hosts.Controller
238
- configReloader ConfigReloader
239
- mgr ctrl.Manager
254
+ dispatch * dispatch.Dispatch
255
+ content * content.WorkspaceService
256
+ diskGuards []* diskguard.Guard
257
+ hosts hosts.Controller
258
+ configReloader ConfigReloader
259
+ mgr ctrl.Manager
260
+ metricsRegistry * prometheus.Registry
240
261
241
262
cancel context.CancelFunc
242
263
}
@@ -325,3 +346,7 @@ func (d *Daemon) ReadinessProbe() func() error {
325
346
return nil
326
347
}
327
348
}
349
+
350
+ func (d * Daemon ) MetricsRegistry () * prometheus.Registry {
351
+ return d .metricsRegistry
352
+ }
0 commit comments