@@ -10,7 +10,6 @@ import (
1010 "time"
1111
1212 "github.com/go-chi/chi"
13- "github.com/prometheus/client_golang/prometheus/promhttp"
1413 log "github.com/sirupsen/logrus"
1514 uuid "gopkg.in/satori/go.uuid.v1"
1615
@@ -45,7 +44,9 @@ type ShellOperator struct {
4544 TempDir string
4645
4746 MetricStorage * metric_storage.MetricStorage
48- KubeClient kube.KubernetesClient
47+ // separate metric storage for hook metrics if separate listen port is configured
48+ HookMetricStorage * metric_storage.MetricStorage
49+ KubeClient kube.KubernetesClient
4950
5051 ScheduleManager schedule_manager.ScheduleManager
5152 KubeEventsManager kube_events_manager.KubeEventsManager
@@ -90,11 +91,11 @@ func (op *ShellOperator) WithMetricStorage(metricStorage *metric_storage.MetricS
9091 op .MetricStorage = metricStorage
9192}
9293
94+ // InitMetricStorage creates default MetricStorage object if not set earlier.
9395func (op * ShellOperator ) InitMetricStorage () {
9496 if op .MetricStorage != nil {
9597 return
9698 }
97- // Metric storage.
9899 metricStorage := metric_storage .NewMetricStorage ()
99100 metricStorage .WithContext (op .ctx )
100101 metricStorage .WithPrefix (app .PrometheusMetricsPrefix )
@@ -103,6 +104,20 @@ func (op *ShellOperator) InitMetricStorage() {
103104 op .MetricStorage = metricStorage
104105}
105106
107+ // InitHookMetricStorage creates MetricStorage object
108+ // with new registry to scrape hook metrics on separate port.
109+ func (op * ShellOperator ) InitHookMetricStorage () {
110+ if op .HookMetricStorage != nil {
111+ return
112+ }
113+ metricStorage := metric_storage .NewMetricStorage ()
114+ metricStorage .WithContext (op .ctx )
115+ metricStorage .WithPrefix (app .PrometheusMetricsPrefix )
116+ metricStorage .WithNewRegistry ()
117+ metricStorage .Start ()
118+ op .HookMetricStorage = metricStorage
119+ }
120+
106121// Init does some basic checks and instantiate dependencies
107122//
108123// - check directories
@@ -416,7 +431,7 @@ func (op *ShellOperator) TaskHandleHookRun(t task.Task) queue.TaskResult {
416431 metrics , err := taskHook .Run (hookMeta .BindingType , hookMeta .BindingContext , hookLogLabels )
417432
418433 if err == nil {
419- err = op .MetricStorage .SendBatch (metrics , map [string ]string {
434+ err = op .HookMetricStorage .SendBatch (metrics , map [string ]string {
420435 "hook" : hookMeta .HookName ,
421436 })
422437 }
@@ -674,10 +689,10 @@ func (op *ShellOperator) SetupHttpServerHandles() {
674689 </html>` , app .ListenPort )
675690 })
676691
677- http .Handle ("/metrics" , promhttp .Handler ())
692+ http .Handle ("/metrics" , op . MetricStorage .Handler ())
678693}
679694
680- func (op * ShellOperator ) StartHttpServer (ip string , port string ) error {
695+ func (op * ShellOperator ) StartHttpServer (ip string , port string , mux * http. ServeMux ) error {
681696 address := fmt .Sprintf ("%s:%s" , ip , port )
682697
683698 // Check if port is available
@@ -690,7 +705,7 @@ func (op *ShellOperator) StartHttpServer(ip string, port string) error {
690705 log .Infof ("Listen on %s" , address )
691706
692707 go func () {
693- if err := http .Serve (listener , nil ); err != nil {
708+ if err := http .Serve (listener , mux ); err != nil {
694709 log .Errorf ("Error starting HTTP server: %s" , err )
695710 os .Exit (1 )
696711 }
@@ -699,22 +714,48 @@ func (op *ShellOperator) StartHttpServer(ip string, port string) error {
699714 return nil
700715}
701716
717+ func (op * ShellOperator ) SetupHookMetricStorageAndServer () error {
718+ if op .HookMetricStorage != nil {
719+ return nil
720+ }
721+ if app .HookMetricsListenPort == "" || app .HookMetricsListenPort == app .ListenPort {
722+ // register default prom handler in DefaultServeMux
723+ op .HookMetricStorage = op .MetricStorage
724+ } else {
725+ // create new metric storage for hooks
726+ op .InitHookMetricStorage ()
727+ // Create new ServeMux, serve on custom port
728+ mux := http .NewServeMux ()
729+ err := op .StartHttpServer (app .ListenAddress , app .HookMetricsListenPort , mux )
730+ if err != nil {
731+ return err
732+ }
733+ // register scrape handler
734+ mux .Handle ("/metrics" , op .HookMetricStorage .Handler ())
735+ }
736+ return nil
737+ }
738+
702739func DefaultOperator () * ShellOperator {
703740 operator := NewShellOperator ()
704741 operator .WithContext (context .Background ())
705742 return operator
706743}
707744
708745func InitAndStart (operator * ShellOperator ) error {
709- operator .SetupHttpServerHandles ()
710-
711- err := operator .StartHttpServer (app .ListenAddress , app .ListenPort )
746+ err := operator .StartHttpServer (app .ListenAddress , app .ListenPort , http .DefaultServeMux )
712747 if err != nil {
713748 log .Errorf ("HTTP SERVER start failed: %v" , err )
714749 return err
715750 }
716-
717751 operator .InitMetricStorage ()
752+ operator .SetupHttpServerHandles ()
753+
754+ err = operator .SetupHookMetricStorageAndServer ()
755+ if err != nil {
756+ log .Errorf ("HTTP SERVER for hook metrics start failed: %v" , err )
757+ return err
758+ }
718759
719760 err = operator .Init ()
720761 if err != nil {
0 commit comments