// This template contains a simple // app with OTEL bootstrap that will create an // HTTP server configured by environment that exports // spans and metrics to an OTEL collector if configured // to do so. Will also stand up a prometheus metrics // endpoint. // // Configuration and logger stored in context // Reference implementation of the provided packages package main import ( "context" "flag" "fmt" "net/http" "os" "os/signal" "github.com/rs/zerolog/log" "golang.org/x/sys/unix" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/app" optshttp "gitea.libretechconsulting.com/rmcguire/go-app/pkg/srv/http/opts" "gitea.libretechconsulting.com/rmcguire/go-http-server-with-otel/pkg/config" ) var flagSchema bool func main() { ctx, cncl := signal.NotifyContext(context.Background(), os.Interrupt, unix.SIGTERM) defer cncl() // This will be loaded by go-app courtesy of MustLoadConfigInto, which will // combine our sample configuration along with the embedded go-app AppConfig demoAppConfig := &config.DemoConfig{} // Load configuration and setup logging ctx, demoApp := app.MustLoadConfigInto(ctx, demoAppConfig) // Print schema if that's all we have to do if flagSchema { printSchema() os.Exit(1) } log.Debug().Any("demoAppMergedConfig", demoApp).Msg("demo app config prepared") // Prepare app app := &app.App{ AppContext: ctx, HTTP: &optshttp.AppHTTP{ Funcs: []optshttp.HTTPFunc{ { Path: "/test", HandlerFunc: func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) w.Write([]byte("http test route")) }, }, }, }, } // Launch app app.MustRun() // Wait for app to complete // Perform any extra shutdown here <-app.Done() } // flag.Parse will be called by go-app func init() { flag.BoolVar(&flagSchema, "schema", false, "generate json schema and exit") } func printSchema() { bytes, err := app.CustomSchema(&config.DemoConfig{}) if err != nil { panic(err) } fmt.Println(string(bytes)) os.Exit(0) }