/
main.go
116 lines (102 loc) · 3.14 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"sync"
"syscall"
"github.com/alphagov/paas-prometheus-endpoints/pkg/authenticator"
"github.com/alphagov/paas-prometheus-endpoints/pkg/config"
"github.com/alphagov/paas-prometheus-endpoints/pkg/metric_endpoint"
"github.com/alphagov/paas-prometheus-endpoints/pkg/orgs_fetcher"
"github.com/alphagov/paas-prometheus-endpoints/pkg/service_plans_fetcher"
"github.com/alphagov/paas-prometheus-endpoints/pkg/spaces_fetcher"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/cloudwatch"
"github.com/aws/aws-sdk-go/service/elasticache"
cfclient "github.com/cloudfoundry-community/go-cfclient"
"github.com/gin-gonic/gin"
)
func main() {
ctx, shutdown := context.WithCancel(context.Background())
go func() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
defer signal.Reset(syscall.SIGINT, syscall.SIGTERM)
<-sigChan
shutdown()
}()
var wg sync.WaitGroup
cfg := config.NewConfigFromEnv("redis")
cfClient, err := cfclient.NewClient(cfg.CFClientConfig)
if err != nil {
if err != nil {
cfg.Logger.Error("err-unable-to-initialise-own-cf-client", err)
}
shutdown()
os.Exit(1)
}
servicePlansFetcher := service_plans_fetcher.NewServicePlansFetcher(cfg.ServiceName, cfg.ServicePlanUpdateSchedule, cfg.Logger, cfClient)
wg.Add(1)
go func() {
err := servicePlansFetcher.Run(ctx)
if err != nil {
cfg.Logger.Error("err-fatal-service-plans-fetcher", err)
}
shutdown()
os.Exit(1)
}()
spacesFetcher := spaces_fetcher.NewSpacesFetcher(cfg.SpaceUpdateSchedule, cfg.Logger, cfClient)
wg.Add(1)
go func() {
err := spacesFetcher.Run(ctx)
if err != nil {
cfg.Logger.Error("err-fatal-spaces-fetcher", err)
}
shutdown()
os.Exit(1)
}()
orgsFetcher := orgs_fetcher.NewOrgsFetcher(cfg.OrgUpdateSchedule, cfg.Logger, cfClient)
wg.Add(1)
go func() {
err := orgsFetcher.Run(ctx)
if err != nil {
cfg.Logger.Error("err-fatal-orgs-fetcher", err)
}
shutdown()
os.Exit(1)
}()
awsConfig := aws.NewConfig().WithRegion(cfg.AWSRegion)
awsSession := session.Must(session.NewSession(awsConfig))
elasticacheClient := elasticache.New(awsSession)
cloudwatchClient := cloudwatch.New(awsSession)
redisMetricFetcher := NewRedisMetricFetcher(elasticacheClient, cloudwatchClient, cfg.Logger)
redisMetricEndpoint := metric_endpoint.MetricEndpoint(servicePlansFetcher, spacesFetcher, orgsFetcher, redisMetricFetcher, cfg.Logger)
router := gin.Default()
router.GET("/health", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "online",
})
})
auth := authenticator.NewBasicAuthenticator(cfg.CFClientConfig.ApiAddress, nil)
authenticatedRoutes := router.Group("/")
authenticatedRoutes.Use(authenticator.AuthenticatorMiddleware(auth, cfg.Logger))
authenticatedRoutes.GET("/metrics", redisMetricEndpoint)
server := &http.Server{
Addr: fmt.Sprintf(":%d", cfg.ListenPort),
Handler: router,
}
wg.Add(1)
go func() {
err := server.ListenAndServe()
if err != nil {
cfg.Logger.Error("err-fatal-server", err)
}
shutdown()
os.Exit(1)
}()
wg.Wait()
}