// Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package config import ( "errors" "flag" "strings" "go.opentelemetry.io/collector/featuregate" ) const ( configFlag = "config" featureGatesFlag = "feature-gates" ) type configFlagValue struct { values []string sets []string } func (s *configFlagValue) Set(val string) error { s.values = append(s.values, val) return nil } func (s *configFlagValue) String() string { return "[" + strings.Join(s.values, ", ") + "]" } func Flags(reg *featuregate.Registry) *flag.FlagSet { flagSet := new(flag.FlagSet) cfgs := new(configFlagValue) flagSet.Var(cfgs, configFlag, "Locations to the config file(s), note that only a"+ " single location can be set per flag entry e.g. `--config=file:/path/to/first --config=file:path/to/second`.") flagSet.Func("set", "Set arbitrary component config property. The component has to be defined in the config file and the flag"+ " has a higher precedence. Array config properties are overridden and maps are joined. Example --set=processors.batch.timeout=2s", func(s string) error { idx := strings.Index(s, "=") if idx == -1 { // No need for more context, see TestSetFlag/invalid_set. return errors.New("missing equal sign") } cfgs.sets = append(cfgs.sets, "yaml:"+strings.TrimSpace(strings.ReplaceAll(s[:idx], ".", "::"))+": "+strings.TrimSpace(s[idx+1:])) return nil }) flagSet.Var(featuregate.NewFlag(reg), featureGatesFlag, "Comma-delimited list of feature gate identifiers. Prefix with '-' to disable the feature. '+' or no prefix will enable the feature.") return flagSet } func getConfigFlag(flagSet *flag.FlagSet) []string { cfv := flagSet.Lookup(configFlag).Value.(*configFlagValue) return append(cfv.values, cfv.sets...) }