receiver/hostmetricsreceiver/factory.go (118 lines of code) (raw):
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package hostmetricsreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver"
import (
"context"
"fmt"
"time"
"github.com/shirou/gopsutil/v4/host"
"github.com/shirou/gopsutil/v4/process"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/scraper"
"go.opentelemetry.io/collector/scraper/scraperhelper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/metadata"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/loadscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/memoryscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/networkscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/pagingscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/processesscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/processscraper"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/systemscraper"
)
const (
defaultMetadataCollectionInterval = 5 * time.Minute
)
// This file implements Factory for HostMetrics receiver.
var (
scraperFactories = mustMakeFactories(
cpuscraper.NewFactory(),
diskscraper.NewFactory(),
filesystemscraper.NewFactory(),
loadscraper.NewFactory(),
memoryscraper.NewFactory(),
networkscraper.NewFactory(),
pagingscraper.NewFactory(),
processesscraper.NewFactory(),
processscraper.NewFactory(),
systemscraper.NewFactory(),
)
)
func mustMakeFactories(factories ...scraper.Factory) map[component.Type]scraper.Factory {
fMap := map[component.Type]scraper.Factory{}
for _, f := range factories {
if _, ok := fMap[f.Type()]; ok {
panic(fmt.Errorf("duplicate scraper factory %q", f.Type()))
}
fMap[f.Type()] = f
}
return fMap
}
// NewFactory creates a new factory for host metrics receiver.
func NewFactory() receiver.Factory {
return receiver.NewFactory(
metadata.Type,
createDefaultConfig,
receiver.WithMetrics(createMetricsReceiver, metadata.MetricsStability),
receiver.WithLogs(createLogsReceiver, metadata.LogsStability))
}
// createDefaultConfig creates the default configuration for receiver.
func createDefaultConfig() component.Config {
return &Config{
ControllerConfig: scraperhelper.NewDefaultControllerConfig(),
MetadataCollectionInterval: defaultMetadataCollectionInterval,
}
}
// createMetricsReceiver creates a metrics receiver based on provided config.
func createMetricsReceiver(
ctx context.Context,
set receiver.Settings,
cfg component.Config,
consumer consumer.Metrics,
) (receiver.Metrics, error) {
oCfg := cfg.(*Config)
addScraperOptions, err := createAddScraperOptions(ctx, oCfg, scraperFactories)
if err != nil {
return nil, err
}
host.EnableBootTimeCache(true)
process.EnableBootTimeCache(true)
return scraperhelper.NewMetricsController(
&oCfg.ControllerConfig,
set,
consumer,
addScraperOptions...,
)
}
func createLogsReceiver(
_ context.Context, set receiver.Settings, cfg component.Config, consumer consumer.Logs,
) (receiver.Logs, error) {
return &hostEntitiesReceiver{
cfg: cfg.(*Config),
nextLogs: consumer,
settings: &set,
}, nil
}
func createAddScraperOptions(
_ context.Context,
cfg *Config,
factories map[component.Type]scraper.Factory,
) ([]scraperhelper.ControllerOption, error) {
scraperControllerOptions := make([]scraperhelper.ControllerOption, 0, len(cfg.Scrapers))
envMap := setGoPsutilEnvVars(cfg.RootPath)
for key, cfg := range cfg.Scrapers {
factory, err := getFactory(key, factories)
if err != nil {
return nil, err
}
factory = internal.NewEnvVarFactory(factory, envMap)
scraperControllerOptions = append(scraperControllerOptions, scraperhelper.AddFactoryWithConfig(factory, cfg))
}
return scraperControllerOptions, nil
}
func getFactory(key component.Type, factories map[component.Type]scraper.Factory) (s scraper.Factory, err error) {
factory, ok := factories[key]
if !ok {
return nil, fmt.Errorf("host metrics scraper factory not found for key: %q", key)
}
return factory, nil
}