Path: blob/main/component/otelcol/auth/headers/headers.go
5340 views
// Package headers provides an otelcol.auth.headers component.1package headers23import (4"fmt"56"github.com/grafana/agent/component"7"github.com/grafana/agent/component/otelcol/auth"8"github.com/grafana/agent/pkg/river"9"github.com/grafana/agent/pkg/river/rivertypes"10"github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension"11otelcomponent "go.opentelemetry.io/collector/component"12otelconfig "go.opentelemetry.io/collector/config"13)1415func init() {16component.Register(component.Registration{17Name: "otelcol.auth.headers",18Args: Arguments{},19Exports: auth.Exports{},2021Build: func(opts component.Options, args component.Arguments) (component.Component, error) {22fact := headerssetterextension.NewFactory()23return auth.New(opts, fact, args.(Arguments))24},25})26}2728// Arguments configures the otelcol.auth.headers component.29type Arguments struct {30Headers []Header `river:"header,block,optional"`31}3233var _ auth.Arguments = Arguments{}3435// Convert implements auth.Arguments.36func (args Arguments) Convert() (otelconfig.Extension, error) {37var upstreamHeaders []headerssetterextension.HeaderConfig38for _, h := range args.Headers {39upstreamHeader := headerssetterextension.HeaderConfig{40Key: &h.Key,41}4243if h.Value != nil {44upstreamHeader.Value = &h.Value.Value45}46if h.FromContext != nil {47upstreamHeader.FromContext = h.FromContext48}4950upstreamHeaders = append(upstreamHeaders, upstreamHeader)51}5253return &headerssetterextension.Config{54ExtensionSettings: otelconfig.NewExtensionSettings(otelconfig.NewComponentID("headers")),55HeadersConfig: upstreamHeaders,56}, nil57}5859// Extensions implements auth.Arguments.60func (args Arguments) Extensions() map[otelconfig.ComponentID]otelcomponent.Extension {61return nil62}6364// Exporters implements auth.Arguments.65func (args Arguments) Exporters() map[otelconfig.DataType]map[otelconfig.ComponentID]otelcomponent.Exporter {66return nil67}6869// Header is an individual Header to send along with requests.70type Header struct {71Key string `river:"key,attr"`72Value *rivertypes.OptionalSecret `river:"value,attr,optional"`73FromContext *string `river:"from_context,attr,optional"`74}7576var _ river.Unmarshaler = (*Header)(nil)7778// UnmarshalRiver implements river.Unmarshaler.79func (h *Header) UnmarshalRiver(f func(interface{}) error) error {80type header Header81if err := f((*header)(h)); err != nil {82return err83}8485switch {86case h.Key == "":87return fmt.Errorf("key must be set to a non-empty string")88case h.FromContext == nil && h.Value == nil:89return fmt.Errorf("either value or from_context must be provided")90case h.FromContext != nil && h.Value != nil:91return fmt.Errorf("either value or from_context must be provided, not both")92}9394return nil95}969798