@@ -11,6 +11,7 @@ import (
11
11
12
12
workspacev1 "github.com/gitpod-io/gitpod/ws-manager/api/crd/v1"
13
13
"github.com/go-logr/logr"
14
+ lru "github.com/hashicorp/golang-lru"
14
15
"github.com/prometheus/client_golang/prometheus"
15
16
"sigs.k8s.io/controller-runtime/pkg/client"
16
17
)
@@ -37,9 +38,17 @@ type controllerMetrics struct {
37
38
38
39
workspacePhases * phaseTotalVec
39
40
timeoutSettings * timeoutSettingsVec
41
+
42
+ // used to prevent recording metrics multiple times
43
+ cache * lru.Cache
40
44
}
41
45
42
- func newControllerMetrics (r * WorkspaceReconciler ) * controllerMetrics {
46
+ func newControllerMetrics (r * WorkspaceReconciler ) (* controllerMetrics , error ) {
47
+ cache , err := lru .New (6000 )
48
+ if err != nil {
49
+ return nil , err
50
+ }
51
+
43
52
return & controllerMetrics {
44
53
startupTimeHistVec : prometheus .NewHistogramVec (prometheus.HistogramOpts {
45
54
Namespace : metricsNamespace ,
@@ -88,14 +97,11 @@ func newControllerMetrics(r *WorkspaceReconciler) *controllerMetrics {
88
97
89
98
workspacePhases : newPhaseTotalVec (r ),
90
99
timeoutSettings : newTimeoutSettingsVec (r ),
91
- }
100
+ cache : cache ,
101
+ }, nil
92
102
}
93
103
94
104
func (m * controllerMetrics ) recordWorkspaceStartupTime (log * logr.Logger , ws * workspacev1.Workspace ) {
95
- if _ , countedAlready := ws .Status .Metrics [workspaceStartupSeconds ]; countedAlready {
96
- return
97
- }
98
-
99
105
class := ws .Spec .Class
100
106
tpe := string (ws .Spec .Type )
101
107
@@ -105,14 +111,9 @@ func (m *controllerMetrics) recordWorkspaceStartupTime(log *logr.Logger, ws *wor
105
111
}
106
112
107
113
hist .Observe (float64 (time .Since (ws .CreationTimestamp .Time ).Seconds ()))
108
- ws .Status .Metrics [workspaceStartupSeconds ] = true
109
114
}
110
115
111
116
func (m * controllerMetrics ) countWorkspaceStartFailures (log * logr.Logger , ws * workspacev1.Workspace ) {
112
- if _ , countedAlready := ws .Status .Metrics [workspaceStartFailuresTotal ]; countedAlready {
113
- return
114
- }
115
-
116
117
class := ws .Spec .Class
117
118
tpe := string (ws .Spec .Type )
118
119
@@ -122,14 +123,9 @@ func (m *controllerMetrics) countWorkspaceStartFailures(log *logr.Logger, ws *wo
122
123
}
123
124
124
125
counter .Inc ()
125
- ws .Status .Metrics [workspaceStartFailuresTotal ] = true
126
126
}
127
127
128
128
func (m * controllerMetrics ) countWorkspaceStop (log * logr.Logger , ws * workspacev1.Workspace ) {
129
- if _ , countedAlready := ws .Status .Metrics [workspaceStopsTotal ]; countedAlready {
130
- return
131
- }
132
-
133
129
class := ws .Spec .Class
134
130
tpe := string (ws .Spec .Type )
135
131
@@ -139,14 +135,9 @@ func (m *controllerMetrics) countWorkspaceStop(log *logr.Logger, ws *workspacev1
139
135
}
140
136
141
137
counter .Inc ()
142
- ws .Status .Metrics [workspaceStopsTotal ] = true
143
138
}
144
139
145
140
func (m * controllerMetrics ) countTotalBackups (log * logr.Logger , ws * workspacev1.Workspace ) {
146
- if _ , countedAlready := ws .Status .Metrics [workspaceBackupsTotal ]; countedAlready {
147
- return
148
- }
149
-
150
141
class := ws .Spec .Class
151
142
tpe := string (ws .Spec .Type )
152
143
@@ -156,14 +147,9 @@ func (m *controllerMetrics) countTotalBackups(log *logr.Logger, ws *workspacev1.
156
147
}
157
148
158
149
counter .Inc ()
159
- ws .Status .Metrics [workspaceBackupsTotal ] = true
160
150
}
161
151
162
152
func (m * controllerMetrics ) countTotalBackupFailures (log * logr.Logger , ws * workspacev1.Workspace ) {
163
- if _ , countedAlready := ws .Status .Metrics [workspaceBackupFailuresTotal ]; countedAlready {
164
- return
165
- }
166
-
167
153
class := ws .Spec .Class
168
154
tpe := string (ws .Spec .Type )
169
155
@@ -173,14 +159,9 @@ func (m *controllerMetrics) countTotalBackupFailures(log *logr.Logger, ws *works
173
159
}
174
160
175
161
counter .Inc ()
176
- ws .Status .Metrics [workspaceBackupFailuresTotal ] = true
177
162
}
178
163
179
164
func (m * controllerMetrics ) countTotalRestores (log * logr.Logger , ws * workspacev1.Workspace ) {
180
- if _ , countedAlready := ws .Status .Metrics [workspaceRestoresTotal ]; countedAlready {
181
- return
182
- }
183
-
184
165
class := ws .Spec .Class
185
166
tpe := string (ws .Spec .Type )
186
167
@@ -190,14 +171,9 @@ func (m *controllerMetrics) countTotalRestores(log *logr.Logger, ws *workspacev1
190
171
}
191
172
192
173
counter .Inc ()
193
- ws .Status .Metrics [workspaceRestoresTotal ] = true
194
174
}
195
175
196
176
func (m * controllerMetrics ) countTotalRestoreFailures (log * logr.Logger , ws * workspacev1.Workspace ) {
197
- if _ , countedAlready := ws .Status .Metrics [workspaceRestoresFailureTotal ]; countedAlready {
198
- return
199
- }
200
-
201
177
class := ws .Spec .Class
202
178
tpe := string (ws .Spec .Type )
203
179
@@ -207,7 +183,24 @@ func (m *controllerMetrics) countTotalRestoreFailures(log *logr.Logger, ws *work
207
183
}
208
184
209
185
counter .Inc ()
210
- ws .Status .Metrics [workspaceRestoresFailureTotal ] = true
186
+ }
187
+
188
+ func (m * controllerMetrics ) rememberWorkspace (ws * workspacev1.Workspace ) {
189
+ m .cache .Add (ws .Name , ws .Status .Phase )
190
+ }
191
+
192
+ func (m * controllerMetrics ) forgetWorkspace (ws * workspacev1.Workspace ) {
193
+ m .cache .Remove (ws .Name )
194
+ }
195
+
196
+ func (m * controllerMetrics ) shouldUpdate (log * logr.Logger , ws * workspacev1.Workspace ) bool {
197
+ p , ok := m .cache .Get (ws .Name )
198
+ if ! ok {
199
+ return false
200
+ }
201
+
202
+ phase := p .(workspacev1.WorkspacePhase )
203
+ return phase != ws .Status .Phase
211
204
}
212
205
213
206
// Describe implements Collector. It will send exactly one Desc to the provided channel.
0 commit comments