in src/main.go [38:123]
func main() {
cfg := config{}
cfg.configure()
// Initialize empty resource manager cache with maxTTL
// Note that the cache is unlikely to live this long when executed in some environments.
// e.g. Cloud Run (with --min-instances 0) is likely to regularly dispose the serving
// instances. The maxTTL setting helps with executing this service on long-lived
// infrastructure, where it is required to eventually refreshed the cache entries.
cache := &statequery.Cache{}
cache.Initialize(time.Hour)
ctx := context.Background()
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
// Always respond with JSON
w.Header().Set("Content-Type", "application/json")
log.Println("starting analysis")
// Start from a clean slate and track state
state := statequery.State{}
// Retrieve all BQ reservations from current (admin) project
err := state.RetrieveReservations(ctx, cfg.project, cfg.locations)
if err != nil {
log.Fatalf("failed to retrieve reservations: %v\n", err)
}
// Abort if no reservations have been found
if len(state.Reservations) == 0 {
json.NewEncoder(w).Encode(state)
return
}
// Retrieve all assignments for each reservation
err = state.RetrieveAssignments(ctx, cfg.project, cache)
if err != nil {
log.Fatalf("failed to retrieve assignments: %v\n", err)
}
// Retrieve info for all running jobs from projects with reservations
err = state.RetrieveJobs(ctx)
if err != nil {
log.Fatalf("failed to retrieve jobs: %v\n", err)
}
// Compute utilization totals
state.ComputeUtilization(cfg.threshold)
err = state.DumpState(ctx, cfg.bucket)
if err != nil {
log.Fatalf("failed to dump state: %v\n", err)
}
// Abort if no reservation is breaching its threshold
alert := false
for _, reservation := range state.Reservations {
if reservation.ThresholdBreached {
alert = true
}
}
if !alert {
json.NewEncoder(w).Encode(state)
return
}
// Render message from template
message, err := state.RenderMessage()
if err != nil {
log.Fatalf("failed to render message: %v\n", err)
}
// Push rendered message to all defined chat webhooks
err = statequery.SendMessage(cfg.hooks(), message)
if err != nil {
log.Fatalf("failed to send message: %v\n", err)
}
// Encode state to HTTP response
json.NewEncoder(w).Encode(state)
})
log.Println("listening for connections")
http.ListenAndServe(fmt.Sprintf(":%s", cfg.port), nil)
}