func()

in pkg/exporter/cmd/server.go [360:436]


func (i *inspServer) start(cfg *InspServerConfig) error {
	if err := gops.Listen(gops.Options{}); err != nil {
		log.Infof("start gops err: %v", err)
	}

	var err error
	ctx := context.TODO()
	err = probe.InitAdditionalLabels(cfg.MetricsConfig.AdditionalLabels)
	if err != nil {
		return fmt.Errorf("failed init additional labels: %w", err)
	}

	i.metricsServer, err = newMetricsServer()
	if err != nil {
		return fmt.Errorf("failed create metrics server: %w", err)
	}

	if err := i.metricsServer.Start(ctx, cfg.MetricsConfig.Probes); err != nil {
		return fmt.Errorf("failed start metrics server: %w", err)
	}

	defer func() {
		_ = i.metricsServer.Stop(ctx)
	}()

	sinks, err := createSink(cfg.EventConfig.EventSinks)
	if err != nil {
		return fmt.Errorf("failed create sinks, err: %w", err)
	}
	if len(sinks) != len(cfg.EventConfig.EventSinks) {
		log.Warnf("expected to create %d sinks , but %d were created", len(cfg.EventConfig.EventSinks), len(sinks))
	}

	i.eventServer, err = newEventServer(sinks)
	if err != nil {
		return fmt.Errorf("failed create event server: %w", err)
	}

	if err = i.eventServer.Start(ctx, cfg.EventConfig.Probes); err != nil {
		return fmt.Errorf("failed start event server: %w", err)
	}

	defer func() {
		_ = i.eventServer.Stop(ctx)
	}()

	done := make(chan struct{})

	if err = i.WatchConfig(done); err != nil {
		log.Errorf("failed watch config, dynamic load would not work: %v", err)
	}

	srv, listener, err := i.newHTTPServer(cfg)
	if err != nil {
		return fmt.Errorf("failed start http server: %w", err)
	}
	serverClosedChan := make(chan struct{})
	serverClosed := false
	go func() {
		if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed {
			log.Errorf("server error: %v", err)
		}

		close(serverClosedChan)
		serverClosed = true
	}()

	WaitSignals(serverClosedChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
	close(done)

	if !serverClosed {
		_ = srv.Shutdown(ctx)
	}
	_ = listener.Close()

	return nil
}