Skip to content
This repository was archived by the owner on Nov 7, 2019. It is now read-only.

Commit db0e6f9

Browse files
author
Chris Krough
committed
expose prometheus metrics endpoint
- expose simple metrics via promhttp handler at /metrics - move operator and metrics handler into goroutines Signed-off-by: Chris Krough <[email protected]>
1 parent 5c02534 commit db0e6f9

File tree

1 file changed

+41
-11
lines changed

1 file changed

+41
-11
lines changed

pkg/server/server.go

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package server
22

33
import (
4+
"fmt"
5+
"net/http"
6+
47
awsscheme "github.com/awslabs/aws-service-operator/pkg/client/clientset/versioned/scheme"
58
"github.com/awslabs/aws-service-operator/pkg/config"
69
opBase "github.com/awslabs/aws-service-operator/pkg/operators/base"
@@ -9,6 +12,8 @@ import (
912
"k8s.io/client-go/kubernetes/scheme"
1013
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
1114
"k8s.io/client-go/tools/record"
15+
16+
"github.com/prometheus/client_golang/prometheus/promhttp"
1217
)
1318

1419
const controllerName = "aws-service-operator"
@@ -20,25 +25,50 @@ func New(config *config.Config) *Server {
2025
}
2126
}
2227

23-
// Run starts the server to listen to Kubernetes
24-
func (c *Server) Run(stopChan chan struct{}) {
25-
config := c.Config
26-
logger := config.Logger
27-
logger.Info("getting kubernetes context")
28+
func (c *Server) exposeMetrics(errChan chan error) {
29+
http.Handle("/metrics", promhttp.Handler())
30+
err := http.ListenAndServe(":9090", nil)
31+
if err != nil {
32+
errChan <- fmt.Errorf("unable to expose metrics: %v", err)
33+
}
34+
}
2835

36+
func (c *Server) watchOperatorResources(errChan chan error, stopChan chan struct{}) {
37+
38+
logger := c.Config.Logger
39+
40+
logger.Info("getting kubernetes context")
2941
awsscheme.AddToScheme(scheme.Scheme)
3042
eventBroadcaster := record.NewBroadcaster()
3143
eventBroadcaster.StartLogging(logger.Infof)
32-
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: config.KubeClientset.CoreV1().Events("")})
44+
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: c.Config.KubeClientset.CoreV1().Events("")})
3345
recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerName})
34-
config.Recorder = recorder
46+
c.Config.Recorder = recorder
3547

3648
// start watching the aws operator resources
37-
logger.WithFields(logrus.Fields{"resources": config.Resources}).Info("Watching")
38-
39-
operators := opBase.New(config) // TODO: remove context and Clientset
49+
logger.WithFields(logrus.Fields{"resources": c.Config.Resources}).Info("Watching")
50+
operators := opBase.New(c.Config) // TODO: remove context and Clientset
4051
err := operators.Watch(corev1.NamespaceAll, stopChan)
4152
if err != nil {
42-
logger.Infof("error watching operators '%s'\n", err)
53+
errChan <- fmt.Errorf("unable to watch resources: %v", err)
4354
}
4455
}
56+
57+
// Run starts the server to listen to Kubernetes
58+
func (c *Server) Run(stopChan chan struct{}) {
59+
config := c.Config
60+
logger := config.Logger
61+
errChan := make(chan error, 1)
62+
63+
logger.Info("starting metrics server")
64+
go c.exposeMetrics(errChan)
65+
66+
logger.Info("starting resource watcher")
67+
go c.watchOperatorResources(errChan, stopChan)
68+
69+
err := <-errChan
70+
if err != nil {
71+
logger.Fatal(err)
72+
}
73+
74+
}

0 commit comments

Comments
 (0)