code: func (h *handler) innerHandler(filters ...string) (http.Handler, error) {
  	nc, err := collector.NewNodeCollector(filters...)
  	if err != nil {
  		return nil, fmt.Errorf("couldn't create collector: %s", err)
  	}
  
  	// Only log the creation of an unfiltered handler, which should happen
  	// only once upon startup.
  	if len(filters) == 0 {
  		log.Infof("Enabled collectors:")
  		collectors := []string{}
  		for n := range nc.Collectors {
  			collectors = append(collectors, n)
  		}
  		sort.Strings(collectors)
  		for _, n := range collectors {
  			log.Infof(" - %s", n)
  		}
  	}
  
  	r := prometheus.NewRegistry()
  	r.MustRegister(version.NewCollector("node_exporter"))
  	if err := r.Register(nc); err != nil {
  		return nil, fmt.Errorf("couldn't register node collector: %s", err)
  	}
  	handler := promhttp.HandlerFor(
  		prometheus.Gatherers{h.exporterMetricsRegistry, r},
  		promhttp.HandlerOpts{
  			ErrorLog:            log.NewErrorLogger(),
  			ErrorHandling:       promhttp.ContinueOnError,
  			MaxRequestsInFlight: h.maxRequests,
  		},
  	)
  	if h.includeExporterMetrics {
  		// Note that we have to use h.exporterMetricsRegistry here to
  		// use the same promhttp metrics for all expositions.
  		handler = promhttp.InstrumentMetricHandler(
  			h.exporterMetricsRegistry, handler,
  		)
  	}
  	return handler, nil
  }
docs: // innerHandler is used to create buth the one unfiltered http.Handler to be
  // wrapped by the outer handler and also the filtered handlers created on the
  // fly. The former is accomplished by calling innerHandler without any arguments
  // (in which case it will log all the collectors enabled via command-line
  // flags).