diff --git a/cmd/otelcontribcol/builder-config.yaml b/cmd/otelcontribcol/builder-config.yaml index 0b8d3d6b9650..3e4de57b4088 100644 --- a/cmd/otelcontribcol/builder-config.yaml +++ b/cmd/otelcontribcol/builder-config.yaml @@ -217,6 +217,7 @@ receivers: - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver v0.112.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.112.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver v0.112.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/gelfreceiver v0.112.0 connectors: - gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.112.0 @@ -496,3 +497,4 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil => ../../internal/grpcutil - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudmonitoringreceiver => ../../receiver/googlecloudmonitoringreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status => ../../pkg/status + - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/gelfreceiver => ../../receiver/gelfreceiver \ No newline at end of file diff --git a/pkg/stanza/operator/input/gelfinternal/config.go b/pkg/stanza/operator/input/gelfinternal/config.go new file mode 100644 index 000000000000..152793d6e08d --- /dev/null +++ b/pkg/stanza/operator/input/gelfinternal/config.go @@ -0,0 +1,111 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package gelfinternal // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/udp" + +import ( + "fmt" + "net" + "sync" + + "go.opentelemetry.io/collector/component" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" +) + +const ( + operatorType = "gelf_input" + defaultReaders = 1 + defaultProcessors = 1 + defaultUDPMaxQueueLength = 100 + defaultListenAddress = "127.0.0.1:31250" + defaultProtocol = "udp" + MaxUDPSize = 64 * 1024 +) + +func init() { + operator.Register(operatorType, func() operator.Builder { return NewConfig() }) +} + +// NewConfig creates a new UDP input config with default values +func NewConfig() *Config { + return NewConfigWithID(operatorType) +} + +// NewConfigWithID creates a new UDP input config with default values +func NewConfigWithID(operatorID string) *Config { + return &Config{ + InputConfig: helper.NewInputConfig(operatorID, operatorType), + BaseConfig: BaseConfig{ + ListenAddress: string(defaultListenAddress), + Protocol: string(defaultProtocol), + AsyncReaders: defaultReaders, + AsyncProcessors: defaultProcessors, + UDPMaxQueueLength: defaultUDPMaxQueueLength, + }, + } +} + +// Config is the configuration of a udp input operator. +type Config struct { + helper.InputConfig `mapstructure:",squash"` + BaseConfig `mapstructure:",squash"` +} + +// BaseConfig is the details configuration of a udp input operator. +type BaseConfig struct { + ListenAddress string `mapstructure:"listen_address,omitempty"` + Protocol string `mapstructure:"protocol,omitempty"` + AsyncReaders int `mapstructure:"async_readers,omitempty"` + AsyncProcessors int `mapstructure:"async_processors,omitempty"` + UDPMaxQueueLength int `mapstructure:"udp_max_queue_length,omitempty"` +} + +// Build will build a udp input operator. +func (c Config) Build(set component.TelemetrySettings) (operator.Operator, error) { + inputOperator, err := c.InputConfig.Build(set) + if err != nil { + return nil, err + } + + if c.ListenAddress == "" { + return nil, fmt.Errorf("missing required parameter 'listen_address'") + } + + if _, _, err := net.SplitHostPort(c.ListenAddress); err != nil { + return nil, fmt.Errorf("invalid listen_address: %w", err) + } + + if c.Protocol != "udp" { + return nil, fmt.Errorf("supported protocols - udp, invalid protocol: %s", c.Protocol) + } + if c.AsyncReaders < 1 { + return nil, fmt.Errorf("invalid async_reader: %d", c.AsyncReaders) + } + if c.AsyncProcessors < 1 { + return nil, fmt.Errorf("invalid async_processors: %d", c.AsyncProcessors) + } + if c.UDPMaxQueueLength <= 0 || c.UDPMaxQueueLength > 65535 { + return nil, fmt.Errorf("expecting queue length greater than 0 and less than 65535, invalid udp_max_queue_length: %d", c.UDPMaxQueueLength) + } + + udpInput := &Input{ + InputOperator: inputOperator, + address: c.ListenAddress, + protocol: c.Protocol, + udpMessageQueue: make(chan UDPMessage, c.UDPMaxQueueLength), + readBufferPool: sync.Pool{ + New: func() any { + buffer := make([]byte, MaxUDPSize) + return &buffer + }, + }, + buffer: make(map[string]*MapGelfMessage), + lastBuffer: make(map[string]*MapGelfMessage), + asyncReaders: c.AsyncReaders, + asyncProcessors: c.AsyncProcessors, + } + + return udpInput, nil +} diff --git a/pkg/stanza/operator/input/gelfinternal/input.go b/pkg/stanza/operator/input/gelfinternal/input.go new file mode 100644 index 000000000000..8cc285539faa --- /dev/null +++ b/pkg/stanza/operator/input/gelfinternal/input.go @@ -0,0 +1,410 @@ +package gelfinternal + +import ( + "bytes" + "compress/gzip" + "compress/zlib" + "context" + "encoding/json" + "fmt" + "io" + "net" + "sync" + "time" + + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" +) + +const ( + ChunkSize = 1420 + chunkedHeaderLen = 12 + chunkedDataLen = ChunkSize - chunkedHeaderLen + chunkHeaderSize = 12 +) + +var ( + magicChunked = []byte{0x1e, 0x0f} + magicZlib = []byte{0x78} + magicGzip = []byte{0x1f, 0x8b} +) +type Input struct { + helper.InputOperator + wg sync.WaitGroup + cancel context.CancelFunc + address string + protocol string + conn net.PacketConn + readBufferPool sync.Pool + udpMessageQueue chan UDPMessage + wgReader sync.WaitGroup + wgProcessor sync.WaitGroup + asyncReaders int + asyncProcessors int + + buffer map[string]*MapGelfMessage + lastBuffer map[string]*MapGelfMessage + lastSwap time.Time + muBuffer sync.Mutex +} + +type GELFSegment struct { + Id string + SequenceNumber int + TotalCount int + Data []byte +} + +type Message struct { + Version string `json:"version"` + Host string `json:"host"` + Short string `json:"short_message"` + Full string `json:"full_message,omitempty"` + TimeUnix float64 `json:"timestamp"` + Level int32 `json:"level,omitempty"` + Facility string `json:"facility,omitempty"` + Extra map[string]interface{} `json:"-"` + RawExtra json.RawMessage `json:"-"` +} + +type UDPMessage struct { + length int + buffer []byte + addr net.Addr +} + +type MapGelfMessage struct { + stored int + segments [128][]byte +} + +// Start will start listening for messages on a socket. +func (gelfRcvInput *Input) Start(_ operator.Persister) error { + ctx, cancel := context.WithCancel(context.Background()) + gelfRcvInput.cancel = cancel + + udpAddr, err := net.ResolveUDPAddr(gelfRcvInput.protocol, gelfRcvInput.address) + if err != nil { + return fmt.Errorf("ResolveUDPAddr('%s'): %s", gelfRcvInput.address, err) + } + + conn, err := net.ListenUDP(gelfRcvInput.protocol, udpAddr) + if err != nil { + gelfRcvInput.Logger().Error("Failed to open connection", zap.Error(err)) + return fmt.Errorf("failed to open connection: %w", err) + } + + gelfRcvInput.Logger().Info("Started GELF UDP server") + + gelfRcvInput.conn = conn + + go gelfRcvInput.startReading(ctx) + + gelfRcvInput.Logger().Debug("Exiting the _Start function") + + return nil +} + +// Stop will stop listening for udp messages. +func (gelfRcvInput *Input) Stop() error { + if gelfRcvInput.cancel == nil { + return nil + } + gelfRcvInput.cancel() + gelfRcvInput.conn.Close() + gelfRcvInput.Logger().Info("Stopping GELF server") + gelfRcvInput.wg.Wait() + close(gelfRcvInput.udpMessageQueue) + + return nil +} + +// GELF code +// https://github.com/Graylog2/go-gelf/blob/master/gelf/gelf.go + +func (gelfRcvInput *Input) GelfNewReader(addr string) error { + var err error + udpAddr, err := net.ResolveUDPAddr("udp", addr) + if err != nil { + return fmt.Errorf("ResolveUDPAddr('%s'): %s", addr, err) + } + + conn, err := net.ListenUDP("udp", udpAddr) + if err != nil { + return fmt.Errorf("ListenUDP: %s", err) + } + gelfRcvInput.conn = conn + return nil +} + +func (gelfRcvInput *Input) startReading(ctx context.Context) { + for n := 0; n < gelfRcvInput.asyncProcessors; n++ { + gelfRcvInput.wgReader.Add(1) + go gelfRcvInput.ReadUDPBufferAsync(ctx) + gelfRcvInput.Logger().Debug("Started read workers...") + } + for n := 0; n < gelfRcvInput.asyncProcessors; n++ { + gelfRcvInput.wgProcessor.Add(1) + go gelfRcvInput.processMessagesAsync(ctx) + gelfRcvInput.Logger().Debug("Started processor workers...") + } +} + +func (gelfRcvInput *Input) ReadUDPBufferAsync(ctx context.Context) { + + defer gelfRcvInput.wgReader.Done() + + for { + + var ( + n int + err error + addr net.Addr + ) + buf := make([]byte, ChunkSize) + + n, addr, err = gelfRcvInput.conn.ReadFrom(buf) + + gelfRcvInput.Logger().Debug("Received message from UDP") + + if err != nil { + select { + case <-ctx.Done(): + return + default: + gelfRcvInput.Logger().Error("Failed reading messages", zap.Error(err)) + } + + break + } + + udpMessage := UDPMessage{ + addr: addr, + length: n, + buffer: buf[:n], + } + + // Send message to udp queue + gelfRcvInput.udpMessageQueue <- udpMessage + } +} + +func (gelfRcvInput *Input) processMessagesAsync(ctx context.Context) { + + defer gelfRcvInput.wgProcessor.Done() + + for { + // Read a message from the message queue. + message, ok := <-gelfRcvInput.udpMessageQueue + gelfRcvInput.Logger().Debug("Received queued message!") + if !ok { + return // Channel closed, exit the goroutine. + } + + gelfRcvInput.Logger().Debug("Received message from UDP - entering Handling gelf message") + gelfRcvInput.HandleGELFMessage(ctx, message.buffer, message.length) + } +} + +func (gelfRcvInput *Input) HandleGELFMessage(ctx context.Context, packet []byte, n int) { + + // Check if the packet is a chunked message or a full message + if bytes.Equal(packet[:2], magicChunked) { + segment := GELFSegment{ + Id: string(packet[2:10]), + SequenceNumber: int(packet[10]), + TotalCount: int(packet[11]), + Data: append(make([]byte, 0, n-len(packet)), packet[chunkedHeaderLen:]...), + } + + gelfRcvInput.handleChunkedMessage(ctx, &segment, n) // Handle as a chunked message + } else { + + message, err := gelfRcvInput.extractLog(ctx, packet) // Handle as a full message + if err != nil { + gelfRcvInput.Logger().Error("Error during decompression(non-chunked)", zap.Error(err)) + // return nil + } + + if message.Full == "" { + gelfRcvInput.writeLog(ctx, message.Short) + } else { + gelfRcvInput.writeLog(ctx, message.Full) + } + } +} + +// handleChunkedMessage processes a chunked GELF message +func (gelfRcvInput *Input) handleChunkedMessage(ctx context.Context, gelfSegment *GELFSegment, n int) { + + gelfRcvInput.muBuffer.Lock() + defer gelfRcvInput.muBuffer.Unlock() + + // Condition for checking 5 seconds by comparing with last_swap, clear last_buffer and swap current buffer with last_buffer + // Took inspiration from Tremor's gelf_chunking implementation: https://github.com/tremor-rs/tremor-runtime/blob/main/tremor-interceptor/src/preprocessor/gelf_chunking.rs + if time.Since(gelfRcvInput.lastSwap) > 5*time.Second { + gelfRcvInput.lastSwap = time.Now() + gelfRcvInput.lastBuffer = gelfRcvInput.buffer + gelfRcvInput.buffer = make(map[string]*MapGelfMessage) + gelfRcvInput.Logger().Debug("Swapped buffers!") + } + + // If segment exists in last_buffer then process in that. + gelfMessage, segmentExists := gelfRcvInput.lastBuffer[gelfSegment.Id] + + if segmentExists { + if len(gelfMessage.segments[gelfSegment.SequenceNumber]) == 0 { + // If the sequenceNumber is available then add + if (gelfSegment.SequenceNumber >= 0) && (gelfSegment.SequenceNumber < gelfSegment.TotalCount) { + // gelfRcvInput.lastBuffer[gelfSegment.Id] = ni + + gelfMessage.segments[gelfSegment.SequenceNumber] = gelfSegment.Data + + gelfMessage.stored++ + + gelfRcvInput.Logger().Debug("last_buffer details", zap.Int("Stored in last_buffer: ", gelfMessage.stored), zap.Int("Total count in last_buffer: ", gelfSegment.TotalCount)) + + if gelfMessage.stored == gelfSegment.TotalCount { + + var completeLogBytes []byte + for i := 0; i < gelfSegment.TotalCount; i++ { + completeLogBytes = append(completeLogBytes, gelfMessage.segments[i]...) + } + + message, err := gelfRcvInput.extractLog(ctx, completeLogBytes) // Handle as a full message + if err != nil { + gelfRcvInput.Logger().Error("Error during decompression(non-chunked)", zap.Error(err)) + } else { + if message.Full == "" { + gelfRcvInput.writeLog(ctx, message.Short) + } else { + gelfRcvInput.writeLog(ctx, message.Full) + } + } + + // Discarding the chunk even if the + delete(gelfRcvInput.lastBuffer, gelfSegment.Id) + } + + } else { + // if sequence number is not present in segment's range then log error and discard the key from map + gelfRcvInput.Logger().Error("Discarding out of range chunk") + delete(gelfRcvInput.lastBuffer, gelfSegment.Id) + } + } else { + gelfRcvInput.Logger().Error("Duplicate index in segment") + } + } else { + // if segment is not present in last_buffer then check current_buffer + gelfMessage, segmentExists := gelfRcvInput.buffer[gelfSegment.Id] + if segmentExists { + if len(gelfMessage.segments[gelfSegment.SequenceNumber]) == 0 { + // If the sequenceNumber is available then add + if (gelfSegment.SequenceNumber >= 0) && (gelfSegment.SequenceNumber < gelfSegment.TotalCount) { + // gelfRcvInput.lastBuffer[gelfSegment.Id] = ni + gelfMessage.segments[gelfSegment.SequenceNumber] = gelfSegment.Data + + gelfMessage.stored++ + + gelfRcvInput.Logger().Debug("current_buffer details", zap.Int("Stored in last_buffer: ", gelfMessage.stored), zap.Int("Total count in last_buffer: ", gelfSegment.TotalCount)) + + if gelfMessage.stored == gelfSegment.TotalCount { + + var completeLogBytes []byte + for i := 0; i < gelfSegment.TotalCount; i++ { + completeLogBytes = append(completeLogBytes, gelfMessage.segments[i]...) + } + + message, err := gelfRcvInput.extractLog(ctx, completeLogBytes) // Handle as a full message + if err != nil { + gelfRcvInput.Logger().Error("Error during decompression(non-chunked)", zap.Error(err)) + // return nil + } else { + if message.Full == "" { + gelfRcvInput.writeLog(ctx, message.Short) + } else { + gelfRcvInput.writeLog(ctx, message.Full) + } + } + + delete(gelfRcvInput.lastBuffer, gelfSegment.Id) + } + + } else { + // if sequence number is not present in segment's range then log error and discard the key from map + gelfRcvInput.Logger().Error("Discarding out of range chunk") + delete(gelfRcvInput.lastBuffer, gelfSegment.Id) + } + } else { + gelfRcvInput.Logger().Error("Duplicate index in segment") + } + } else { + // if segment is not present in current_buffer then add to current_buffer map + newGelfMessage := MapGelfMessage{ + stored: 0, + segments: [128][]byte{}, + } + + newGelfMessage.segments[gelfSegment.SequenceNumber] = gelfSegment.Data + + newGelfMessage.stored++ + + gelfRcvInput.buffer[gelfSegment.Id] = &newGelfMessage + } + } +} + +func (gelfRcvInput *Input) extractLog(ctx context.Context, data []byte) (*Message, error) { + + var decompressedDataReader io.ReadCloser + var reader io.Reader + var noCompression = false + var err error + + // Check the compression type and decompress accordingly + if bytes.HasPrefix(data, magicGzip) { + decompressedDataReader, err = gzip.NewReader(bytes.NewReader(data)) + } else if bytes.HasPrefix(data, magicZlib) && + (int(data[0])*256+int(data[1]))%31 == 0 { + decompressedDataReader, err = zlib.NewReader(bytes.NewReader(data)) + } else { + reader = bytes.NewReader(data) // No compression + noCompression = true + } + + if err != nil { + gelfRcvInput.Logger().Error("Error decompressing packet", zap.Error(err)) + return nil, err + } + + // Write the decompressed message + msg := new(Message) + + if noCompression { + if err := json.NewDecoder(reader).Decode(&msg); err != nil { + return nil, fmt.Errorf("json.Unmarshal: %s", err) + } + } else { + + if err := json.NewDecoder(decompressedDataReader).Decode(&msg); err != nil { + return nil, fmt.Errorf("json.Unmarshal: %s", err) + } + + decompressedDataReader.Close() + } + + return msg, nil +} + +func (gelfRcvInput *Input) writeLog(ctx context.Context, logMessage string) { + + entry, err := gelfRcvInput.NewEntry(string(logMessage)) + if err != nil { + gelfRcvInput.Logger().Error("Error creating log entry", zap.Error(err)) + // return nil + } + + gelfRcvInput.Write(ctx, entry) +} diff --git a/pkg/stanza/operator/input/gelfinternal/input_test.go b/pkg/stanza/operator/input/gelfinternal/input_test.go new file mode 100644 index 000000000000..7a1b84e8c743 --- /dev/null +++ b/pkg/stanza/operator/input/gelfinternal/input_test.go @@ -0,0 +1,64 @@ +package gelfinternal + +import ( + "context" + "encoding/json" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + + // "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + // "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" + // "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil" +) + +func TestHandleGELFMessage_FullMessage(t *testing.T) { + cfg := NewConfigWithID("test_input") + cfg.ListenAddress = ":0" + set := componenttest.NewNopTelemetrySettings() + op, build_err := cfg.Build(set) + require.NoError(t, build_err) + input, ok := op.(*Input) + require.True(t, ok) + input.Start(nil) + defer input.Stop() + + message := Message{ + Version: "1.1", + Host: "localhost", + Short: "hello-world", + Full: "hello-world", + TimeUnix: float64(time.Now().Unix()), + Level: 1, + Facility: "test", + } + + messageId := [8]byte{5, 1, 2, 3, 4, 5, 6, 7} + data, err := json.Marshal(message) + require.NoError(t, err) + + var packet []byte + + // Magic number + packet = append(packet, magicChunked...) + // Sequence Number + packet = append(packet, byte(1)) + // Total chunks + packet = append(packet, byte(1)) + // Message ID + packet = append(packet, messageId[:]...) + // Data + packet = append(packet, data...) + + input.HandleGELFMessage(context.Background(), packet, len(packet)) + + assert.Equal(t, 1, len(input.buffer)) + + assert.Equal(t, 0, len(input.lastBuffer)) + + input.HandleGELFMessage(context.Background(), packet, len(packet)) + +} \ No newline at end of file diff --git a/receiver/gelfreceiver/README.md b/receiver/gelfreceiver/README.md new file mode 100644 index 000000000000..63d15ea872ce --- /dev/null +++ b/receiver/gelfreceiver/README.md @@ -0,0 +1,64 @@ +# GELF log Receiver + + +| Status | | +| ------------- |-----------| +| Stability | [alpha]: logs | +| Distributions | [contrib] | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@BharatKJain](https://www.github.com/BharatKJain) | + + +[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib + + +Receives GELF logs over UDP. + +## Configuration Fields + +| Field | Default | Description | +| --- | --- | --- | +| `listen_address` | 0.0.0.0:31250 | A listen address of the form `:` | +| `protocol` | udp | Only supports UDP right now, support for TCP is pending | +| `async_readers` | 1 | Skip log tokenization, set to true if logs contains one log per record and multiline is not used. This will improve performance. | +| `async_processors` | 1 | A map of `key: value` pairs to add to the entry's resource | +| `udp_max_queue_length` | 100 | Determines max length of channel being used by async reader routines. When channel reaches max number, reader routine will block until channel has room. | +| `operators` | [] | An array of [operators](../../pkg/stanza/docs/operators/README.md#what-operators-are-available). See below for more details | + +### Operators + +Each operator performs a simple responsibility, such as parsing a timestamp or JSON. Chain together operators to process logs into a desired format. + +- Every operator has a `type`. +- Every operator can be given a unique `id`. If you use the same type of operator more than once in a pipeline, you must specify an `id`. Otherwise, the `id` defaults to the value of `type`. +- Operators will output to the next operator in the pipeline. The last operator in the pipeline will emit from the receiver. Optionally, the `output` parameter can be used to specify the `id` of another operator to which logs will be passed directly. +- Only parsers and general purpose operators should be used. + +### Parsers with Embedded Operations + +Many parsers operators can be configured to embed certain followup operations such as timestamp and severity parsing. For more information, see [complex parsers](../../pkg/stanza/docs/types/parsers.md#complex-parsers). + +#### `async_readers` and `async_processors` configuration + +| Field | Default | Description | +| --- | --- | --- | +| `async_readers` | 1 | Concurrency level - Determines how many go routines read from UDP port and push to channel (to be handled by processors). | +| `async_processors` | 1 | Concurrency level - Determines how many go routines read from channel (pushed by readers) and process logs (process logs means GELF format to OpenTelemetry Collector format) before sending downstream. | +| `udp_max_queue_length` | 100 | Determines max length of channel being used by async reader routines. When channel reaches max number, reader routine will block until channel has room. | + +## Example Configurations + +### Simple + +Configuration: + +```yaml +receivers: + gelfreceiver: + listen_address: "0.0.0.0:12201" + protocol: udp + async_readers: 3 + async_processors: 3 + udp_max_queue_length: 10000 +``` + diff --git a/receiver/gelfreceiver/docs.go b/receiver/gelfreceiver/docs.go new file mode 100644 index 000000000000..4634bab96be6 --- /dev/null +++ b/receiver/gelfreceiver/docs.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package gelfreceiver diff --git a/receiver/gelfreceiver/gelf.go b/receiver/gelfreceiver/gelf.go new file mode 100644 index 000000000000..9d0d4bc20716 --- /dev/null +++ b/receiver/gelfreceiver/gelf.go @@ -0,0 +1,59 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package gelfreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/gelfreceiver" + +import ( + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/receiver" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/consumerretry" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/adapter" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/gelfinternal" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/gelfreceiver/internal/metadata" +) + +// NewFactory creates a factory for filelog receiver +func NewFactory() receiver.Factory { + return adapter.NewFactory(ReceiverType{}, metadata.LogsStability) +} + +// ReceiverType implements stanza.LogReceiverType +// to create a file tailing receiver +type ReceiverType struct{} + +// Type is the receiver type +func (f ReceiverType) Type() component.Type { + return metadata.Type +} + +// CreateDefaultConfig creates a config with type and version +func (f ReceiverType) CreateDefaultConfig() component.Config { + return createDefaultConfig() +} +func createDefaultConfig() *FileLogConfig { + return &FileLogConfig{ + BaseConfig: adapter.BaseConfig{ + Operators: []operator.Config{}, + RetryOnFailure: consumerretry.NewDefaultConfig(), + }, + InputConfig: *gelfinternal.NewConfig(), + } +} + +// BaseConfig gets the base config from config, for now +func (f ReceiverType) BaseConfig(cfg component.Config) adapter.BaseConfig { + return cfg.(*FileLogConfig).BaseConfig +} + +// FileLogConfig defines configuration for the filelog receiver +type FileLogConfig struct { + InputConfig gelfinternal.Config `mapstructure:",squash"` + adapter.BaseConfig `mapstructure:",squash"` +} + +// InputConfig unmarshals the input operator +func (f ReceiverType) InputConfig(cfg component.Config) operator.Config { + return operator.NewConfig(&cfg.(*FileLogConfig).InputConfig) +} diff --git a/receiver/gelfreceiver/go.mod b/receiver/gelfreceiver/go.mod new file mode 100644 index 000000000000..d6da2f36726a --- /dev/null +++ b/receiver/gelfreceiver/go.mod @@ -0,0 +1,63 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/receiver/gelfreceiver + +go 1.22.0 + +require ( + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.111.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 + go.opentelemetry.io/collector/component v0.111.0 + go.opentelemetry.io/collector/receiver v0.111.0 + go.opentelemetry.io/otel/metric v1.30.0 + go.opentelemetry.io/otel/trace v1.30.0 +) + +require ( + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/expr-lang/expr v1.16.9 // indirect + github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/goccy/go-json v0.10.3 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/leodido/go-syslog/v4 v4.2.0 // indirect + github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect + github.com/magefile/mage v1.15.0 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/valyala/fastjson v1.6.4 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.111.0 // indirect + go.opentelemetry.io/collector/confmap v1.17.0 // indirect + go.opentelemetry.io/collector/consumer v0.111.0 // indirect + go.opentelemetry.io/collector/consumer/consumerprofiles v0.111.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.111.0 // indirect + go.opentelemetry.io/collector/extension v0.111.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.111.0 // indirect + go.opentelemetry.io/collector/featuregate v1.17.0 // indirect + go.opentelemetry.io/collector/internal/globalsignal v0.111.0 // indirect + go.opentelemetry.io/collector/pdata v1.17.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.111.0 // indirect + go.opentelemetry.io/collector/pipeline v0.111.0 // indirect + go.opentelemetry.io/collector/semconv v0.111.0 // indirect + go.opentelemetry.io/otel v1.30.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza => ../../pkg/stanza + +replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/gelfreceiver/internal/metadata => ../../internal/metadata diff --git a/receiver/gelfreceiver/go.sum b/receiver/gelfreceiver/go.sum new file mode 100644 index 000000000000..98b7b5bc96d8 --- /dev/null +++ b/receiver/gelfreceiver/go.sum @@ -0,0 +1,176 @@ +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= +github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= +github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= +github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= +github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= +github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.111.0 h1:n1p2DedLvPEN1XEx26s1PR1PCuXTgCY4Eo+kDTq7q0s= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.111.0/go.mod h1:PdhkBzDs6Qvcv3lxNQw0ztrGaa1foNBODrF2v09zlyA= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.111.0 h1:QhEwQTGTXitMPbmyloNfLVz1r9YzZ8izJUJivI8obzs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.111.0/go.mod h1:I7nEkR7TDPFw162jYtPJZVevkniQfQ0FLIFuu2RGK3A= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.111.0 h1:Hh3Lt6GIw/jMfCSJ5XjBoZRmjZ1pbJJu6Xi7WrDTUi0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.111.0/go.mod h1:rQ9lQhijXIJIT5UGuwiKoEcWW6bdWJ4fnO+PndfuYEw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= +github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/component v0.111.0 h1:AiDIrhkq6sbHnU9Rhq6t4DC4Gal43bryd1+NTJNojAQ= +go.opentelemetry.io/collector/component v0.111.0/go.mod h1:wYwbRuhzK5bm5x1bX+ukm1tT50QXYLs4MKwzyfiVGoE= +go.opentelemetry.io/collector/config/configtelemetry v0.111.0 h1:Q3TJRM2A3FIDjIvzWa3uFArsdFN0I/0GzcWynHjC+oY= +go.opentelemetry.io/collector/config/configtelemetry v0.111.0/go.mod h1:R0MBUxjSMVMIhljuDHWIygzzJWQyZHXXWIgQNxcFwhc= +go.opentelemetry.io/collector/confmap v1.17.0 h1:5UKHtPGtzNGaOGBsJ6aFpvsKElNUXOVuErBfC0eTWLM= +go.opentelemetry.io/collector/confmap v1.17.0/go.mod h1:GrIZ12P/9DPOuTpe2PIS51a0P/ZM6iKtByVee1Uf3+k= +go.opentelemetry.io/collector/consumer v0.111.0 h1:d2kRTDnu+p0q4D5fTU+Pk59KRm5F2JRYrk30Ep5j0xI= +go.opentelemetry.io/collector/consumer v0.111.0/go.mod h1:FjY9bPbVkFZLKKxnNbGsIqaz3lcFDKGf+7wxA1uCugs= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.111.0 h1:w9kGdTaXdwD/ZtbxVOvuYQEFKBX3THQgEz/enQnMt9s= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.111.0/go.mod h1:Ebt1jDdrQb3G2sNHrWHNr5wS3UJ9k3h8LHCqUPTbxLY= +go.opentelemetry.io/collector/consumer/consumertest v0.111.0 h1:ZEikGRPdrhVAq7xhJVc8WapRBVN/CdPnMEnXgpRGu1U= +go.opentelemetry.io/collector/consumer/consumertest v0.111.0/go.mod h1:EHPrn8ovcTGdTDlCEi1grOXSP3jUUYU0zvl92uA5L+4= +go.opentelemetry.io/collector/extension v0.111.0 h1:oagGQS3k6Etnm5N5OEkfIWrX4/77t/ZP+B0xfTPUVm8= +go.opentelemetry.io/collector/extension v0.111.0/go.mod h1:ELCpDNpS2qb/31Z8pCMmqTkzfnUV3CanQZMwLW+GCMI= +go.opentelemetry.io/collector/extension/experimental/storage v0.111.0 h1:kUJSFjm6IQ6nmcJlfSFPvcEO/XeOP9gJY0Qz9O98DKg= +go.opentelemetry.io/collector/extension/experimental/storage v0.111.0/go.mod h1:qQGvl8Kz2W8b7QywtE8GNqWJMDBo47cjoiIXYuE+/zM= +go.opentelemetry.io/collector/featuregate v1.17.0 h1:vpfXyWe7DFqCsDArsR9rAKKtVpt72PKjzjeqPegViws= +go.opentelemetry.io/collector/featuregate v1.17.0/go.mod h1:47xrISO71vJ83LSMm8+yIDsUbKktUp48Ovt7RR6VbRs= +go.opentelemetry.io/collector/internal/globalsignal v0.111.0 h1:oq0nSD+7K2Q1Fx5d3s6lPRdKZeTL0FEg4sIaR7ZJzIc= +go.opentelemetry.io/collector/internal/globalsignal v0.111.0/go.mod h1:GqMXodPWOxK5uqpX8MaMXC2389y2XJTa5nPwf8FYDK8= +go.opentelemetry.io/collector/pdata v1.17.0 h1:z8cjjT2FThAehWu5fbF48OnZyK5q8xd1UhC4XszDo0w= +go.opentelemetry.io/collector/pdata v1.17.0/go.mod h1:yZaQ9KZAm/qie96LTygRKxOXMq0/54h8OW7330ycuvQ= +go.opentelemetry.io/collector/pdata/pprofile v0.111.0 h1:4if6rItcX8a6X4bIh6lwQnlE+ncKXQaIim7F5O7ZA58= +go.opentelemetry.io/collector/pdata/pprofile v0.111.0/go.mod h1:iBwrNFB6za1qspy46ZE41H3MmcxUogn2AuYbrWdoMd8= +go.opentelemetry.io/collector/pdata/testdata v0.111.0 h1:Fqyf1NJ0az+HbsvKSCNw8pfa1Y6c4FhZwlMK4ZulG0s= +go.opentelemetry.io/collector/pdata/testdata v0.111.0/go.mod h1:7SypOzbVtRsCkns6Yxa4GztnkVGkk7b9fW24Ow75q5s= +go.opentelemetry.io/collector/pipeline v0.111.0 h1:qENDGvWWnDXguEfmj8eO+5kr8Y6XFKytU5SuMinz3Ls= +go.opentelemetry.io/collector/pipeline v0.111.0/go.mod h1:ZZMU3019geEU283rTW5M/LkcqLqHp/YI2Nl6/Vp68PQ= +go.opentelemetry.io/collector/receiver v0.111.0 h1:6cRHZ9cUxYfRPkArUCkIhoo7Byf6tq/2qvbMIKlhG3s= +go.opentelemetry.io/collector/receiver v0.111.0/go.mod h1:QSl/n9ikDP+6n39QcRY/VLjwQI0qbT1RQp512uBQl3g= +go.opentelemetry.io/collector/receiver/receiverprofiles v0.111.0 h1:oYLAdGMQQR7gB6wVkbV0G4EMsrmiOs3O0qf3hh/3avw= +go.opentelemetry.io/collector/receiver/receiverprofiles v0.111.0/go.mod h1:M/OfdEGnvyB+fSTSW4RPKj5N06FXL8oKSIf60FlrKmM= +go.opentelemetry.io/collector/semconv v0.111.0 h1:ELleMtLBzeZ3xhfhYPmFcLc0hJMqRxhOB0eY60WLivw= +go.opentelemetry.io/collector/semconv v0.111.0/go.mod h1:zCJ5njhWpejR+A40kiEoeFm1xq1uzyZwMnRNX6/D82A= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= +go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM= +go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/receiver/gelfreceiver/internal/metadata/generated_status.go b/receiver/gelfreceiver/internal/metadata/generated_status.go new file mode 100644 index 000000000000..423cd7b57ea3 --- /dev/null +++ b/receiver/gelfreceiver/internal/metadata/generated_status.go @@ -0,0 +1,15 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("gelfreceiver") +) + +const ( + LogsStability = component.StabilityLevelAlpha +) diff --git a/receiver/gelfreceiver/internal/metadata/generated_telemetry.go b/receiver/gelfreceiver/internal/metadata/generated_telemetry.go new file mode 100644 index 000000000000..9eb47844c5fe --- /dev/null +++ b/receiver/gelfreceiver/internal/metadata/generated_telemetry.go @@ -0,0 +1,17 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" +) + +func Meter(settings component.TelemetrySettings) metric.Meter { + return settings.MeterProvider.Meter("otelcol/filelogreceiver") +} + +func Tracer(settings component.TelemetrySettings) trace.Tracer { + return settings.TracerProvider.Tracer("otelcol/filelogreceiver") +} diff --git a/receiver/gelfreceiver/metadata.yaml b/receiver/gelfreceiver/metadata.yaml new file mode 100644 index 000000000000..85e5f78f125a --- /dev/null +++ b/receiver/gelfreceiver/metadata.yaml @@ -0,0 +1,15 @@ +type: gelfreceiver +scope_name: otelcol/gelfreceiver + +status: + class: receiver + stability: + alpha: [logs] + distributions: [contrib] + codeowners: + active: [BharatKJain] + emeritus: [BharatKJain] + seeking_new: true + +tests: + config: diff --git a/receiver/gelfreceiver/sample-config.yaml b/receiver/gelfreceiver/sample-config.yaml new file mode 100644 index 000000000000..9189fdc5b324 --- /dev/null +++ b/receiver/gelfreceiver/sample-config.yaml @@ -0,0 +1,7 @@ +receivers: + gelfreceiver: + listen_address: "0.0.0.0:12201" + protocol: udp + async_readers: 3 + async_processors: 3 + udp_max_queue_length: 10000 \ No newline at end of file