Path: blob/main/component/otelcol/exporter/otlphttp/otlphttp.go
4096 views
// Package otlphttp provides an otelcol.exporter.otlphttp component.1package otlphttp23import (4"errors"5"time"67"github.com/grafana/agent/component"8"github.com/grafana/agent/component/otelcol"9"github.com/grafana/agent/component/otelcol/exporter"10"github.com/grafana/agent/pkg/river"11otelcomponent "go.opentelemetry.io/collector/component"12otelconfig "go.opentelemetry.io/collector/config"13"go.opentelemetry.io/collector/exporter/otlphttpexporter"14)1516func init() {17component.Register(component.Registration{18Name: "otelcol.exporter.otlphttp",19Args: Arguments{},20Exports: otelcol.ConsumerExports{},2122Build: func(opts component.Options, args component.Arguments) (component.Component, error) {23fact := otlphttpexporter.NewFactory()24return exporter.New(opts, fact, args.(Arguments))25},26})27}2829// Arguments configures the otelcol.exporter.otlphttp component.30type Arguments struct {31Client HTTPClientArguments `river:"client,block"`32Queue otelcol.QueueArguments `river:"sending_queue,block,optional"`33Retry otelcol.RetryArguments `river:"retry_on_failure,block,optional"`3435// The URLs to send metrics/logs/traces to. If omitted the exporter will36// use Client.Endpoint by appending "/v1/metrics", "/v1/logs" or37// "/v1/traces", respectively. If set, these settings override38// Client.Endpoint for the corresponding signal.39TracesEndpoint string `river:"traces_endpoint,attr,optional"`40MetricsEndpoint string `river:"metrics_endpoint,attr,optional"`41LogsEndpoint string `river:"logs_endpoint,attr,optional"`42}4344var (45_ river.Unmarshaler = (*Arguments)(nil)46_ river.Unmarshaler = (*HTTPClientArguments)(nil)47_ exporter.Arguments = Arguments{}48)4950// DefaultArguments holds default values for Arguments.51var DefaultArguments = Arguments{52Queue: otelcol.DefaultQueueArguments,53Retry: otelcol.DefaultRetryArguments,54Client: DefaultHTTPClientArguments,55}5657// UnmarshalRiver implements river.Unmarshaler.58func (args *Arguments) UnmarshalRiver(f func(interface{}) error) error {59*args = DefaultArguments60type arguments Arguments61err := f((*arguments)(args))62if err != nil {63return err64}65return args.Validate()66}6768// Convert implements exporter.Arguments.69func (args Arguments) Convert() (otelconfig.Exporter, error) {70return &otlphttpexporter.Config{71ExporterSettings: otelconfig.NewExporterSettings(otelconfig.NewComponentID("otlp")),72HTTPClientSettings: *(*otelcol.HTTPClientArguments)(&args.Client).Convert(),73QueueSettings: *args.Queue.Convert(),74RetrySettings: *args.Retry.Convert(),75}, nil76}7778// Extensions implements exporter.Arguments.79func (args Arguments) Extensions() map[otelconfig.ComponentID]otelcomponent.Extension {80return (*otelcol.HTTPClientArguments)(&args.Client).Extensions()81}8283// Exporters implements exporter.Arguments.84func (args Arguments) Exporters() map[otelconfig.DataType]map[otelconfig.ComponentID]otelcomponent.Exporter {85return nil86}8788// Validate returns an error if the configuration is invalid.89func (args *Arguments) Validate() error {90if args.Client.Endpoint == "" && args.TracesEndpoint == "" && args.MetricsEndpoint == "" && args.LogsEndpoint == "" {91return errors.New("at least one endpoint must be specified")92}93return nil94}9596// HTTPClientArguments is used to configure otelcol.exporter.otlphttp with97// component-specific defaults.98type HTTPClientArguments otelcol.HTTPClientArguments99100// Default server settings.101var (102DefaultMaxIddleConns = 100103DefaultIdleConnTimeout = 90 * time.Second104DefaultHTTPClientArguments = HTTPClientArguments{105MaxIdleConns: &DefaultMaxIddleConns,106IdleConnTimeout: &DefaultIdleConnTimeout,107108Timeout: 30 * time.Second,109Headers: map[string]string{},110Compression: otelcol.CompressionTypeGzip,111ReadBufferSize: 0,112WriteBufferSize: 512 * 1024,113}114)115116// UnmarshalRiver implements river.Unmarshaler and supplies defaults.117func (args *HTTPClientArguments) UnmarshalRiver(f func(interface{}) error) error {118*args = DefaultHTTPClientArguments119type arguments HTTPClientArguments120return f((*arguments)(args))121}122123124