Skip to content

Commit fa97d78

Browse files
authored
Merge pull request #564 from LiliC/lili/metrics-generated-op
Add metrics example to the generated operator
2 parents b5dbae5 + 18b2e0b commit fa97d78

File tree

3 files changed

+88
-9
lines changed

3 files changed

+88
-9
lines changed

example/memcached-operator/handler.go.tmpl

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
11
package stub
22

33
import (
4+
"context"
45
"fmt"
56
"reflect"
6-
"context"
77

88
v1alpha1 "github.com/example-inc/memcached-operator/pkg/apis/cache/v1alpha1"
99

1010
"github.com/operator-framework/operator-sdk/pkg/sdk"
11+
"github.com/prometheus/client_golang/prometheus"
1112
appsv1 "k8s.io/api/apps/v1"
1213
"k8s.io/api/core/v1"
1314
apierrors "k8s.io/apimachinery/pkg/api/errors"
1415
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1516
"k8s.io/apimachinery/pkg/labels"
1617
)
1718

18-
func NewHandler() sdk.Handler {
19-
return &Handler{}
19+
func NewHandler(m *Metrics) sdk.Handler {
20+
return &Handler{
21+
metrics: m,
22+
}
23+
}
24+
25+
type Metrics struct {
26+
operatorErrors prometheus.Counter
2027
}
2128

2229
type Handler struct {
30+
// Metrics example
31+
metrics *Metrics
2332
}
2433

2534
func (h *Handler) Handle(ctx context.Context, event sdk.Event) error {
@@ -156,3 +165,15 @@ func getPodNames(pods []v1.Pod) []string {
156165
}
157166
return podNames
158167
}
168+
169+
func RegisterOperatorMetrics() (*Metrics, error) {
170+
operatorErrors := prometheus.NewCounter(prometheus.CounterOpts{
171+
Name: "memcached_operator_reconcile_errors_total",
172+
Help: "Number of errors that occurred while reconciling the memcached deployment",
173+
})
174+
err := prometheus.Register(operatorErrors)
175+
if err != nil {
176+
return nil, err
177+
}
178+
return &Metrics{operatorErrors: operatorErrors}, nil
179+
}

pkg/generator/generator_test.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,23 @@ import (
9191
"k8s.io/apimachinery/pkg/api/errors"
9292
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9393
"k8s.io/apimachinery/pkg/runtime/schema"
94+
"github.com/prometheus/client_golang/prometheus"
9495
)
9596
96-
func NewHandler() sdk.Handler {
97-
return &Handler{}
97+
func NewHandler(m *Metrics) sdk.Handler {
98+
return &Handler{
99+
metrics: m,
100+
}
101+
}
102+
103+
type Metrics struct {
104+
operatorErrors prometheus.Counter
98105
}
99106
100107
type Handler struct {
108+
// Metrics example
109+
metrics *Metrics
110+
101111
// Fill me
102112
}
103113
@@ -107,6 +117,8 @@ func (h *Handler) Handle(ctx context.Context, event sdk.Event) error {
107117
err := sdk.Create(newbusyBoxPod(o))
108118
if err != nil && !errors.IsAlreadyExists(err) {
109119
logrus.Errorf("failed to create busybox pod : %v", err)
120+
// increment error metric
121+
h.metrics.operatorErrors.Inc()
110122
return err
111123
}
112124
}
@@ -146,6 +158,18 @@ func newbusyBoxPod(cr *v1alpha1.AppService) *corev1.Pod {
146158
},
147159
}
148160
}
161+
162+
func RegisterOperatorMetrics() (*Metrics, error) {
163+
operatorErrors := prometheus.NewCounter(prometheus.CounterOpts{
164+
Name: "memcached_operator_reconcile_errors_total",
165+
Help: "Number of errors that occurred while reconciling the memcached deployment",
166+
})
167+
err := prometheus.Register(operatorErrors)
168+
if err != nil {
169+
return nil, err
170+
}
171+
return &Metrics{operatorErrors: operatorErrors}, nil
172+
}
149173
`
150174

151175
func TestGenHandler(t *testing.T) {
@@ -567,6 +591,11 @@ func main() {
567591
printVersion()
568592
569593
sdk.ExposeMetricsPort()
594+
metrics, err := stub.RegisterOperatorMetrics()
595+
if err != nil {
596+
logrus.Errorf("failed to register operator specific metrics: %v", err)
597+
}
598+
h := stub.NewHandler(metrics)
570599
571600
resource := "app.example.com/v1alpha1"
572601
kind := "AppService"
@@ -577,7 +606,7 @@ func main() {
577606
resyncPeriod := time.Duration(5) * time.Second
578607
logrus.Infof("Watching %s, %s, %s, %d", resource, kind, namespace, resyncPeriod)
579608
sdk.Watch(resource, kind, namespace, resyncPeriod)
580-
sdk.Handle(stub.NewHandler())
609+
sdk.Handle(h)
581610
sdk.Run(context.TODO())
582611
}
583612
`

