Path: blob/main/pkg/config/agentmanagement_remote_config.go
4094 views
package config12import (3"github.com/grafana/agent/pkg/integrations"4"github.com/grafana/agent/pkg/logs"5"github.com/grafana/agent/pkg/metrics/instance"6"github.com/grafana/loki/clients/pkg/promtail/scrapeconfig"7pc "github.com/prometheus/prometheus/config"8"gopkg.in/yaml.v2"9)1011type (12RemoteConfig struct {13BaseConfig BaseConfigContent `json:"base_config" yaml:"base_config"`14Snippets []Snippet `json:"snippets" yaml:"snippets"`15}1617// BaseConfigContent is the content of a base config18BaseConfigContent string1920// Snippet is a snippet of configuration returned by the config API.21Snippet struct {22// Config is the snippet of config to be included.23Config string `json:"config" yaml:"config"`24}2526// SnippetContent defines the internal structure of a snippet configuration.27SnippetContent struct {28// MetricsScrapeConfigs is a YAML containing list of metrics scrape configs.29MetricsScrapeConfigs []*pc.ScrapeConfig `yaml:"metrics_scrape_configs,omitempty"`3031// LogsScrapeConfigs is a YAML containing list of logs scrape configs.32LogsScrapeConfigs []scrapeconfig.Config `yaml:"logs_scrape_configs,omitempty"`3334// IntegrationConfigs is a YAML containing list of integrations.35IntegrationConfigs integrations.ManagerConfig `yaml:"integration_configs,omitempty"`36}37)3839func NewRemoteConfig(buf []byte) (*RemoteConfig, error) {40rc := &RemoteConfig{}41err := yaml.Unmarshal(buf, rc)42if err != nil {43return nil, err44}45return rc, nil46}4748// BuildAgentConfig builds an agent configuration from a base config and a list of snippets49func (rc *RemoteConfig) BuildAgentConfig() (*Config, error) {50c := DefaultConfig()51err := yaml.Unmarshal([]byte(rc.BaseConfig), &c)52if err != nil {53return nil, err54}5556// For now Agent Management only supports integrations v157if err := c.Integrations.setVersion(integrationsVersion1); err != nil {58return nil, err59}6061err = appendSnippets(&c, rc.Snippets)62if err != nil {63return nil, err64}65return &c, nil66}6768func appendSnippets(c *Config, snippets []Snippet) error {69metricsConfigs := instance.DefaultConfig70metricsConfigs.Name = "snippets"71logsConfigs := logs.InstanceConfig{72Name: "snippets",73ScrapeConfig: []scrapeconfig.Config{},74}75logsConfigs.Initialize()76integrationConfigs := integrations.DefaultManagerConfig()7778for _, snippet := range snippets {79var snippetContent SnippetContent80err := yaml.Unmarshal([]byte(snippet.Config), &snippetContent)81if err != nil {82return err83}84metricsConfigs.ScrapeConfigs = append(metricsConfigs.ScrapeConfigs, snippetContent.MetricsScrapeConfigs...)85logsConfigs.ScrapeConfig = append(logsConfigs.ScrapeConfig, snippetContent.LogsScrapeConfigs...)86integrationConfigs.Integrations = append(integrationConfigs.Integrations, snippetContent.IntegrationConfigs.Integrations...)87}88if len(metricsConfigs.ScrapeConfigs) > 0 {89c.Metrics.Configs = append(c.Metrics.Configs, metricsConfigs)90}9192if len(logsConfigs.ScrapeConfig) > 0 {93// rc.Config.Logs is initialized as nil, so we need to check if it's nil before appending94if c.Logs == nil {95c.Logs = &logs.Config{96Configs: []*logs.InstanceConfig{},97}98}99c.Logs.Configs = append(c.Logs.Configs, &logsConfigs)100}101102c.Integrations.configV1.Integrations = append(c.Integrations.configV1.Integrations, integrationConfigs.Integrations...)103return nil104}105106107