func Get()

in config/config.go [196:258]


func Get(cc *CLIConfig, ec *Extended, logger *log.Logger) (*AppConfig, error) {

	data, err := ioutil.ReadFile(*cc.ConfigFile)
	if err != nil {
		return nil, err
	}

	b, err := unmarshalBasicConfig(data, *cc.ConfigFile)
	if err != nil {
		return nil, err
	}

	mc, err := ec.Metrics.UnmarshalConfig(data, *cc.ConfigFile, logger.Logger)
	if err != nil {
		return nil, err
	}

	output := []string{"stderr"}
	if b.Logging.StdOut || *cc.Foreground {
		output = []string{"stdout"}
	}
	if b.Logging.LogSink != "" {
		logger.Info("Log file path provided", zap.String("path", b.Logging.LogSink))
		output = append(output, b.Logging.LogSink)
	}

	osHostname, _ := GetHostname(logger)
	initialFields := map[string]interface{}{
		"service_name": defines.ArachneService,
		"hostname":     osHostname,
		"PID":          os.Getpid(),
	}

	var level zapcore.Level
	if err := level.Set(b.Logging.Level); err != nil {
		logger.Error("Log level provided", zap.Error(err))
	}

	zc := zap.Config{
		Level:            zap.NewAtomicLevelAt(level),
		Development:      false,
		DisableCaller:    true,
		EncoderConfig:    zap.NewProductionEncoderConfig(),
		Encoding:         "json",
		ErrorOutputPaths: []string{"stdout"},
		OutputPaths:      output,
		InitialFields:    initialFields,
	}

	cfg := AppConfig{
		Logging:                &zc,
		PIDPath:                b.Arachne.PIDPath,
		Orchestrator:           b.Arachne.Orchestrator,
		StandaloneTargetConfig: b.Arachne.StandaloneTargetConfig,
		Metrics:                mc,
	}

	if !cfg.Orchestrator.Enabled && cfg.StandaloneTargetConfig == "" {
		return nil, errors.New("the standalone-mode target configuration file has not been specified")
	}

	return &cfg, nil
}