pkg/generator/templates.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ func main() {
153153
printVersion()
154154
155155
sdk.ExposeMetricsPort()
156+
metrics, err := stub.RegisterOperatorMetrics()
157+
if err != nil {
158+
logrus.Errorf("failed to register operator specific metrics: %v", err)
159+
}
160+
h := stub.NewHandler(metrics)
156161
157162
resource := "{{.APIVersion}}"
158163
kind := "{{.Kind}}"
@@ -163,7 +168,7 @@ func main() {
163168
resyncPeriod := time.Duration(5) * time.Second
164169
logrus.Infof("Watching %s, %s, %s, %d", resource, kind, namespace, resyncPeriod)
165170
sdk.Watch(resource, kind, namespace, resyncPeriod)
166-
sdk.Handle(stub.NewHandler())
171+
sdk.Handle(h)
167172
sdk.Run(context.TODO())
168173
}
169174
`
@@ -182,13 +187,23 @@ import (
182187
"k8s.io/apimachinery/pkg/api/errors"
183188
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
184189
"k8s.io/apimachinery/pkg/runtime/schema"
190+
"github.com/prometheus/client_golang/prometheus"
185191
)
186192
187-
func NewHandler() sdk.Handler {
188-
return &Handler{}
193+
func NewHandler(m *Metrics) sdk.Handler {
194+
return &Handler{
195+
metrics: m,
196+
}
197+
}
198+
199+
type Metrics struct {
200+
operatorErrors prometheus.Counter
189201
}
190202
191203
type Handler struct {
204+
// Metrics example
205+
metrics *Metrics
206+
192207
// Fill me
193208
}
194209
@@ -198,6 +213,8 @@ func (h *Handler) Handle(ctx context.Context, event sdk.Event) error {
198213
err := sdk.Create(newbusyBoxPod(o))
199214
if err != nil && !errors.IsAlreadyExists(err) {
200215
logrus.Errorf("failed to create busybox pod : %v", err)
216+
// increment error metric
217+
h.metrics.operatorErrors.Inc()
201218
return err
202219
}
203220
}
@@ -237,6 +254,18 @@ func newbusyBoxPod(cr *{{.Version}}.{{.Kind}}) *corev1.Pod {
237254
},
238255
}
239256
}
257+
258+
func RegisterOperatorMetrics() (*Metrics, error) {
259+
operatorErrors := prometheus.NewCounter(prometheus.CounterOpts{
260+
Name: "memcached_operator_reconcile_errors_total",
261+
Help: "Number of errors that occurred while reconciling the memcached deployment",
262+
})
263+
err := prometheus.Register(operatorErrors)
264+
if err != nil {
265+
return nil, err
266+
}
267+
return &Metrics{operatorErrors: operatorErrors}, nil
268+
}
240269
`
241270

242271
const gopkgTomlTmpl = `

0 commit comments

Comments
 (0)