Openstatus www.openstatus.dev
at main 99 lines 2.2 kB view raw
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}