Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/auth/headers/headers.go
5340 views
1
// Package headers provides an otelcol.auth.headers component.
2
package headers
3
4
import (
5
"fmt"
6
7
"github.com/grafana/agent/component"
8
"github.com/grafana/agent/component/otelcol/auth"
9
"github.com/grafana/agent/pkg/river"
10
"github.com/grafana/agent/pkg/river/rivertypes"
11
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension"
12
otelcomponent "go.opentelemetry.io/collector/component"
13
otelconfig "go.opentelemetry.io/collector/config"
14
)
15
16
func init() {
17
component.Register(component.Registration{
18
Name: "otelcol.auth.headers",
19
Args: Arguments{},
20
Exports: auth.Exports{},
21
22
Build: func(opts component.Options, args component.Arguments) (component.Component, error) {
23
fact := headerssetterextension.NewFactory()
24
return auth.New(opts, fact, args.(Arguments))
25
},
26
})
27
}
28
29
// Arguments configures the otelcol.auth.headers component.
30
type Arguments struct {
31
Headers []Header `river:"header,block,optional"`
32
}
33
34
var _ auth.Arguments = Arguments{}
35
36
// Convert implements auth.Arguments.
37
func (args Arguments) Convert() (otelconfig.Extension, error) {
38
var upstreamHeaders []headerssetterextension.HeaderConfig
39
for _, h := range args.Headers {
40
upstreamHeader := headerssetterextension.HeaderConfig{
41
Key: &h.Key,
42
}
43
44
if h.Value != nil {
45
upstreamHeader.Value = &h.Value.Value
46
}
47
if h.FromContext != nil {
48
upstreamHeader.FromContext = h.FromContext
49
}
50
51
upstreamHeaders = append(upstreamHeaders, upstreamHeader)
52
}
53
54
return &headerssetterextension.Config{
55
ExtensionSettings: otelconfig.NewExtensionSettings(otelconfig.NewComponentID("headers")),
56
HeadersConfig: upstreamHeaders,
57
}, nil
58
}
59
60
// Extensions implements auth.Arguments.
61
func (args Arguments) Extensions() map[otelconfig.ComponentID]otelcomponent.Extension {
62
return nil
63
}
64
65
// Exporters implements auth.Arguments.
66
func (args Arguments) Exporters() map[otelconfig.DataType]map[otelconfig.ComponentID]otelcomponent.Exporter {
67
return nil
68
}
69
70
// Header is an individual Header to send along with requests.
71
type Header struct {
72
Key string `river:"key,attr"`
73
Value *rivertypes.OptionalSecret `river:"value,attr,optional"`
74
FromContext *string `river:"from_context,attr,optional"`
75
}
76
77
var _ river.Unmarshaler = (*Header)(nil)
78
79
// UnmarshalRiver implements river.Unmarshaler.
80
func (h *Header) UnmarshalRiver(f func(interface{}) error) error {
81
type header Header
82
if err := f((*header)(h)); err != nil {
83
return err
84
}
85
86
switch {
87
case h.Key == "":
88
return fmt.Errorf("key must be set to a non-empty string")
89
case h.FromContext == nil && h.Value == nil:
90
return fmt.Errorf("either value or from_context must be provided")
91
case h.FromContext != nil && h.Value != nil:
92
return fmt.Errorf("either value or from_context must be provided, not both")
93
}
94
95
return nil
96
}
97
98