in pkg/export/bench/app/example_app.go [158:242]
func main() {
flag.Parse()
metrics := prometheus.NewRegistry()
metrics.MustRegister(
collectors.NewGoCollector(),
collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
metricIncomingRequestsPending,
metricOutgoingRequestsPending,
metricIncomingRequests,
metricOutgoingRequests,
metricIncomingRequestErrors,
metricOutgoingRequestErrors,
metricIncomingRequestDurationHistogram,
metricOutgoingRequestDurationHistogram,
metricIncomingRequestDurationSummary,
metricOutgoingRequestDurationSummary,
)
var memoryBallast []byte
allocateMemoryBallast(&memoryBallast, *memBallastMBs*1000*1000)
var g run.Group
{
// Termination handler.
term := make(chan os.Signal, 1)
cancel := make(chan struct{})
signal.Notify(term, os.Interrupt, syscall.SIGTERM)
g.Add(
func() error {
select {
case <-term:
log.Println("Received SIGTERM, exiting gracefully...")
case <-cancel:
}
return nil
},
func(error) {
close(cancel)
},
)
}
{
server := &http.Server{Addr: *addr}
http.Handle("/metrics", promhttp.HandlerFor(metrics, promhttp.HandlerOpts{Registry: metrics}))
g.Add(func() error {
return server.ListenAndServe()
}, func(error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
if err := server.Shutdown(ctx); err != nil {
log.Printf("Server failed to shut down gracefully: %s", err)
}
cancel()
})
}
{
ctx, cancel := context.WithCancel(context.Background())
g.Add(
func() error {
return burnCPU(ctx, *cpuBurnOps)
},
func(error) {
cancel()
},
)
}
{
ctx, cancel := context.WithCancel(context.Background())
g.Add(
func() error {
return updateMetrics(ctx)
},
func(error) {
cancel()
},
)
}
if err := g.Run(); err != nil {
log.Println("Exit with error", err)
os.Exit(1)
}
}