in frontend/cmd/cmd.go [121:210]
func (opts *FrontendOpts) Run() error {
ctx := context.Background()
logger := util.DefaultLogger()
logger.Info(fmt.Sprintf("%s (%s) started", frontend.ProgramName, version.CommitSHA))
// Initialize the global OpenTelemetry tracer.
otelShutdown, err := frontend.ConfigureOpenTelemetryTracer(ctx, logger, semconv.CloudRegion(opts.location))
if err != nil {
return fmt.Errorf("could not initialize opentelemetry sdk: %w", err)
}
// Create the database client.
cosmosDatabaseClient, err := database.NewCosmosDatabaseClient(
opts.cosmosURL,
opts.cosmosName,
azcore.ClientOptions{
// FIXME Cloud should be determined by other means.
Cloud: cloud.AzurePublic,
PerCallPolicies: []policy.Policy{policyFunc(correlationIDPolicy)},
TracingProvider: azotel.NewTracingProvider(otel.GetTracerProvider(), nil),
},
)
if err != nil {
return fmt.Errorf("failed to create the CosmosDB client: %w", err)
}
dbClient, err := database.NewDBClient(ctx, cosmosDatabaseClient)
if err != nil {
return fmt.Errorf("failed to create the database client: %w", err)
}
listener, err := net.Listen("tcp4", fmt.Sprintf(":%d", opts.port))
if err != nil {
return err
}
metricsListener, err := net.Listen("tcp4", fmt.Sprintf(":%d", opts.metricsPort))
if err != nil {
return err
}
// Initialize the Clusters Service Client.
conn, err := sdk.NewUnauthenticatedConnectionBuilder().
TransportWrapper(func(r http.RoundTripper) http.RoundTripper {
return otelhttp.NewTransport(
frontend.RequestIDPropagator(r),
)
}).
URL(opts.clustersServiceURL).
Insecure(opts.insecure).
MetricsSubsystem("frontend_clusters_service_client").
MetricsRegisterer(prometheus.DefaultRegisterer).
Build()
if err != nil {
return err
}
csClient := ocm.ClusterServiceClient{
Conn: conn,
ProvisionerNoOpProvision: opts.clusterServiceNoopDeprovision,
ProvisionerNoOpDeprovision: opts.clusterServiceNoopDeprovision,
}
if opts.clusterServiceProvisionShard != "" {
csClient.ProvisionShardID = api.Ptr(opts.clusterServiceProvisionShard)
}
if len(opts.location) == 0 {
return errors.New("location is required")
}
logger.Info(fmt.Sprintf("Application running in %s", opts.location))
f := frontend.NewFrontend(logger, listener, metricsListener, prometheus.DefaultRegisterer, dbClient, opts.location, &csClient)
stop := make(chan struct{})
signalChannel := make(chan os.Signal, 1)
signal.Notify(signalChannel, syscall.SIGINT, syscall.SIGTERM)
go f.Run(ctx, stop)
sig := <-signalChannel
logger.Info(fmt.Sprintf("caught %s signal", sig))
close(stop)
f.Join()
_ = otelShutdown(ctx)
logger.Info(fmt.Sprintf("%s (%s) stopped", frontend.ProgramName, version.CommitSHA))
return nil
}