in app/main.go [41:102]
func main() {
ctx := context.Background()
// set up traceExporter
traceExporter, err := otlptrace.New(ctx,
otlptracegrpc.NewClient(otlptracegrpc.WithInsecure()),
)
if err != nil {
log.Fatalf("Error creating trace exporter: %s", err)
}
// set up tracerprovider
tp := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithSpanProcessor(sdktrace.NewBatchSpanProcessor(traceExporter)),
)
defer tp.Shutdown(ctx)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.TraceContext{})
// set up metrics exporter and meter provider
exporter, err := otlpmetricgrpc.New(ctx,
otlpmetricgrpc.WithInsecure(),
)
if err != nil {
log.Fatalf("Error creating exporter: %s", err)
}
provider := metric.NewMeterProvider(
metric.WithReader(metric.NewPeriodicReader(exporter)),
)
defer provider.Shutdown(ctx)
meter := provider.Meter("example.com/metrics")
counter, err = meter.Int64Counter("sidecar-sample-counter")
if err != nil {
log.Fatalf("Error creating counter: %s", err)
}
// SIGINT handles Ctrl+C locally.
// SIGTERM handles Cloud Run termination signal.
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
// Start HTTP server.
srv := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(handler),
}
go func() {
http.HandleFunc("/", handler)
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
}
}()
// Receive output from signalChan.
sig := <-signalChan
log.Printf("%s signal caught. Graceful Shutdown.", sig)
// Gracefully shutdown the server by waiting on existing requests (except websockets).
if err := srv.Shutdown(ctx); err != nil {
log.Printf("server shutdown failed: %+v", err)
}
log.Print("server exited")
}