Openstatus
www.openstatus.dev
1package main
2
3import (
4 "context"
5 "fmt"
6 "net/http"
7
8 "os"
9 "os/signal"
10 "syscall"
11 "time"
12
13 "connectrpc.com/connect"
14 "github.com/madflojo/tasks"
15 "github.com/openstatushq/openstatus/apps/checker/pkg/job"
16 "github.com/openstatushq/openstatus/apps/checker/pkg/scheduler"
17
18 v1 "github.com/openstatushq/openstatus/apps/checker/proto/private_location/v1"
19)
20
21const (
22 configRefreshInterval = 10 * time.Minute
23)
24
25func main() {
26 ctx, cancel := context.WithCancel(context.Background())
27 defer cancel()
28
29 // Graceful shutdown on interrupt
30 sigChan := make(chan os.Signal, 1)
31 signal.Notify(sigChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
32 go func() {
33 <-sigChan
34 cancel()
35 }()
36 fmt.Println("Launching openstatus private location checker")
37 s := tasks.New()
38 defer s.Stop()
39
40 apiKey := getEnv("OPENSTATUS_KEY", "")
41
42 monitorManager := scheduler.MonitorManager{
43 Client: getClient(apiKey),
44 JobRunner: job.NewJobRunner(),
45 Scheduler: s,
46 }
47 configTicker := time.NewTicker(configRefreshInterval)
48 defer configTicker.Stop()
49
50 monitorManager.UpdateMonitors(ctx)
51 for {
52 select {
53 case <-ctx.Done():
54 return
55 case <-configTicker.C:
56 fmt.Println("fetching monitors")
57 monitorManager.UpdateMonitors(ctx)
58 }
59 }
60}
61
62func getEnv(key, fallback string) string {
63 if value, ok := os.LookupEnv(key); ok {
64 return value
65 }
66 return fallback
67}
68
69func getClient(apiKey string) v1.PrivateLocationServiceClient {
70 ingestUrl := getEnv("OPENSTATUS_INGEST_URL", "https://openstatus-private-location.fly.dev")
71
72 client := v1.NewPrivateLocationServiceClient(
73 http.DefaultClient,
74 ingestUrl,
75 connect.WithHTTPGet(),
76 connect.WithInterceptors(NewAuthInterceptor(apiKey)),
77 )
78
79 return client
80}
81
82func NewAuthInterceptor(token string) connect.UnaryInterceptorFunc {
83
84 interceptor := func(next connect.UnaryFunc) connect.UnaryFunc {
85 return connect.UnaryFunc(func(
86 ctx context.Context,
87 req connect.AnyRequest,
88 ) (connect.AnyResponse, error) {
89 if req.Spec().IsClient {
90 // Send a token with client requests.
91 req.Header().Set("openstatus-token", token)
92 }
93
94 return next(ctx, req)
95 })
96 }
97 return connect.UnaryInterceptorFunc(interceptor)
98
99}