1
1
package server
2
2
3
3
import (
4
+ "fmt"
5
+ "net/http"
6
+
4
7
awsscheme "github.com/awslabs/aws-service-operator/pkg/client/clientset/versioned/scheme"
5
8
"github.com/awslabs/aws-service-operator/pkg/config"
6
9
opBase "github.com/awslabs/aws-service-operator/pkg/operators/base"
@@ -9,6 +12,8 @@ import (
9
12
"k8s.io/client-go/kubernetes/scheme"
10
13
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
11
14
"k8s.io/client-go/tools/record"
15
+
16
+ "github.com/prometheus/client_golang/prometheus/promhttp"
12
17
)
13
18
14
19
const controllerName = "aws-service-operator"
@@ -20,25 +25,50 @@ func New(config *config.Config) *Server {
20
25
}
21
26
}
22
27
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
+ }
28
35
36
+ func (c * Server ) watchOperatorResources (errChan chan error , stopChan chan struct {}) {
37
+
38
+ logger := c .Config .Logger
39
+
40
+ logger .Info ("getting kubernetes context" )
29
41
awsscheme .AddToScheme (scheme .Scheme )
30
42
eventBroadcaster := record .NewBroadcaster ()
31
43
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 ("" )})
33
45
recorder := eventBroadcaster .NewRecorder (scheme .Scheme , corev1.EventSource {Component : controllerName })
34
- config .Recorder = recorder
46
+ c . Config .Recorder = recorder
35
47
36
48
// 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
40
51
err := operators .Watch (corev1 .NamespaceAll , stopChan )
41
52
if err != nil {
42
- logger . Infof ( "error watching operators '%s' \n " , err )
53
+ errChan <- fmt . Errorf ( "unable to watch resources: %v " , err )
43
54
}
44
55
}
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