From 48ad9aa096dce9b00abc8d839a3c64d7ede98d32 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Thu, 21 Mar 2024 01:20:43 -0700 Subject: [PATCH 01/46] [receiver/splunkhecreceiver] use ACK extension in HEC receiver --- .chloggen/hec_receiver_ack.yaml | 27 ++ internal/splunk/common.go | 9 +- receiver/splunkhecreceiver/config.go | 5 + receiver/splunkhecreceiver/config_test.go | 2 + receiver/splunkhecreceiver/factory.go | 1 + .../internal/mocks/ack_extension.go | 109 +++++ receiver/splunkhecreceiver/receiver.go | 180 ++++++- receiver/splunkhecreceiver/receiver_test.go | 450 +++++++++++++++++- 8 files changed, 759 insertions(+), 24 deletions(-) create mode 100644 .chloggen/hec_receiver_ack.yaml create mode 100644 receiver/splunkhecreceiver/internal/mocks/ack_extension.go diff --git a/.chloggen/hec_receiver_ack.yaml b/.chloggen/hec_receiver_ack.yaml new file mode 100644 index 0000000000000..41125cecf741d --- /dev/null +++ b/.chloggen/hec_receiver_ack.yaml @@ -0,0 +1,27 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: 'enhancement' + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: 'splunkhecreceiver' + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: "adding support for ack in the splunkhecreceiver" + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [26376] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [user] \ No newline at end of file diff --git a/internal/splunk/common.go b/internal/splunk/common.go index 7792b73381da6..b889066a914c6 100644 --- a/internal/splunk/common.go +++ b/internal/splunk/common.go @@ -23,11 +23,14 @@ const ( DefaultSeverityTextLabel = "otel.log.severity.text" DefaultSeverityNumberLabel = "otel.log.severity.number" HECTokenHeader = "Splunk" - HecTokenLabel = "com.splunk.hec.access_token" // #nosec + HttpSplunkChannelHeader = "X-Splunk-Request-Channel" + + HecTokenLabel = "com.splunk.hec.access_token" // #nosec // HecEventMetricType is the type of HEC event. Set to metric, as per https://docs.splunk.com/Documentation/Splunk/8.0.3/Metrics/GetMetricsInOther. HecEventMetricType = "metric" DefaultRawPath = "/services/collector/raw" DefaultHealthPath = "/services/collector/health" + DefaultAckPath = "/services/collector/ack" ) // AccessTokenPassthroughConfig configures passing through access tokens. @@ -112,3 +115,7 @@ type HecToOtelAttrs struct { // Host indicates the mapping of the host field to a specific unified model attribute. Host string `mapstructure:"host"` } + +type AckRequest struct { + Acks []uint64 `json:"acks"` +} diff --git a/receiver/splunkhecreceiver/config.go b/receiver/splunkhecreceiver/config.go index 095151aa62887..8fe8cad340a7c 100644 --- a/receiver/splunkhecreceiver/config.go +++ b/receiver/splunkhecreceiver/config.go @@ -4,6 +4,7 @@ package splunkhecreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver" import ( + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" @@ -29,4 +30,8 @@ type Config struct { HealthPath string `mapstructure:"health_path"` // HecToOtelAttrs creates a mapping from HEC metadata to attributes. HecToOtelAttrs splunk.HecToOtelAttrs `mapstructure:"hec_metadata_to_otel_attrs"` + // AckExtension defines the extension to use for acking of events + AckExtension *component.ID `mapstructure:"ack_extension"` + // AckPath for Ack API, default is '/services/collector/ack' + AckPath string `mapstructure:"ack_path"` } diff --git a/receiver/splunkhecreceiver/config_test.go b/receiver/splunkhecreceiver/config_test.go index 22a73fbd3a0d4..0a8ed8ead479a 100644 --- a/receiver/splunkhecreceiver/config_test.go +++ b/receiver/splunkhecreceiver/config_test.go @@ -44,6 +44,7 @@ func TestLoadConfig(t *testing.T) { RawPath: "/foo", Splitting: SplittingStrategyLine, HealthPath: "/bar", + AckPath: "/services/collector/ack", HecToOtelAttrs: splunk.HecToOtelAttrs{ Source: "file.name", SourceType: "foobar", @@ -70,6 +71,7 @@ func TestLoadConfig(t *testing.T) { RawPath: "/services/collector/raw", Splitting: SplittingStrategyLine, HealthPath: "/services/collector/health", + AckPath: "/services/collector/ack", HecToOtelAttrs: splunk.HecToOtelAttrs{ Source: "com.splunk.source", SourceType: "com.splunk.sourcetype", diff --git a/receiver/splunkhecreceiver/factory.go b/receiver/splunkhecreceiver/factory.go index 7bce66a2d0bb5..da774518997a4 100644 --- a/receiver/splunkhecreceiver/factory.go +++ b/receiver/splunkhecreceiver/factory.go @@ -49,6 +49,7 @@ func createDefaultConfig() component.Config { }, RawPath: splunk.DefaultRawPath, HealthPath: splunk.DefaultHealthPath, + AckPath: splunk.DefaultAckPath, Splitting: SplittingStrategyLine, } } diff --git a/receiver/splunkhecreceiver/internal/mocks/ack_extension.go b/receiver/splunkhecreceiver/internal/mocks/ack_extension.go new file mode 100644 index 0000000000000..d707ed33d5152 --- /dev/null +++ b/receiver/splunkhecreceiver/internal/mocks/ack_extension.go @@ -0,0 +1,109 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + component "go.opentelemetry.io/collector/component" + + mock "github.com/stretchr/testify/mock" +) + +// AckExtension is an autogenerated mock type for the AckExtension type +type AckExtension struct { + mock.Mock +} + +// Ack provides a mock function with given fields: partitionID, ackID +func (_m *AckExtension) Ack(partitionID string, ackID uint64) { + _m.Called(partitionID, ackID) +} + +// ProcessEvent provides a mock function with given fields: partitionID +func (_m *AckExtension) ProcessEvent(partitionID string) uint64 { + ret := _m.Called(partitionID) + + if len(ret) == 0 { + panic("no return value specified for ProcessEvent") + } + + var r0 uint64 + if rf, ok := ret.Get(0).(func(string) uint64); ok { + r0 = rf(partitionID) + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// QueryAcks provides a mock function with given fields: partitionID, ackIDs +func (_m *AckExtension) QueryAcks(partitionID string, ackIDs []uint64) map[uint64]bool { + ret := _m.Called(partitionID, ackIDs) + + if len(ret) == 0 { + panic("no return value specified for QueryAcks") + } + + var r0 map[uint64]bool + if rf, ok := ret.Get(0).(func(string, []uint64) map[uint64]bool); ok { + r0 = rf(partitionID, ackIDs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[uint64]bool) + } + } + + return r0 +} + +// Shutdown provides a mock function with given fields: ctx +func (_m *AckExtension) Shutdown(ctx context.Context) error { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for Shutdown") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(ctx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Start provides a mock function with given fields: ctx, host +func (_m *AckExtension) Start(ctx context.Context, host component.Host) error { + ret := _m.Called(ctx, host) + + if len(ret) == 0 { + panic("no return value specified for Start") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, component.Host) error); ok { + r0 = rf(ctx, host) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewAckExtension creates a new instance of AckExtension. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAckExtension(t interface { + mock.TestingT + Cleanup(func()) +}) *AckExtension { + mock := &AckExtension{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} \ No newline at end of file diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index ef26c3b415f4b..8f8b1eb4109e0 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -6,6 +6,7 @@ package splunkhecreceiver // import "github.com/open-telemetry/opentelemetry-col import ( "compress/gzip" "context" + "encoding/json" "errors" "fmt" "io" @@ -25,6 +26,9 @@ import ( "go.opentelemetry.io/collector/receiver/receiverhelper" "go.uber.org/zap" + "github.com/google/uuid" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver/internal/metadata" ) @@ -32,9 +36,12 @@ import ( const ( defaultServerTimeout = 20 * time.Second + ackResponse = `{"acks": %s}` responseOK = `{"text": "Success", "code": 0}` + responseOKWithAckID = `{"text": "Success", "code": 0, "ackId": %d}` responseHecHealthy = `{"text": "HEC is healthy", "code": 17}` - responseInvalidMethod = `"Only \"POST\" method is supported"` + responseInvalidMethodPostOnly = `"Only \"POST\" method is supported"` + responseInvalidMethodGetOnly = `"Only \"GET\" method is supported"` responseInvalidEncoding = `"\"Content-Encoding\" must be \"gzip\" or empty"` responseInvalidDataFormat = `{"text":"Invalid data format","code":6}` responseErrEventRequired = `{"text":"Event field is required","code":12}` @@ -45,6 +52,8 @@ const ( responseErrUnsupportedMetricEvent = `"Unsupported metric event"` responseErrUnsupportedLogEvent = `"Unsupported log event"` responseErrHandlingIndexedFields = `{"text":"Error in handling indexed fields","code":15,"invalid-event-number":%d}` + responseErrDataChannelMissing = `{"text": "Data channel is missing","code":10}` + responseErrInvalidDataChannel = `{"text": "Invalid data channel", "code": 11}` responseNoData = `{"text":"No data","code":5}` // Centralizing some HTTP and related string constants. gzipEncoding = "gzip" @@ -59,19 +68,23 @@ var ( errEmptyEndpoint = errors.New("empty endpoint") errInvalidMethod = errors.New("invalid http method") errInvalidEncoding = errors.New("invalid encoding") - - okRespBody = []byte(responseOK) - eventRequiredRespBody = []byte(responseErrEventRequired) - eventBlankRespBody = []byte(responseErrEventBlank) - invalidEncodingRespBody = []byte(responseInvalidEncoding) - invalidFormatRespBody = []byte(responseInvalidDataFormat) - invalidMethodRespBody = []byte(responseInvalidMethod) - errGzipReaderRespBody = []byte(responseErrGzipReader) - errUnmarshalBodyRespBody = []byte(responseErrUnmarshalBody) - errInternalServerError = []byte(responseErrInternalServerError) - errUnsupportedMetricEvent = []byte(responseErrUnsupportedMetricEvent) - errUnsupportedLogEvent = []byte(responseErrUnsupportedLogEvent) - noDataRespBody = []byte(responseNoData) + errExtensionMissing = errors.New("ack extension not found") + + okRespBody = []byte(responseOK) + eventRequiredRespBody = []byte(responseErrEventRequired) + eventBlankRespBody = []byte(responseErrEventBlank) + requiredDataChannelHeader = []byte(responseErrDataChannelMissing) + invalidDataChannelHeader = []byte(responseErrInvalidDataChannel) + invalidEncodingRespBody = []byte(responseInvalidEncoding) + invalidFormatRespBody = []byte(responseInvalidDataFormat) + invalidMethodRespBodyPostOnly = []byte(responseInvalidMethodPostOnly) + invalidMethodRespBodyGetOnly = []byte(responseInvalidMethodGetOnly) + errGzipReaderRespBody = []byte(responseErrGzipReader) + errUnmarshalBodyRespBody = []byte(responseErrUnmarshalBody) + errInternalServerError = []byte(responseErrInternalServerError) + errUnsupportedMetricEvent = []byte(responseErrUnsupportedMetricEvent) + errUnsupportedLogEvent = []byte(responseErrUnsupportedLogEvent) + noDataRespBody = []byte(responseNoData) ) // splunkReceiver implements the receiver.Metrics for Splunk HEC metric protocol. @@ -84,6 +97,7 @@ type splunkReceiver struct { shutdownWG sync.WaitGroup obsrecv *receiverhelper.ObsReport gzipReaderPool *sync.Pool + ackExt ackextension.AckExtension } var _ receiver.Metrics = (*splunkReceiver)(nil) @@ -213,6 +227,17 @@ func (r *splunkReceiver) Start(_ context.Context, host component.Host) error { r.server.WriteTimeout = defaultServerTimeout r.shutdownWG.Add(1) + + // set up the ack API handler if the ack extension is present + if storageID := r.config.AckExtension; storageID != nil { + if ext, found := host.GetExtensions()[*storageID]; found { + r.ackExt = ext.(ackextension.AckExtension) + mx.NewRoute().Path(r.config.AckPath).HandlerFunc(r.handleAck) + } else { + return fmt.Errorf("specified ack extension with id '%q' could not be found", *storageID) + } + } + go func() { defer r.shutdownWG.Done() if errHTTP := r.server.Serve(ln); !errors.Is(errHTTP, http.ErrServerClosed) && errHTTP != nil { @@ -231,20 +256,73 @@ func (r *splunkReceiver) Shutdown(context.Context) error { return err } -func (r *splunkReceiver) writeSuccessResponse(ctx context.Context, resp http.ResponseWriter, eventCount int) { +func (r *splunkReceiver) writeSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, ackID uint64) { + r.writeSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) +} + +func (r *splunkReceiver) writeSuccessResponseWithoutAck(ctx context.Context, resp http.ResponseWriter, eventCount int) { + r.writeSuccessResponse(ctx, resp, eventCount, okRespBody) +} + +func (r *splunkReceiver) writeSuccessAckResponse(ctx context.Context, resp http.ResponseWriter, acks map[uint64]bool) { + ackString, _ := json.Marshal(acks) + r.writeSuccessResponse(ctx, resp, 0, []byte(fmt.Sprintf(ackResponse, ackString))) +} + +func (r *splunkReceiver) writeSuccessResponse(ctx context.Context, resp http.ResponseWriter, eventCount int, bodyContent []byte) { resp.Header().Set(httpContentTypeHeader, httpJSONTypeHeader) resp.WriteHeader(http.StatusOK) - if _, err := resp.Write(okRespBody); err != nil { + if _, err := resp.Write(bodyContent); err != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, eventCount, err) } } +func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) { + ctx := req.Context() + if req.Method != http.MethodPost { + r.failRequest(ctx, resp, http.StatusBadRequest, invalidMethodRespBodyPostOnly, 0, errInvalidMethod) + return + } + + // shouldn't run into this case since we only enable this handler IF ackExt exists. But we have this check just in case + if r.ackExt == nil { + r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, 0, errExtensionMissing) + return + } + + // check that the channel exists + partitionID := req.Header.Get(splunk.HttpSplunkChannelHeader) + if len(partitionID) <= 0 { + r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) + return + } + + // check validity of channel + _, err := uuid.Parse(partitionID) + if err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) + return + } + + dec := json.NewDecoder(req.Body) + var ackRequest splunk.AckRequest + + err = dec.Decode(&ackRequest) + if err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, invalidFormatRespBody, 0, err) + return + } + + queriedAcks := r.ackExt.QueryAcks(partitionID, ackRequest.Acks) + r.writeSuccessAckResponse(req.Context(), resp, queriedAcks) +} + func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Request) { ctx := req.Context() ctx = r.obsrecv.StartLogsOp(ctx) if req.Method != http.MethodPost { - r.failRequest(ctx, resp, http.StatusBadRequest, invalidMethodRespBody, 0, errInvalidMethod) + r.failRequest(ctx, resp, http.StatusBadRequest, invalidMethodRespBodyPostOnly, 0, errInvalidMethod) return } @@ -254,6 +332,22 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques return } + var partitionID string + if r.ackExt != nil { + // check channel header exists + partitionID = req.Header.Get(splunk.HttpSplunkChannelHeader) + if len(partitionID) <= 0 { + r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) + return + } + // check validity of channel + _, err := uuid.Parse(partitionID) + if err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) + return + } + } + if req.ContentLength == 0 { r.obsrecv.EndLogsOp(ctx, metadata.Type.String(), 0, nil) r.failRequest(ctx, resp, http.StatusBadRequest, noDataRespBody, 0, nil) @@ -295,14 +389,27 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, slLen, err) return } + + var ackID uint64 + if r.ackExt != nil { + ackID = r.ackExt.ProcessEvent(partitionID) + } + consumerErr := r.logsConsumer.ConsumeLogs(ctx, ld) + if r.ackExt != nil { + r.ackExt.Ack(partitionID, ackID) + } _ = bodyReader.Close() if consumerErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, slLen, consumerErr) } else { - r.writeSuccessResponse(ctx, resp, ld.LogRecordCount()) + if r.ackExt != nil { + r.writeSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), ackID) + } else { + r.writeSuccessResponseWithoutAck(ctx, resp, ld.LogRecordCount()) + } r.obsrecv.EndLogsOp(ctx, metadata.Type.String(), slLen, nil) } } @@ -317,7 +424,7 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } if req.Method != http.MethodPost { - r.failRequest(ctx, resp, http.StatusBadRequest, invalidMethodRespBody, 0, errInvalidMethod) + r.failRequest(ctx, resp, http.StatusBadRequest, invalidMethodRespBodyPostOnly, 0, errInvalidMethod) return } @@ -327,6 +434,22 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) return } + var partitionID string + if r.ackExt != nil { + // check channel header exists + partitionID = req.Header.Get(splunk.HttpSplunkChannelHeader) + if len(partitionID) <= 0 { + r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) + return + } + // check validity of channel + _, err := uuid.Parse(partitionID) + if err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) + return + } + } + bodyReader := req.Body if encoding == gzipEncoding { reader := r.gzipReaderPool.Get().(*gzip.Reader) @@ -389,6 +512,12 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } resourceCustomizer := r.createResourceCustomizer(req) + + var ackID uint64 + if r.ackExt != nil { + ackID = r.ackExt.ProcessEvent(partitionID) + } + if r.logsConsumer != nil && len(events) > 0 { ld, err := splunkHecToLogData(r.settings.Logger, events, resourceCustomizer, r.config) if err != nil { @@ -396,17 +525,22 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) return } decodeErr := r.logsConsumer.ConsumeLogs(ctx, ld) + if r.ackExt != nil { + r.ackExt.Ack(partitionID, ackID) + } r.obsrecv.EndLogsOp(ctx, metadata.Type.String(), len(events), decodeErr) if decodeErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, len(events), decodeErr) return } - } if r.metricsConsumer != nil && len(metricEvents) > 0 { md, _ := splunkHecToMetricsData(r.settings.Logger, metricEvents, resourceCustomizer, r.config) decodeErr := r.metricsConsumer.ConsumeMetrics(ctx, md) + if r.ackExt != nil { + r.ackExt.Ack(partitionID, ackID) + } r.obsrecv.EndMetricsOp(ctx, metadata.Type.String(), len(metricEvents), decodeErr) if decodeErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, len(metricEvents), decodeErr) @@ -414,7 +548,11 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } } - r.writeSuccessResponse(ctx, resp, len(events)+len(metricEvents)) + if r.ackExt != nil { + r.writeSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), ackID) + } else { + r.writeSuccessResponseWithoutAck(ctx, resp, len(events)+len(metricEvents)) + } } func (r *splunkReceiver) createResourceCustomizer(req *http.Request) func(resource pcommon.Resource) { diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index ec7ab4c2ed963..d7f43df613773 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -35,13 +35,18 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver/internal/mocks" ) -func assertHecSuccessResponse(t *testing.T, resp *http.Response, body any) { +func assertHecSuccessResponse(t *testing.T, resp *http.Response, body any, ackID ...uint64) { status := resp.StatusCode assert.Equal(t, http.StatusOK, status) assert.Equal(t, httpJSONTypeHeader, resp.Header.Get(httpContentTypeHeader)) - assert.Equal(t, map[string]any{"code": float64(0), "text": "Success"}, body) + if len(ackID) > 0 { + assert.Equal(t, map[string]any{"code": float64(0), "text": "Success", "ackId": float64(ackID[0])}, body) + } else { + assert.Equal(t, map[string]any{"code": float64(0), "text": "Success"}, body) + } } func Test_splunkhecreceiver_NewLogsReceiver(t *testing.T) { @@ -888,6 +893,14 @@ func buildSplunkHecMsg(time float64, dimensions uint) *splunk.Event { return ev } +func buildSplunkHecAckMsg(acks []uint64) *splunk.AckRequest { + ar := &splunk.AckRequest{ + Acks: acks, + } + + return ar +} + type badReqBody struct{} var _ io.ReadCloser = (*badReqBody)(nil) @@ -1069,6 +1082,7 @@ func Test_splunkhecReceiver_handleRawReq(t *testing.T) { assert.NoError(t, err) r := rcv.(*splunkReceiver) + assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) defer func() { assert.NoError(t, r.Shutdown(context.Background())) @@ -1091,6 +1105,429 @@ func Test_splunkhecReceiver_handleRawReq(t *testing.T) { } } +func Test_splunkhecReceiver_Start(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + getConfig func() *Config + errorExpected bool + }{ + { + name: "no_ack_extension_configured", + getConfig: func() *Config { + return createDefaultConfig().(*Config) + }, + errorExpected: false, + }, + { + name: "ack_extension_does_not_exist", + getConfig: func() *Config { + config := createDefaultConfig().(*Config) + config.AckExtension = &component.ID{} + return config + }, + errorExpected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sink := new(consumertest.LogsSink) + rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *tt.getConfig(), sink) + assert.NoError(t, err) + + r := rcv.(*splunkReceiver) + if tt.errorExpected { + assert.Error(t, r.Start(context.Background(), componenttest.NewNopHost())) + } else { + assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) + } + }) + } + +} + +func Test_splunkhecReceiver_handleAck(t *testing.T) { + t.Parallel() + config := createDefaultConfig().(*Config) + config.Endpoint = "localhost:0" // Actually not creating the endpoint + config.AckPath = "/ack" + id := component.MustNewID("ack_extension") + config.AckExtension = &id + + tests := []struct { + name string + req *http.Request + setupMockAckExtension func(t *testing.T) component.Component + assertResponse func(t *testing.T, resp *http.Response, body any) + }{ + { + name: "incorrect_method", + req: httptest.NewRequest("PUT", "http://localhost/ack", nil), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, "Only \"POST\" method is supported", body) + }, + }, + { + name: "no_channel_header", + req: func() *http.Request { + req := httptest.NewRequest("POST", "http://localhost/ack", nil) + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"code": float64(10), "text": "Data channel is missing"}, body) + }, + }, + { + name: "invalid_channel_header", + req: func() *http.Request { + req := httptest.NewRequest("POST", "http://localhost/ack", nil) + req.Header.Set("X-Splunk-Request-Channel", "invalid-id") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data channel", "code": float64(11)}, body) + }, + }, + { + name: "empty_request_body", + req: func() *http.Request { + req := httptest.NewRequest("POST", "http://localhost/ack", nil) + req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data format", "code": float64(6)}, body) + }, + }, + { + name: "invalid_request_body", + req: func() *http.Request { + req := httptest.NewRequest("POST", "http://localhost/ack", bytes.NewReader([]byte(`hi there`))) + req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data format", "code": float64(6)}, body) + }, + }, + { + name: "happy_path", + req: func() *http.Request { + msgBytes, err := json.Marshal(buildSplunkHecAckMsg([]uint64{1, 2, 3})) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/ack", bytes.NewReader(msgBytes)) + req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + mockAckExtension.On("QueryAcks", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", []uint64{1, 2, 3}).Once().Return(map[uint64]bool{ + 1: true, + 2: false, + 3: true, + }) + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusOK, status) + assert.Equal(t, map[string]any{"acks": map[string]any{ + "1": true, + "2": false, + "3": true, + }}, body) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sink := new(consumertest.LogsSink) + rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) + assert.NoError(t, err) + + mockHost := mockHost{extensions: map[component.ID]component.Component{ + id: tt.setupMockAckExtension(t), + }} + + r := rcv.(*splunkReceiver) + assert.NoError(t, r.Start(context.Background(), mockHost)) + defer func() { + assert.NoError(t, r.Shutdown(context.Background())) + }() + w := httptest.NewRecorder() + r.handleAck(w, tt.req) + + resp := w.Result() + respBytes, err := io.ReadAll(resp.Body) + assert.NoError(t, err) + defer resp.Body.Close() + + var body any + if len(respBytes) > 0 { + assert.NoError(t, json.Unmarshal(respBytes, &body)) + } + + tt.assertResponse(t, resp, body) + }) + } +} + +func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { + t.Parallel() + config := createDefaultConfig().(*Config) + config.Endpoint = "localhost:0" // Actually not creating the endpoint + config.RawPath = "/foo" + id := component.MustNewID("ack_extension") + config.AckExtension = &id + currentTime := float64(time.Now().UnixNano()) / 1e6 + splunkMsg := buildSplunkHecMsg(currentTime, 3) + + tests := []struct { + name string + req *http.Request + setupMockAckExtension func(t *testing.T) component.Component + assertResponse func(t *testing.T, resp *http.Response, body any) + }{ + { + name: "no_channel_header", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"code": float64(10), "text": "Data channel is missing"}, body) + }, + }, + { + name: "invalid_channel_header", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + req.Header.Set("X-Splunk-Request-Channel", "invalid-id") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data channel", "code": float64(11)}, body) + }, + }, + { + name: "happy_path", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + mockAckExtension.On("ProcessEvent", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90").Once().Return(uint64(1)) + mockAckExtension.On("Ack", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", uint64(1)).Once() + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + assertHecSuccessResponse(t, resp, body, 1) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sink := new(consumertest.LogsSink) + rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) + assert.NoError(t, err) + + mockHost := mockHost{extensions: map[component.ID]component.Component{ + id: tt.setupMockAckExtension(t), + }} + + r := rcv.(*splunkReceiver) + assert.NoError(t, r.Start(context.Background(), mockHost)) + defer func() { + assert.NoError(t, r.Shutdown(context.Background())) + }() + w := httptest.NewRecorder() + r.handleRawReq(w, tt.req) + + resp := w.Result() + respBytes, err := io.ReadAll(resp.Body) + assert.NoError(t, err) + defer resp.Body.Close() + + var body any + if len(respBytes) > 0 { + assert.NoError(t, json.Unmarshal(respBytes, &body)) + } + + tt.assertResponse(t, resp, body) + }) + } +} + +func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { + config := createDefaultConfig().(*Config) + config.Endpoint = "localhost:0" // Actually not creating the endpoint + id := component.MustNewID("ack_extension") + config.AckExtension = &id + currentTime := float64(time.Now().UnixNano()) / 1e6 + splunkMsg := buildSplunkHecMsg(currentTime, 3) + + tests := []struct { + name string + req *http.Request + assertResponse func(t *testing.T, resp *http.Response, body any) + assertSink func(t *testing.T, sink *consumertest.LogsSink) + setupMockAckExtension func(t *testing.T) component.Component + }{ + { + name: "no_channel_header", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"code": float64(10), "text": "Data channel is missing"}, body) + }, + assertSink: func(t *testing.T, sink *consumertest.LogsSink) { + assert.Equal(t, 0, len(sink.AllLogs())) + }, + }, + { + name: "invalid_channel_header", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + req.Header.Set("X-Splunk-Request-Channel", "invalid-id") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data channel", "code": float64(11)}, body) + }, + assertSink: func(t *testing.T, sink *consumertest.LogsSink) { + assert.Equal(t, 0, len(sink.AllLogs())) + }, + }, + { + name: "msg_accepted", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + mockAckExtension.On("ProcessEvent", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90").Once().Return(uint64(1)) + mockAckExtension.On("Ack", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", uint64(1)).Once() + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + assertHecSuccessResponse(t, resp, body, 1) + }, + assertSink: func(t *testing.T, sink *consumertest.LogsSink) { + assert.Equal(t, 1, len(sink.AllLogs())) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sink := new(consumertest.LogsSink) + + rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) + assert.NoError(t, err) + + r := rcv.(*splunkReceiver) + w := httptest.NewRecorder() + + mockHost := mockHost{extensions: map[component.ID]component.Component{ + id: tt.setupMockAckExtension(t), + }} + + assert.NoError(t, r.Start(context.Background(), mockHost)) + r.handleReq(w, tt.req) + + resp := w.Result() + defer resp.Body.Close() + respBytes, err := io.ReadAll(resp.Body) + assert.NoError(t, err) + + var body any + fmt.Println(string(respBytes)) + assert.NoError(t, json.Unmarshal(respBytes, &body)) + + tt.assertResponse(t, resp, body) + if tt.assertSink != nil { + tt.assertSink(t, sink) + } + }) + } +} + func Test_splunkhecreceiver_handleHealthPath(t *testing.T) { config := createDefaultConfig().(*Config) sink := new(consumertest.LogsSink) @@ -1407,3 +1844,12 @@ func Test_splunkhecReceiver_healthCheck_success(t *testing.T) { }) } } + +type mockHost struct { + component.Host + extensions map[component.ID]component.Component +} + +func (h mockHost) GetExtensions() map[component.ID]component.Component { + return h.extensions +} From 2a84069bf38a61fb7f24239d2dff526cbfb314f3 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Thu, 21 Mar 2024 01:32:53 -0700 Subject: [PATCH 02/46] add go mod --- go.mod | 33 +++++++------- go.sum | 66 ++++++++++++++-------------- receiver/splunkhecreceiver/go.mod | 36 ++++++++------- receiver/splunkhecreceiver/go.sum | 73 ++++++++++++++++--------------- 4 files changed, 107 insertions(+), 101 deletions(-) diff --git a/go.mod b/go.mod index 81510dab251df..a4351c563b5a0 100644 --- a/go.mod +++ b/go.mod @@ -173,7 +173,7 @@ require ( go.opentelemetry.io/collector/exporter/loggingexporter v0.95.0 go.opentelemetry.io/collector/exporter/otlpexporter v0.95.0 go.opentelemetry.io/collector/exporter/otlphttpexporter v0.95.0 - go.opentelemetry.io/collector/extension v0.95.0 + go.opentelemetry.io/collector/extension v0.96.0 go.opentelemetry.io/collector/extension/ballastextension v0.95.0 go.opentelemetry.io/collector/extension/zpagesextension v0.95.0 go.opentelemetry.io/collector/otelcol v0.95.0 @@ -310,7 +310,7 @@ require ( github.com/cilium/ebpf v0.9.1 // indirect github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect - github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 // indirect + github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect github.com/containerd/cgroups/v3 v3.0.2 // indirect github.com/containerd/console v1.0.3 // indirect github.com/containerd/ttrpc v1.2.2 // indirect @@ -337,8 +337,8 @@ require ( github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect github.com/elastic/go-structform v0.0.10 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.11.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect + github.com/envoyproxy/go-control-plane v0.12.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect github.com/euank/go-kmsg-parser v2.0.0+incompatible // indirect github.com/expr-lang/expr v1.16.1 // indirect github.com/facebook/time v0.0.0-20240109160331-d1456d1a6bac // indirect @@ -492,6 +492,7 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.95.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.95.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight v0.95.0 // indirect @@ -555,7 +556,7 @@ require ( github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect github.com/prometheus/client_golang v1.19.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect @@ -622,7 +623,7 @@ require ( go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector v0.95.0 // indirect - go.opentelemetry.io/collector/component v0.95.0 // indirect + go.opentelemetry.io/collector/component v0.96.0 // indirect go.opentelemetry.io/collector/config/configauth v0.95.0 // indirect go.opentelemetry.io/collector/config/configcompression v0.95.0 // indirect go.opentelemetry.io/collector/config/configgrpc v0.95.0 // indirect @@ -630,10 +631,10 @@ require ( go.opentelemetry.io/collector/config/confignet v0.95.0 // indirect go.opentelemetry.io/collector/config/configopaque v1.2.0 // indirect go.opentelemetry.io/collector/config/configretry v0.95.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.95.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.96.0 // indirect go.opentelemetry.io/collector/config/configtls v0.95.0 // indirect go.opentelemetry.io/collector/config/internal v0.95.0 // indirect - go.opentelemetry.io/collector/confmap v0.95.0 // indirect + go.opentelemetry.io/collector/confmap v0.96.0 // indirect go.opentelemetry.io/collector/confmap/converter/expandconverter v0.95.0 // indirect go.opentelemetry.io/collector/confmap/provider/envprovider v0.95.0 // indirect go.opentelemetry.io/collector/confmap/provider/fileprovider v0.95.0 // indirect @@ -643,7 +644,7 @@ require ( go.opentelemetry.io/collector/consumer v0.95.0 // indirect go.opentelemetry.io/collector/extension/auth v0.95.0 // indirect go.opentelemetry.io/collector/featuregate v1.2.0 // indirect - go.opentelemetry.io/collector/pdata v1.2.0 // indirect + go.opentelemetry.io/collector/pdata v1.3.0 // indirect go.opentelemetry.io/collector/semconv v0.95.0 // indirect go.opentelemetry.io/collector/service v0.95.0 // indirect go.opentelemetry.io/contrib/config v0.3.0 // indirect @@ -651,20 +652,20 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.23.0 // indirect go.opentelemetry.io/contrib/zpages v0.48.0 // indirect - go.opentelemetry.io/otel v1.23.1 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/bridge/opencensus v1.23.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.23.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.23.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.45.2 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.46.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.23.1 // indirect - go.opentelemetry.io/otel/metric v1.23.1 // indirect - go.opentelemetry.io/otel/sdk v1.23.1 // indirect - go.opentelemetry.io/otel/sdk/metric v1.23.1 // indirect - go.opentelemetry.io/otel/trace v1.23.1 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/sdk v1.24.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect @@ -687,7 +688,7 @@ require ( google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 // indirect - google.golang.org/grpc v1.61.0 // indirect + google.golang.org/grpc v1.62.0 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index a010da6f30ab3..15e753333c077 100644 --- a/go.sum +++ b/go.sum @@ -467,8 +467,8 @@ github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nC github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -576,11 +576,11 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= +github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -1289,6 +1289,8 @@ github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je4 github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= @@ -1384,8 +1386,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= @@ -1649,8 +1651,8 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/collector v0.95.0 h1:DFW0BkF2sOocpA3NUPrbMeuPSN3PWxFBrLqs/Cxn3vo= go.opentelemetry.io/collector v0.95.0/go.mod h1:Lc+VkOkSBppKqR/cAevS5oPrbtUO3JUbYzo91niRkG0= -go.opentelemetry.io/collector/component v0.95.0 h1:68tI7KVy1bfpaR83+LxUvjd9/hjDh78utklGl2t6eVM= -go.opentelemetry.io/collector/component v0.95.0/go.mod h1:SMt7r9zm0OOEKJF/ZUy8agD92OAXq2Xhq1FaTcfIWHw= +go.opentelemetry.io/collector/component v0.96.0 h1:O7F8F1YWOHNCqK5NH6vkGI6S1ObR4aPMFq3nHUxdWs0= +go.opentelemetry.io/collector/component v0.96.0/go.mod h1:HsiWaGHT+npm+c54iuUes1MpZJuGKZzS+ts2iaKt/Lo= go.opentelemetry.io/collector/config/configauth v0.95.0 h1:peGXB3ctZW/B8PomTL7CoIpTy94V5TR3JX6fD8kakmU= go.opentelemetry.io/collector/config/configauth v0.95.0/go.mod h1:80lAG02Mucz0JYdG+k0NIul/BQF5bUpeRGEndgg07lg= go.opentelemetry.io/collector/config/configcompression v0.95.0 h1:G1ljjbXmh37JaePSM+2r0bRNlEoCg4l1M1UuhGgnXx0= @@ -1665,14 +1667,14 @@ go.opentelemetry.io/collector/config/configopaque v1.2.0 h1:ncnAuq4px3yREsirivGU go.opentelemetry.io/collector/config/configopaque v1.2.0/go.mod h1:6BAnSe6wok2Sg3tiNuapBbLnrduyMwzsBzbfgUSbDnI= go.opentelemetry.io/collector/config/configretry v0.95.0 h1:YBLly9WRjLCnB91feTshPNCj3z91Yf+akLWRNiUNxps= go.opentelemetry.io/collector/config/configretry v0.95.0/go.mod h1:Nq7hp4nk+zeH0LYYsx348NHl02O89FnV45hcCCmqdtg= -go.opentelemetry.io/collector/config/configtelemetry v0.95.0 h1:HabJZqbOAbNQ52L3v6usXoGXg1UKA1Ofs4Ytp5sGXEo= -go.opentelemetry.io/collector/config/configtelemetry v0.95.0/go.mod h1:tl8sI2RE3LSgJ0HjpadYpIwsKzw/CRA0nZUXLzMAZS0= +go.opentelemetry.io/collector/config/configtelemetry v0.96.0 h1:Q9bSLPUzJUFG+P8eQ7W25Feko8yjdB7dK98V7hmUxCA= +go.opentelemetry.io/collector/config/configtelemetry v0.96.0/go.mod h1:tl8sI2RE3LSgJ0HjpadYpIwsKzw/CRA0nZUXLzMAZS0= go.opentelemetry.io/collector/config/configtls v0.95.0 h1:LB6B5vCXwZV77jWPNhdvsgkyY8CFv8gdsRjfQS2Rioc= go.opentelemetry.io/collector/config/configtls v0.95.0/go.mod h1:661iHIlhQTKIuUUEkQmuoyek1oq46XlsKjLu3JIzJrE= go.opentelemetry.io/collector/config/internal v0.95.0 h1:jSifydX2KscDhVuTxGFdYtgWu+7AVKr9/7OCvBmS46Q= go.opentelemetry.io/collector/config/internal v0.95.0/go.mod h1:KR0lphyXBwuB1DImzQDRVONoRTbwsGnH9degSG5018M= -go.opentelemetry.io/collector/confmap v0.95.0 h1:0oZwSUaeKTDCP7eewFpQSD+9SxXspiaJWjZDQYGGars= -go.opentelemetry.io/collector/confmap v0.95.0/go.mod h1:L3djzwpt+jL06wxnHAuy1jPUFcM+MdKGQAsz3B1d6pk= +go.opentelemetry.io/collector/confmap v0.96.0 h1:415ELCfC8S3xjiNFLneDWJi6h7j7SUw8A8pZtINEQdI= +go.opentelemetry.io/collector/confmap v0.96.0/go.mod h1:q/dWHLvkk1vgvAF0l5dbgQSiPOmGwpv0FwcNaGpqsfM= go.opentelemetry.io/collector/confmap/converter/expandconverter v0.95.0 h1:rB7D49otdEckcR9vgIjGceiCpsWXEVQlIbmvyHFwgaQ= go.opentelemetry.io/collector/confmap/converter/expandconverter v0.95.0/go.mod h1:pnPylSLwwTZi62H+x+wTdWPZjd/9N/17HEPjeMrv0E4= go.opentelemetry.io/collector/confmap/provider/envprovider v0.95.0 h1:rWDaNX7za1cfycZFAKZpx38Go5DrQUHcm3/mpC+NLuM= @@ -1701,8 +1703,8 @@ go.opentelemetry.io/collector/exporter/otlpexporter v0.95.0 h1:3GGUHciA0EGqzjAMq go.opentelemetry.io/collector/exporter/otlpexporter v0.95.0/go.mod h1:8iKJe0ueSSns5u8vQjr0jRGKF1HFNSNUuMl/d7cxAlk= go.opentelemetry.io/collector/exporter/otlphttpexporter v0.95.0 h1:qYwzbWoO0+lo8ZCvlJnejTLaidnPmfNB4JbIzQ5isHY= go.opentelemetry.io/collector/exporter/otlphttpexporter v0.95.0/go.mod h1:GuZWJMiyHXmLQTKMdniu4uNScrAuUSkp2RSW7+zDjpY= -go.opentelemetry.io/collector/extension v0.95.0 h1:amE7zV/lfJRdCmZ4cqWmvBzZB5aQmIFIQqIuXmhaCjI= -go.opentelemetry.io/collector/extension v0.95.0/go.mod h1:IDt4B5GJxh/uJ/mUWxYZ+eHrJ49k4B8s8gJhuI0TRVI= +go.opentelemetry.io/collector/extension v0.96.0 h1:b02WX/2XxDf/PlqboYwWUSmiT2BXXWSntlnDlGiJuWw= +go.opentelemetry.io/collector/extension v0.96.0/go.mod h1:RrjDbQUCPKZmR9mfZ6kVQ0J8OfrcYnf09U+6ZyToV/Q= go.opentelemetry.io/collector/extension/auth v0.95.0 h1:Qu2/I6YXW1yhh+M5PZ6b5izPdzrh+bl8X7ewEeJQWGU= go.opentelemetry.io/collector/extension/auth v0.95.0/go.mod h1:FSODnSbmqfRT9dQdJgogby7j4bcV8TmrhddTvcAjcjU= go.opentelemetry.io/collector/extension/ballastextension v0.95.0 h1:ikdfIQiTktrVws4EhDH7I/BNIgfBJiIk+fdkmyh2VCY= @@ -1713,8 +1715,8 @@ go.opentelemetry.io/collector/featuregate v1.2.0 h1:nF8OGq5PsSNSLeuNwTWlOqThxbLW go.opentelemetry.io/collector/featuregate v1.2.0/go.mod h1:mm8+xyQfgDmqhyegZRNIQmoKsNnDTwWKFLsdMoXAb7A= go.opentelemetry.io/collector/otelcol v0.95.0 h1:lEwogX+fvO17SUgXT7/+q1DUXos0SwsAiUkhd0944AU= go.opentelemetry.io/collector/otelcol v0.95.0/go.mod h1:ETOYHHPSN4a43LvdUwajNSjwr30euS74rjfsrLCWh2A= -go.opentelemetry.io/collector/pdata v1.2.0 h1:N6VdyEFYJyoHIKqHd0F372eNVD5b+AbH0ZQf7Z2jJ9I= -go.opentelemetry.io/collector/pdata v1.2.0/go.mod h1:mKXb6527Syb8PT4P9CZOJNbkuHOHjjGTZNNwSKESJhc= +go.opentelemetry.io/collector/pdata v1.3.0 h1:JRYN7tVHYFwmtQhIYbxWeiKSa2L1nCohyAs8sYqKFZo= +go.opentelemetry.io/collector/pdata v1.3.0/go.mod h1:t7W0Undtes53HODPdSujPLTnfSR5fzT+WpL+RTaaayo= go.opentelemetry.io/collector/processor v0.95.0 h1:iLX1K1CEJttTXTHjuSu8vxucdG7U0cGnp9l+9w+Q6HE= go.opentelemetry.io/collector/processor v0.95.0/go.mod h1:2vxstfq5xws+7C9Yi+yeg/xQ3Nh81sD2mr56KhRXAFA= go.opentelemetry.io/collector/processor/batchprocessor v0.95.0 h1:5yaGYWYCMOFnMS9rHIIOV9wLXSGfqe3I7hinUSjIZAc= @@ -1739,8 +1741,8 @@ go.opentelemetry.io/contrib/propagators/b3 v1.23.0 h1:aaIGWc5JdfRGpCafLRxMJbD65M go.opentelemetry.io/contrib/propagators/b3 v1.23.0/go.mod h1:Gyz7V7XghvwTq+mIhLFlTgcc03UDroOg8vezs4NLhwU= go.opentelemetry.io/contrib/zpages v0.48.0 h1:7vnqarYRu2VYvUUwrLWXRk5HqPuCbtuZdgR4eaVeP3Y= go.opentelemetry.io/contrib/zpages v0.48.0/go.mod h1:fzewgBzh126TFUgnNhI9/1hjvnZes7wBKXAMQmyM01g= -go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY= -go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/bridge/opencensus v1.23.1 h1:QmGawK5vW6UdHXypZwWUuag27dJjCzSrVcEpqBpGZzY= go.opentelemetry.io/otel/bridge/opencensus v1.23.1/go.mod h1:TNxwRvdhakpilWQImJM/a4yd/8mgqDhRVC9Bph9wI/k= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.23.1 h1:ZqRWZJGHXV/1yCcEEVJ6/Uz2JtM79DNS8OZYa3vVY/A= @@ -1753,20 +1755,20 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1 h1:p3A5+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1/go.mod h1:OClrnXUjBqQbInvjJFjYSnMxBSCXBF8r3b34WqjiIrQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 h1:cfuy3bXmLJS7M1RZmAL6SuhGtKUp2KEsrm00OlAXkq4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1/go.mod h1:22jr92C6KwlwItJmQzfixzQM3oyyuYLCfHiMY+rpsPU= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2 h1:pe2Jqk1K18As0RCw7J08QhgXNqr+6npx0a5W4IgAFA8= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2/go.mod h1:B38pscHKI6bhFS44FDw0eFU3iqG3ASNIvY+fZgR5sAc= +go.opentelemetry.io/otel/exporters/prometheus v0.46.0 h1:I8WIFXR351FoLJYuloU4EgXbtNX2URfU/85pUPheIEQ= +go.opentelemetry.io/otel/exporters/prometheus v0.46.0/go.mod h1:ztwVUHe5DTR/1v7PeuGRnU5Bbd4QKYwApWmuutKsJSs= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1 h1:C8r95vDR125t815KD+b1tI0Fbc1pFnwHTBxkbIZ6Szc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1/go.mod h1:Qr0qomr64jentMtOjWMbtYeJMSuMSlsPEjmnRA2sWZ4= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.23.1 h1:IqmsDcJnxQSs6W+1TMSqpYO7VY4ZuEKJGYlSBPUlT1s= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.23.1/go.mod h1:VMZ84RYOd4Lrp0+09mckDvqBj2PXWDwOFaxb1P5uO8g= -go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo= -go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= -go.opentelemetry.io/otel/sdk v1.23.1 h1:O7JmZw0h76if63LQdsBMKQDWNb5oEcOThG9IrxscV+E= -go.opentelemetry.io/otel/sdk v1.23.1/go.mod h1:LzdEVR5am1uKOOwfBWFef2DCi1nu3SA8XQxx2IerWFk= -go.opentelemetry.io/otel/sdk/metric v1.23.1 h1:T9/8WsYg+ZqIpMWwdISVVrlGb/N0Jr1OHjR/alpKwzg= -go.opentelemetry.io/otel/sdk/metric v1.23.1/go.mod h1:8WX6WnNtHCgUruJ4TJ+UssQjMtpxkpX0zveQC8JG/E0= -go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8= -go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/sdk/metric v1.24.0 h1:yyMQrPzF+k88/DbH7o4FMAs80puqd+9osbiBrJrz/w8= +go.opentelemetry.io/otel/sdk/metric v1.24.0/go.mod h1:I6Y5FjH6rvEnTTAYQz3Mmv2kl6Ek5IIrmwTLqMrrOE0= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= @@ -2279,8 +2281,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= +google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index 059a78a692040..f145b79d4e716 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -3,25 +3,27 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunk go 1.21 require ( + github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/json-iterator/go v1.1.12 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.95.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.95.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.95.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.95.0 github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.95.0 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/collector/component v0.95.0 + go.opentelemetry.io/collector/component v0.96.0 go.opentelemetry.io/collector/config/confighttp v0.95.0 go.opentelemetry.io/collector/config/configtls v0.95.0 - go.opentelemetry.io/collector/confmap v0.95.0 + go.opentelemetry.io/collector/confmap v0.96.0 go.opentelemetry.io/collector/consumer v0.95.0 go.opentelemetry.io/collector/exporter v0.95.0 - go.opentelemetry.io/collector/pdata v1.2.0 + go.opentelemetry.io/collector/pdata v1.3.0 go.opentelemetry.io/collector/receiver v0.95.0 go.opentelemetry.io/collector/semconv v0.95.0 - go.opentelemetry.io/otel/metric v1.23.1 - go.opentelemetry.io/otel/trace v1.23.1 + go.opentelemetry.io/otel/metric v1.24.0 + go.opentelemetry.io/otel/trace v1.24.0 go.uber.org/zap v1.27.0 ) @@ -44,7 +46,6 @@ require ( github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.1.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // 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 @@ -52,33 +53,34 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.95.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.95.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.18.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.46.0 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/rs/cors v1.10.1 // indirect + github.com/stretchr/objx v0.5.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector v0.95.0 // indirect go.opentelemetry.io/collector/config/configauth v0.95.0 // indirect go.opentelemetry.io/collector/config/configcompression v0.95.0 // indirect go.opentelemetry.io/collector/config/configopaque v1.2.0 // indirect go.opentelemetry.io/collector/config/configretry v0.95.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.95.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.96.0 // indirect go.opentelemetry.io/collector/config/internal v0.95.0 // indirect - go.opentelemetry.io/collector/extension v0.95.0 // indirect + go.opentelemetry.io/collector/extension v0.96.0 // indirect go.opentelemetry.io/collector/extension/auth v0.95.0 // indirect go.opentelemetry.io/collector/featuregate v1.2.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect - go.opentelemetry.io/otel v1.23.1 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.45.2 // indirect - go.opentelemetry.io/otel/sdk v1.23.1 // indirect - go.opentelemetry.io/otel/sdk/metric v1.23.1 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.46.0 // indirect + go.opentelemetry.io/otel/sdk v1.24.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/grpc v1.61.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/grpc v1.62.0 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/receiver/splunkhecreceiver/go.sum b/receiver/splunkhecreceiver/go.sum index 778f7faf237ac..0c3ef7d13bbc5 100644 --- a/receiver/splunkhecreceiver/go.sum +++ b/receiver/splunkhecreceiver/go.sum @@ -82,8 +82,8 @@ 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.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= @@ -110,8 +110,6 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= 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/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= @@ -127,6 +125,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= @@ -139,13 +139,13 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= -github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -160,6 +160,7 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -181,8 +182,8 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/collector v0.95.0 h1:DFW0BkF2sOocpA3NUPrbMeuPSN3PWxFBrLqs/Cxn3vo= go.opentelemetry.io/collector v0.95.0/go.mod h1:Lc+VkOkSBppKqR/cAevS5oPrbtUO3JUbYzo91niRkG0= -go.opentelemetry.io/collector/component v0.95.0 h1:68tI7KVy1bfpaR83+LxUvjd9/hjDh78utklGl2t6eVM= -go.opentelemetry.io/collector/component v0.95.0/go.mod h1:SMt7r9zm0OOEKJF/ZUy8agD92OAXq2Xhq1FaTcfIWHw= +go.opentelemetry.io/collector/component v0.96.0 h1:O7F8F1YWOHNCqK5NH6vkGI6S1ObR4aPMFq3nHUxdWs0= +go.opentelemetry.io/collector/component v0.96.0/go.mod h1:HsiWaGHT+npm+c54iuUes1MpZJuGKZzS+ts2iaKt/Lo= go.opentelemetry.io/collector/config/configauth v0.95.0 h1:peGXB3ctZW/B8PomTL7CoIpTy94V5TR3JX6fD8kakmU= go.opentelemetry.io/collector/config/configauth v0.95.0/go.mod h1:80lAG02Mucz0JYdG+k0NIul/BQF5bUpeRGEndgg07lg= go.opentelemetry.io/collector/config/configcompression v0.95.0 h1:G1ljjbXmh37JaePSM+2r0bRNlEoCg4l1M1UuhGgnXx0= @@ -193,44 +194,44 @@ go.opentelemetry.io/collector/config/configopaque v1.2.0 h1:ncnAuq4px3yREsirivGU go.opentelemetry.io/collector/config/configopaque v1.2.0/go.mod h1:6BAnSe6wok2Sg3tiNuapBbLnrduyMwzsBzbfgUSbDnI= go.opentelemetry.io/collector/config/configretry v0.95.0 h1:YBLly9WRjLCnB91feTshPNCj3z91Yf+akLWRNiUNxps= go.opentelemetry.io/collector/config/configretry v0.95.0/go.mod h1:Nq7hp4nk+zeH0LYYsx348NHl02O89FnV45hcCCmqdtg= -go.opentelemetry.io/collector/config/configtelemetry v0.95.0 h1:HabJZqbOAbNQ52L3v6usXoGXg1UKA1Ofs4Ytp5sGXEo= -go.opentelemetry.io/collector/config/configtelemetry v0.95.0/go.mod h1:tl8sI2RE3LSgJ0HjpadYpIwsKzw/CRA0nZUXLzMAZS0= +go.opentelemetry.io/collector/config/configtelemetry v0.96.0 h1:Q9bSLPUzJUFG+P8eQ7W25Feko8yjdB7dK98V7hmUxCA= +go.opentelemetry.io/collector/config/configtelemetry v0.96.0/go.mod h1:tl8sI2RE3LSgJ0HjpadYpIwsKzw/CRA0nZUXLzMAZS0= go.opentelemetry.io/collector/config/configtls v0.95.0 h1:LB6B5vCXwZV77jWPNhdvsgkyY8CFv8gdsRjfQS2Rioc= go.opentelemetry.io/collector/config/configtls v0.95.0/go.mod h1:661iHIlhQTKIuUUEkQmuoyek1oq46XlsKjLu3JIzJrE= go.opentelemetry.io/collector/config/internal v0.95.0 h1:jSifydX2KscDhVuTxGFdYtgWu+7AVKr9/7OCvBmS46Q= go.opentelemetry.io/collector/config/internal v0.95.0/go.mod h1:KR0lphyXBwuB1DImzQDRVONoRTbwsGnH9degSG5018M= -go.opentelemetry.io/collector/confmap v0.95.0 h1:0oZwSUaeKTDCP7eewFpQSD+9SxXspiaJWjZDQYGGars= -go.opentelemetry.io/collector/confmap v0.95.0/go.mod h1:L3djzwpt+jL06wxnHAuy1jPUFcM+MdKGQAsz3B1d6pk= +go.opentelemetry.io/collector/confmap v0.96.0 h1:415ELCfC8S3xjiNFLneDWJi6h7j7SUw8A8pZtINEQdI= +go.opentelemetry.io/collector/confmap v0.96.0/go.mod h1:q/dWHLvkk1vgvAF0l5dbgQSiPOmGwpv0FwcNaGpqsfM= go.opentelemetry.io/collector/consumer v0.95.0 h1:M/N5RDx8/6Hz5L1qWUXdtirtdoV8BEjIxCSdt6cCx+I= go.opentelemetry.io/collector/consumer v0.95.0/go.mod h1:tM5aOolWS1zAByMbne2xVOkmVvZrF3VEKY6TkxhmkOs= go.opentelemetry.io/collector/exporter v0.95.0 h1:orUpjMVsD2IYRzrofE0tBhEBGHjr7W4wfltERxnWhP4= go.opentelemetry.io/collector/exporter v0.95.0/go.mod h1:5wyZskvf4T1Zmm414a7JM1xw8EPhrFZeCe5kCff6VRg= -go.opentelemetry.io/collector/extension v0.95.0 h1:amE7zV/lfJRdCmZ4cqWmvBzZB5aQmIFIQqIuXmhaCjI= -go.opentelemetry.io/collector/extension v0.95.0/go.mod h1:IDt4B5GJxh/uJ/mUWxYZ+eHrJ49k4B8s8gJhuI0TRVI= +go.opentelemetry.io/collector/extension v0.96.0 h1:b02WX/2XxDf/PlqboYwWUSmiT2BXXWSntlnDlGiJuWw= +go.opentelemetry.io/collector/extension v0.96.0/go.mod h1:RrjDbQUCPKZmR9mfZ6kVQ0J8OfrcYnf09U+6ZyToV/Q= go.opentelemetry.io/collector/extension/auth v0.95.0 h1:Qu2/I6YXW1yhh+M5PZ6b5izPdzrh+bl8X7ewEeJQWGU= go.opentelemetry.io/collector/extension/auth v0.95.0/go.mod h1:FSODnSbmqfRT9dQdJgogby7j4bcV8TmrhddTvcAjcjU= go.opentelemetry.io/collector/featuregate v1.2.0 h1:nF8OGq5PsSNSLeuNwTWlOqThxbLW6v6DOCvSqQMc108= go.opentelemetry.io/collector/featuregate v1.2.0/go.mod h1:mm8+xyQfgDmqhyegZRNIQmoKsNnDTwWKFLsdMoXAb7A= -go.opentelemetry.io/collector/pdata v1.2.0 h1:N6VdyEFYJyoHIKqHd0F372eNVD5b+AbH0ZQf7Z2jJ9I= -go.opentelemetry.io/collector/pdata v1.2.0/go.mod h1:mKXb6527Syb8PT4P9CZOJNbkuHOHjjGTZNNwSKESJhc= +go.opentelemetry.io/collector/pdata v1.3.0 h1:JRYN7tVHYFwmtQhIYbxWeiKSa2L1nCohyAs8sYqKFZo= +go.opentelemetry.io/collector/pdata v1.3.0/go.mod h1:t7W0Undtes53HODPdSujPLTnfSR5fzT+WpL+RTaaayo= go.opentelemetry.io/collector/receiver v0.95.0 h1:9gA8/ceXiYiPheGQUt+EmCEKTjkGpUdPkiG7iey3Md0= go.opentelemetry.io/collector/receiver v0.95.0/go.mod h1:kQrMBxcrgZfmtvjVQa6jStYG7c2L1c8UiHe/JNb7M+E= go.opentelemetry.io/collector/semconv v0.95.0 h1:Oa7NXmoatwKLS+RzuXtdjq9oXAeg8P0g3x238fKF0Do= go.opentelemetry.io/collector/semconv v0.95.0/go.mod h1:zOm/U3pgMIWcvrcnPbR9Xx2HinoXj46ERMK8PUV9wrs= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY= -go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2 h1:pe2Jqk1K18As0RCw7J08QhgXNqr+6npx0a5W4IgAFA8= -go.opentelemetry.io/otel/exporters/prometheus v0.45.2/go.mod h1:B38pscHKI6bhFS44FDw0eFU3iqG3ASNIvY+fZgR5sAc= -go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo= -go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= -go.opentelemetry.io/otel/sdk v1.23.1 h1:O7JmZw0h76if63LQdsBMKQDWNb5oEcOThG9IrxscV+E= -go.opentelemetry.io/otel/sdk v1.23.1/go.mod h1:LzdEVR5am1uKOOwfBWFef2DCi1nu3SA8XQxx2IerWFk= -go.opentelemetry.io/otel/sdk/metric v1.23.1 h1:T9/8WsYg+ZqIpMWwdISVVrlGb/N0Jr1OHjR/alpKwzg= -go.opentelemetry.io/otel/sdk/metric v1.23.1/go.mod h1:8WX6WnNtHCgUruJ4TJ+UssQjMtpxkpX0zveQC8JG/E0= -go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8= -go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/exporters/prometheus v0.46.0 h1:I8WIFXR351FoLJYuloU4EgXbtNX2URfU/85pUPheIEQ= +go.opentelemetry.io/otel/exporters/prometheus v0.46.0/go.mod h1:ztwVUHe5DTR/1v7PeuGRnU5Bbd4QKYwApWmuutKsJSs= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/sdk/metric v1.24.0 h1:yyMQrPzF+k88/DbH7o4FMAs80puqd+9osbiBrJrz/w8= +go.opentelemetry.io/otel/sdk/metric v1.24.0/go.mod h1:I6Y5FjH6rvEnTTAYQz3Mmv2kl6Ek5IIrmwTLqMrrOE0= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= 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= @@ -296,15 +297,15 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= +google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 9a0c22fabb3a20d945dc0bda1c200e8e1dce2928 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Thu, 21 Mar 2024 14:50:03 -0700 Subject: [PATCH 03/46] add go mod --- receiver/splunkhecreceiver/go.mod | 3 +-- receiver/splunkhecreceiver/go.sum | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index ac9ad82d82dd9..325aa7a60c4b2 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -41,7 +41,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/klauspost/compress v1.17.7 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect @@ -60,7 +59,7 @@ require ( github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/rs/cors v1.10.1 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect go.opentelemetry.io/collector/config/configauth v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect diff --git a/receiver/splunkhecreceiver/go.sum b/receiver/splunkhecreceiver/go.sum index 82cf5c4efea71..7a74ddcff3e7b 100644 --- a/receiver/splunkhecreceiver/go.sum +++ b/receiver/splunkhecreceiver/go.sum @@ -162,6 +162,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +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.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= From f9d1f83a0c1a30815bd0871091f13ac892bf0a17 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Fri, 22 Mar 2024 11:23:49 -0700 Subject: [PATCH 04/46] fix test --- receiver/splunkhecreceiver/receiver.go | 34 ++++++++++----------- receiver/splunkhecreceiver/receiver_test.go | 25 ++++++++------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 8f8b1eb4109e0..9998fe1443afb 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -201,13 +201,6 @@ func (r *splunkReceiver) Start(_ context.Context, host component.Host) error { return nil } - var ln net.Listener - // set up the listener - ln, err := r.config.ServerConfig.ToListener() - if err != nil { - return fmt.Errorf("failed to bind to address %s: %w", r.config.Endpoint, err) - } - mx := mux.NewRouter() mx.NewRoute().Path(r.config.HealthPath).HandlerFunc(r.handleHealthReq) mx.NewRoute().Path(r.config.HealthPath + "/1.0").HandlerFunc(r.handleHealthReq).Methods("GET") @@ -216,6 +209,23 @@ func (r *splunkReceiver) Start(_ context.Context, host component.Host) error { } mx.NewRoute().HandlerFunc(r.handleReq) + // set up the ack API handler if the ack extension is present + if storageID := r.config.AckExtension; storageID != nil { + if ext, found := host.GetExtensions()[*storageID]; found { + r.ackExt = ext.(ackextension.AckExtension) + mx.NewRoute().Path(r.config.AckPath).HandlerFunc(r.handleAck) + } else { + return fmt.Errorf("specified ack extension with id '%q' could not be found", *storageID) + } + } + + var ln net.Listener + // set up the listener + ln, err := r.config.ServerConfig.ToListener() + if err != nil { + return fmt.Errorf("failed to bind to address %s: %w", r.config.Endpoint, err) + } + r.server, err = r.config.ServerConfig.ToServer(host, r.settings.TelemetrySettings, mx) if err != nil { return err @@ -228,16 +238,6 @@ func (r *splunkReceiver) Start(_ context.Context, host component.Host) error { r.shutdownWG.Add(1) - // set up the ack API handler if the ack extension is present - if storageID := r.config.AckExtension; storageID != nil { - if ext, found := host.GetExtensions()[*storageID]; found { - r.ackExt = ext.(ackextension.AckExtension) - mx.NewRoute().Path(r.config.AckPath).HandlerFunc(r.handleAck) - } else { - return fmt.Errorf("specified ack extension with id '%q' could not be found", *storageID) - } - } - go func() { defer r.shutdownWG.Done() if errHTTP := r.server.Serve(ln); !errors.Is(errHTTP, http.ErrServerClosed) && errHTTP != nil { diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index 5fdc9af7ada70..f35203c46e8e1 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1121,20 +1121,11 @@ func Test_splunkhecReceiver_handleRawReq(t *testing.T) { } func Test_splunkhecReceiver_Start(t *testing.T) { - t.Parallel() - tests := []struct { name string getConfig func() *Config errorExpected bool }{ - { - name: "no_ack_extension_configured", - getConfig: func() *Config { - return createDefaultConfig().(*Config) - }, - errorExpected: false, - }, { name: "ack_extension_does_not_exist", getConfig: func() *Config { @@ -1144,6 +1135,13 @@ func Test_splunkhecReceiver_Start(t *testing.T) { }, errorExpected: true, }, + { + name: "no_ack_extension_configured", + getConfig: func() *Config { + return createDefaultConfig().(*Config) + }, + errorExpected: false, + }, } for _, tt := range tests { @@ -1158,9 +1156,12 @@ func Test_splunkhecReceiver_Start(t *testing.T) { } else { assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) } + + defer func() { + assert.NoError(t, r.Shutdown(context.Background())) + }() }) } - } func Test_splunkhecReceiver_handleAck(t *testing.T) { @@ -1512,7 +1513,6 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { sink := new(consumertest.LogsSink) - rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) assert.NoError(t, err) @@ -1524,6 +1524,9 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { }} assert.NoError(t, r.Start(context.Background(), mockHost)) + defer func() { + assert.NoError(t, r.Shutdown(context.Background())) + }() r.handleReq(w, tt.req) resp := w.Result() From f8de4f99fd162e65440de494c79d0be849930773 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Fri, 22 Mar 2024 16:12:04 -0700 Subject: [PATCH 05/46] fix stage failures --- cmd/configschema/go.mod | 3 +++ cmd/otelcontribcol/builder-config.yaml | 1 + cmd/otelcontribcol/go.mod | 3 +++ cmd/oteltestbedcol/go.mod | 3 +++ go.mod | 2 ++ go.sum | 2 -- internal/splunk/common.go | 2 +- receiver/splunkhecreceiver/go.mod | 3 +++ receiver/splunkhecreceiver/go.sum | 5 ++--- receiver/splunkhecreceiver/receiver.go | 7 ++++--- testbed/go.mod | 4 ++++ testbed/go.sum | 2 ++ 12 files changed, 28 insertions(+), 9 deletions(-) diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index bbde58d3b86b4..2c8a2c1bd2b0a 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -488,6 +488,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.96.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.96.0 // indirect @@ -1155,3 +1156,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/stor replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension => ../../extension/encoding/otlpencodingextension replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding => ../../extension/encoding + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/otelcontribcol/builder-config.yaml b/cmd/otelcontribcol/builder-config.yaml index 34f31fdf3be4f..f45d2d1b7ac62 100644 --- a/cmd/otelcontribcol/builder-config.yaml +++ b/cmd/otelcontribcol/builder-config.yaml @@ -444,6 +444,7 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension => ../../extension/opampextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension => ../../extension/solarwindsapmsettingsextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension => ../../extension/sumologicextension + - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver => ../../receiver/namedpipereceiver - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => ../../internal/sqlquery diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index 133d8c980b5f0..876ef602b0c6b 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -530,6 +530,7 @@ require ( github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect github.com/oklog/ulid/v2 v2.1.0 // indirect github.com/open-telemetry/opamp-go v0.12.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.96.0 // indirect @@ -1193,6 +1194,8 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sola replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension => ../../extension/sumologicextension +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension + replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver => ../../receiver/namedpipereceiver replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => ../../internal/sqlquery diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index 5309173dbef21..bd1ba0c15423b 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -166,6 +166,7 @@ require ( github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.96.0 // indirect @@ -393,3 +394,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/go.mod b/go.mod index 4f07e8f675a35..60dd566a13407 100644 --- a/go.mod +++ b/go.mod @@ -1157,3 +1157,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlqu replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding => ./extension/encoding replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension => ./extension/encoding/otlpencodingextension + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ./extension/ackextension diff --git a/go.sum b/go.sum index 4f26cf5f2f2e3..2379b8fec6fd9 100644 --- a/go.sum +++ b/go.sum @@ -1294,8 +1294,6 @@ github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je4 github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= diff --git a/internal/splunk/common.go b/internal/splunk/common.go index b889066a914c6..a9ad5088ebb22 100644 --- a/internal/splunk/common.go +++ b/internal/splunk/common.go @@ -23,7 +23,7 @@ const ( DefaultSeverityTextLabel = "otel.log.severity.text" DefaultSeverityNumberLabel = "otel.log.severity.number" HECTokenHeader = "Splunk" - HttpSplunkChannelHeader = "X-Splunk-Request-Channel" + HTTPSplunkChannelHeader = "X-Splunk-Request-Channel" HecTokenLabel = "com.splunk.hec.access_token" // #nosec // HecEventMetricType is the type of HEC event. Set to metric, as per https://docs.splunk.com/Documentation/Splunk/8.0.3/Metrics/GetMetricsInOther. diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index 325aa7a60c4b2..448d7f8b32e22 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -42,6 +42,7 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/hashicorp/go-version v1.6.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/klauspost/compress v1.17.7 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect @@ -109,3 +110,5 @@ retract ( replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent => ../../internal/sharedcomponent replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/receiver/splunkhecreceiver/go.sum b/receiver/splunkhecreceiver/go.sum index 577e8b7b44af4..c77f8a1c249ee 100644 --- a/receiver/splunkhecreceiver/go.sum +++ b/receiver/splunkhecreceiver/go.sum @@ -88,6 +88,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 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= @@ -127,8 +129,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -160,7 +160,6 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 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= diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 9998fe1443afb..745ba944ecf7d 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -27,6 +27,7 @@ import ( "go.uber.org/zap" "github.com/google/uuid" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" @@ -291,7 +292,7 @@ func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) } // check that the channel exists - partitionID := req.Header.Get(splunk.HttpSplunkChannelHeader) + partitionID := req.Header.Get(splunk.HTTPSplunkChannelHeader) if len(partitionID) <= 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return @@ -335,7 +336,7 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques var partitionID string if r.ackExt != nil { // check channel header exists - partitionID = req.Header.Get(splunk.HttpSplunkChannelHeader) + partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) if len(partitionID) <= 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return @@ -437,7 +438,7 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) var partitionID string if r.ackExt != nil { // check channel header exists - partitionID = req.Header.Get(splunk.HttpSplunkChannelHeader) + partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) if len(partitionID) <= 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return diff --git a/testbed/go.mod b/testbed/go.mod index 31e2ca694f8a6..7ced95a374805 100644 --- a/testbed/go.mod +++ b/testbed/go.mod @@ -143,6 +143,7 @@ require ( github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/hetznercloud/hcloud-go/v2 v2.4.0 // indirect @@ -177,6 +178,7 @@ require ( github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.96.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.96.0 // indirect @@ -362,3 +364,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../pkg/pdatautil replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../extension/ackextension diff --git a/testbed/go.sum b/testbed/go.sum index cd220af6ce7e0..9abdff71bec32 100644 --- a/testbed/go.sum +++ b/testbed/go.sum @@ -358,6 +358,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= From 213b3ebbd36a1b8d26cb5ff941add34ab8a70d3f Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Sun, 24 Mar 2024 23:20:09 -0700 Subject: [PATCH 06/46] address failures --- cmd/oteltestbedcol/go.mod | 2 -- cmd/oteltestbedcol/go.sum | 2 ++ receiver/splunkhecreceiver/receiver.go | 8 +++----- receiver/splunkhecreceiver/receiver_test.go | 8 ++++---- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index bd1ba0c15423b..d811207393217 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,5 +394,3 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 5fd442de7a371..1746ad0173798 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -521,6 +521,8 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 745ba944ecf7d..91744d9a0a364 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -42,7 +42,6 @@ const ( responseOKWithAckID = `{"text": "Success", "code": 0, "ackId": %d}` responseHecHealthy = `{"text": "HEC is healthy", "code": 17}` responseInvalidMethodPostOnly = `"Only \"POST\" method is supported"` - responseInvalidMethodGetOnly = `"Only \"GET\" method is supported"` responseInvalidEncoding = `"\"Content-Encoding\" must be \"gzip\" or empty"` responseInvalidDataFormat = `{"text":"Invalid data format","code":6}` responseErrEventRequired = `{"text":"Event field is required","code":12}` @@ -79,7 +78,6 @@ var ( invalidEncodingRespBody = []byte(responseInvalidEncoding) invalidFormatRespBody = []byte(responseInvalidDataFormat) invalidMethodRespBodyPostOnly = []byte(responseInvalidMethodPostOnly) - invalidMethodRespBodyGetOnly = []byte(responseInvalidMethodGetOnly) errGzipReaderRespBody = []byte(responseErrGzipReader) errUnmarshalBodyRespBody = []byte(responseErrUnmarshalBody) errInternalServerError = []byte(responseErrInternalServerError) @@ -293,7 +291,7 @@ func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) // check that the channel exists partitionID := req.Header.Get(splunk.HTTPSplunkChannelHeader) - if len(partitionID) <= 0 { + if len(partitionID) == 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return } @@ -337,7 +335,7 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques if r.ackExt != nil { // check channel header exists partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) - if len(partitionID) <= 0 { + if len(partitionID) == 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return } @@ -439,7 +437,7 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) if r.ackExt != nil { // check channel header exists partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) - if len(partitionID) <= 0 { + if len(partitionID) == 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return } diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index f35203c46e8e1..06ace788ff3c6 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1401,12 +1401,12 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) assert.NoError(t, err) - mockHost := mockHost{extensions: map[component.ID]component.Component{ + mh := mockHost{extensions: map[component.ID]component.Component{ id: tt.setupMockAckExtension(t), }} r := rcv.(*splunkReceiver) - assert.NoError(t, r.Start(context.Background(), mockHost)) + assert.NoError(t, r.Start(context.Background(), mh)) defer func() { assert.NoError(t, r.Shutdown(context.Background())) }() @@ -1519,11 +1519,11 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { r := rcv.(*splunkReceiver) w := httptest.NewRecorder() - mockHost := mockHost{extensions: map[component.ID]component.Component{ + mh := mockHost{extensions: map[component.ID]component.Component{ id: tt.setupMockAckExtension(t), }} - assert.NoError(t, r.Start(context.Background(), mockHost)) + assert.NoError(t, r.Start(context.Background(), mh)) defer func() { assert.NoError(t, r.Shutdown(context.Background())) }() From 5d9cfdbab3e17ba3c1ea27a77ffce864291e047d Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Sun, 24 Mar 2024 23:31:19 -0700 Subject: [PATCH 07/46] address test failure --- cmd/oteltestbedcol/go.mod | 2 ++ cmd/oteltestbedcol/go.sum | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index d811207393217..bd1ba0c15423b 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,3 +394,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 1746ad0173798..5fd442de7a371 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -521,8 +521,6 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= From aaa367bb1b4d018a3615f7c8cfed00d78fea4d30 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 00:28:09 -0700 Subject: [PATCH 08/46] test --- cmd/oteltestbedcol/go.mod | 2 -- cmd/oteltestbedcol/go.sum | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index bd1ba0c15423b..d811207393217 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,5 +394,3 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 5fd442de7a371..1746ad0173798 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -521,6 +521,8 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= From 9bf53c0c721c09be467a6fecac8355acd7837b8a Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 00:34:22 -0700 Subject: [PATCH 09/46] test --- cmd/oteltestbedcol/go.mod | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index d811207393217..bd1ba0c15423b 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,3 +394,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension From 9b592fbee38562d314e99fcb8369a965310ab6a2 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 00:48:46 -0700 Subject: [PATCH 10/46] test --- cmd/oteltestbedcol/go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 1746ad0173798..5fd442de7a371 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -521,8 +521,6 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= From 8870816e5e46ad71784a7b2dcc14c4ceb8123044 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 00:56:46 -0700 Subject: [PATCH 11/46] test --- cmd/oteltestbedcol/go.mod | 2 -- cmd/oteltestbedcol/go.sum | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index bd1ba0c15423b..d811207393217 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,5 +394,3 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 5fd442de7a371..1746ad0173798 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -521,6 +521,8 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= From 219c82d630250813350e61d75909c45206d392ef Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 01:03:11 -0700 Subject: [PATCH 12/46] test --- cmd/oteltestbedcol/go.mod | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index d811207393217..bd1ba0c15423b 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,3 +394,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension From 1950a553ec56fc9f447844802e40fed63864205c Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 01:20:26 -0700 Subject: [PATCH 13/46] test --- cmd/oteltestbedcol/go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index bd1ba0c15423b..d811207393217 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,5 +394,3 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension From 6dcf2815eb676b5c03641a57245e7cd07e71c716 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 15:47:06 -0700 Subject: [PATCH 14/46] test --- cmd/oteltestbedcol/go.mod | 2 ++ receiver/splunkhecreceiver/receiver.go | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index d811207393217..bd1ba0c15423b 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -394,3 +394,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 91744d9a0a364..bcc9bb9acbf84 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -17,6 +17,7 @@ import ( "sync" "time" + "github.com/google/uuid" "github.com/gorilla/mux" jsoniter "github.com/json-iterator/go" "go.opentelemetry.io/collector/component" @@ -26,10 +27,7 @@ import ( "go.opentelemetry.io/collector/receiver/receiverhelper" "go.uber.org/zap" - "github.com/google/uuid" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver/internal/metadata" ) From 3edf903bb95be1206968036fb49c563e653348b9 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 25 Mar 2024 16:18:51 -0700 Subject: [PATCH 15/46] test --- cmd/oteltestbedcol/go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 077203377f650..f14969c12166e 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -522,8 +522,6 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0 h1:dJOE5kknvWgR/WxWtLzYKenob3Ljd7Uw5fnC893Ss3w= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.96.0/go.mod h1:WZXs6MuwTW7oKSMdSvIgGeM4huVgnPlX7asnA99TZjk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= From 71de004baaaab1e6cd715a23e071fadac7d95b1d Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 26 Mar 2024 21:24:39 -0700 Subject: [PATCH 16/46] address MR comments --- receiver/splunkhecreceiver/config.go | 15 +++-- receiver/splunkhecreceiver/config_test.go | 4 +- receiver/splunkhecreceiver/factory.go | 7 ++- receiver/splunkhecreceiver/receiver.go | 69 ++++++++------------- receiver/splunkhecreceiver/receiver_test.go | 27 ++++++-- 5 files changed, 65 insertions(+), 57 deletions(-) diff --git a/receiver/splunkhecreceiver/config.go b/receiver/splunkhecreceiver/config.go index 8fe8cad340a7c..99ead74205e4c 100644 --- a/receiver/splunkhecreceiver/config.go +++ b/receiver/splunkhecreceiver/config.go @@ -22,6 +22,9 @@ type Config struct { confighttp.ServerConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct splunk.AccessTokenPassthroughConfig `mapstructure:",squash"` + + Ack `mapstructure:",squash"` + // RawPath for raw data collection, default is '/services/collector/raw' RawPath string `mapstructure:"raw_path"` // Splitting defines the splitting strategy used by the receiver when ingesting raw events. Can be set to "line" or "none". Default is "line". @@ -30,8 +33,12 @@ type Config struct { HealthPath string `mapstructure:"health_path"` // HecToOtelAttrs creates a mapping from HEC metadata to attributes. HecToOtelAttrs splunk.HecToOtelAttrs `mapstructure:"hec_metadata_to_otel_attrs"` - // AckExtension defines the extension to use for acking of events - AckExtension *component.ID `mapstructure:"ack_extension"` - // AckPath for Ack API, default is '/services/collector/ack' - AckPath string `mapstructure:"ack_path"` +} + +// Ack defines configuration for the ACK functionality of the HEC receiver +type Ack struct { + // Extension defines the extension to use for acking of events. Without specifying an extension, the ACK endpoint won't be exposed + Extension *component.ID `mapstructure:"ack_extension"` + // Path for Ack API, default is '/services/collector/ack' + Path string `mapstructure:"ack_path"` } diff --git a/receiver/splunkhecreceiver/config_test.go b/receiver/splunkhecreceiver/config_test.go index 6716a8dce5df1..aab6df95b67bb 100644 --- a/receiver/splunkhecreceiver/config_test.go +++ b/receiver/splunkhecreceiver/config_test.go @@ -44,7 +44,7 @@ func TestLoadConfig(t *testing.T) { RawPath: "/foo", Splitting: SplittingStrategyLine, HealthPath: "/bar", - AckPath: "/services/collector/ack", + Ack: Ack{Path: "/services/collector/ack"}, HecToOtelAttrs: splunk.HecToOtelAttrs{ Source: "file.name", SourceType: "foobar", @@ -71,7 +71,7 @@ func TestLoadConfig(t *testing.T) { RawPath: "/services/collector/raw", Splitting: SplittingStrategyLine, HealthPath: "/services/collector/health", - AckPath: "/services/collector/ack", + Ack: Ack{Path: "/services/collector/ack"}, HecToOtelAttrs: splunk.HecToOtelAttrs{ Source: "com.splunk.source", SourceType: "com.splunk.sourcetype", diff --git a/receiver/splunkhecreceiver/factory.go b/receiver/splunkhecreceiver/factory.go index da774518997a4..f2a0ff92707b5 100644 --- a/receiver/splunkhecreceiver/factory.go +++ b/receiver/splunkhecreceiver/factory.go @@ -49,8 +49,11 @@ func createDefaultConfig() component.Config { }, RawPath: splunk.DefaultRawPath, HealthPath: splunk.DefaultHealthPath, - AckPath: splunk.DefaultAckPath, - Splitting: SplittingStrategyLine, + Ack: Ack{ + Extension: nil, + Path: splunk.DefaultAckPath, + }, + Splitting: SplittingStrategyLine, } } diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index bcc9bb9acbf84..c65292dc98167 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -207,10 +207,10 @@ func (r *splunkReceiver) Start(_ context.Context, host component.Host) error { mx.NewRoute().HandlerFunc(r.handleReq) // set up the ack API handler if the ack extension is present - if storageID := r.config.AckExtension; storageID != nil { + if storageID := r.config.Ack.Extension; storageID != nil { if ext, found := host.GetExtensions()[*storageID]; found { r.ackExt = ext.(ackextension.AckExtension) - mx.NewRoute().Path(r.config.AckPath).HandlerFunc(r.handleAck) + mx.NewRoute().Path(r.config.Ack.Path).HandlerFunc(r.handleAck) } else { return fmt.Errorf("specified ack extension with id '%q' could not be found", *storageID) } @@ -253,7 +253,9 @@ func (r *splunkReceiver) Shutdown(context.Context) error { return err } -func (r *splunkReceiver) writeSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, ackID uint64) { +func (r *splunkReceiver) writeSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, partitionID string) { + ackID := r.ackExt.ProcessEvent(partitionID) + r.ackExt.Ack(partitionID, ackID) r.writeSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) } @@ -328,19 +330,10 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques r.failRequest(ctx, resp, http.StatusUnsupportedMediaType, invalidEncodingRespBody, 0, errInvalidEncoding) return } - var partitionID string if r.ackExt != nil { - // check channel header exists - partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) + partitionID = r.validateChannelHeader(ctx, resp, req) if len(partitionID) == 0 { - r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) - return - } - // check validity of channel - _, err := uuid.Parse(partitionID) - if err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) return } } @@ -387,23 +380,15 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques return } - var ackID uint64 - if r.ackExt != nil { - ackID = r.ackExt.ProcessEvent(partitionID) - } - consumerErr := r.logsConsumer.ConsumeLogs(ctx, ld) - if r.ackExt != nil { - r.ackExt.Ack(partitionID, ackID) - } _ = bodyReader.Close() if consumerErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, slLen, consumerErr) } else { if r.ackExt != nil { - r.writeSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), ackID) + r.writeSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), partitionID) } else { r.writeSuccessResponseWithoutAck(ctx, resp, ld.LogRecordCount()) } @@ -411,6 +396,22 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques } } +func (r *splunkReceiver) validateChannelHeader(ctx context.Context, resp http.ResponseWriter, req *http.Request) string { + var partitionID string + // check channel header exists + partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) + if len(partitionID) == 0 { + r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) + } + // check validity of channel + _, err := uuid.Parse(partitionID) + if err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) + } + + return partitionID +} + func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) { ctx := req.Context() if r.logsConsumer != nil { @@ -433,16 +434,8 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) var partitionID string if r.ackExt != nil { - // check channel header exists - partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) + partitionID = r.validateChannelHeader(ctx, resp, req) if len(partitionID) == 0 { - r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) - return - } - // check validity of channel - _, err := uuid.Parse(partitionID) - if err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) return } } @@ -510,11 +503,6 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } resourceCustomizer := r.createResourceCustomizer(req) - var ackID uint64 - if r.ackExt != nil { - ackID = r.ackExt.ProcessEvent(partitionID) - } - if r.logsConsumer != nil && len(events) > 0 { ld, err := splunkHecToLogData(r.settings.Logger, events, resourceCustomizer, r.config) if err != nil { @@ -522,9 +510,6 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) return } decodeErr := r.logsConsumer.ConsumeLogs(ctx, ld) - if r.ackExt != nil { - r.ackExt.Ack(partitionID, ackID) - } r.obsrecv.EndLogsOp(ctx, metadata.Type.String(), len(events), decodeErr) if decodeErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, len(events), decodeErr) @@ -533,11 +518,7 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } if r.metricsConsumer != nil && len(metricEvents) > 0 { md, _ := splunkHecToMetricsData(r.settings.Logger, metricEvents, resourceCustomizer, r.config) - decodeErr := r.metricsConsumer.ConsumeMetrics(ctx, md) - if r.ackExt != nil { - r.ackExt.Ack(partitionID, ackID) - } r.obsrecv.EndMetricsOp(ctx, metadata.Type.String(), len(metricEvents), decodeErr) if decodeErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, len(metricEvents), decodeErr) @@ -546,7 +527,7 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } if r.ackExt != nil { - r.writeSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), ackID) + r.writeSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), partitionID) } else { r.writeSuccessResponseWithoutAck(ctx, resp, len(events)+len(metricEvents)) } diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index 06ace788ff3c6..fe9963a0bdf85 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1130,7 +1130,7 @@ func Test_splunkhecReceiver_Start(t *testing.T) { name: "ack_extension_does_not_exist", getConfig: func() *Config { config := createDefaultConfig().(*Config) - config.AckExtension = &component.ID{} + config.Ack.Extension = &component.ID{} return config }, errorExpected: true, @@ -1168,9 +1168,9 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { t.Parallel() config := createDefaultConfig().(*Config) config.Endpoint = "localhost:0" // Actually not creating the endpoint - config.AckPath = "/ack" + config.Ack.Path = "/ack" id := component.MustNewID("ack_extension") - config.AckExtension = &id + config.Ack.Extension = &id tests := []struct { name string @@ -1258,6 +1258,23 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { assert.Equal(t, map[string]any{"text": "Invalid data format", "code": float64(6)}, body) }, }, + { + name: "invalid_request_body", + req: func() *http.Request { + req := httptest.NewRequest("POST", "http://localhost/ack", bytes.NewReader([]byte(`hi there`))) + req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") + return req + }(), + setupMockAckExtension: func(t *testing.T) component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data format", "code": float64(6)}, body) + }, + }, { name: "happy_path", req: func() *http.Request { @@ -1327,7 +1344,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { config.Endpoint = "localhost:0" // Actually not creating the endpoint config.RawPath = "/foo" id := component.MustNewID("ack_extension") - config.AckExtension = &id + config.Ack.Extension = &id currentTime := float64(time.Now().UnixNano()) / 1e6 splunkMsg := buildSplunkHecMsg(currentTime, 3) @@ -1432,7 +1449,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { config := createDefaultConfig().(*Config) config.Endpoint = "localhost:0" // Actually not creating the endpoint id := component.MustNewID("ack_extension") - config.AckExtension = &id + config.Ack.Extension = &id currentTime := float64(time.Now().UnixNano()) / 1e6 splunkMsg := buildSplunkHecMsg(currentTime, 3) From 59005d9073c4efb869001e78125459fc7f457e39 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 26 Mar 2024 22:05:52 -0700 Subject: [PATCH 17/46] test --- cmd/otelcontribcol/go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index beb7ac65a7f4b..173098f279430 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -531,6 +531,7 @@ require ( github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect github.com/oklog/ulid/v2 v2.1.0 // indirect github.com/open-telemetry/opamp-go v0.12.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.97.0 // indirect From 8c311a1ddd018fc35823a8ddf6c82125feb7cdd4 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 26 Mar 2024 22:11:55 -0700 Subject: [PATCH 18/46] test --- receiver/splunkhecreceiver/go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index c076ccfa17973..a00c28a318ca1 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -7,6 +7,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/json-iterator/go v1.1.12 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.97.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.97.0 From 129d1089619da1ce0382a7551feea2e9587156a3 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 26 Mar 2024 22:22:21 -0700 Subject: [PATCH 19/46] test --- receiver/splunkhecreceiver/go.mod | 2 +- receiver/splunkhecreceiver/go.sum | 2 ++ receiver/splunkhecreceiver/receiver.go | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index a00c28a318ca1..2f32a440aca7c 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -81,7 +81,7 @@ require ( golang.org/x/net v0.22.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/receiver/splunkhecreceiver/go.sum b/receiver/splunkhecreceiver/go.sum index d901b1e62d870..72e7d1ca2d032 100644 --- a/receiver/splunkhecreceiver/go.sum +++ b/receiver/splunkhecreceiver/go.sum @@ -300,6 +300,8 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index c65292dc98167..35f004d6c68a5 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -402,11 +402,13 @@ func (r *splunkReceiver) validateChannelHeader(ctx context.Context, resp http.Re partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) if len(partitionID) == 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) + return "" } // check validity of channel _, err := uuid.Parse(partitionID) if err != nil { r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) + return "" } return partitionID From 686c871eafad66fb34233c4accd8740be48a48a9 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 26 Mar 2024 22:48:49 -0700 Subject: [PATCH 20/46] test --- cmd/configschema/go.mod | 3 ++- cmd/configschema/go.sum | 4 ++-- cmd/otelcontribcol/go.mod | 2 +- cmd/otelcontribcol/go.sum | 1 + cmd/oteltestbedcol/go.mod | 3 ++- cmd/oteltestbedcol/go.sum | 4 ++-- go.mod | 3 ++- go.sum | 4 ++-- receiver/splunkhecreceiver/go.sum | 2 -- testbed/go.mod | 3 ++- testbed/go.sum | 4 ++-- 11 files changed, 18 insertions(+), 15 deletions(-) diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index 0b31c35488290..dd33373efd302 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -489,6 +489,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.97.0 // indirect @@ -696,7 +697,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/cmd/configschema/go.sum b/cmd/configschema/go.sum index 131e421b84492..23f2b15c10125 100644 --- a/cmd/configschema/go.sum +++ b/cmd/configschema/go.sum @@ -2256,8 +2256,8 @@ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index 173098f279430..1b3e2b7389d2a 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -714,7 +714,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/cmd/otelcontribcol/go.sum b/cmd/otelcontribcol/go.sum index 6076bcc4ae65b..239fd4382ffac 100644 --- a/cmd/otelcontribcol/go.sum +++ b/cmd/otelcontribcol/go.sum @@ -2257,6 +2257,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1: google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index f1948e71baabd..28d6eb5845254 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -167,6 +167,7 @@ require ( github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0 // indirect @@ -277,7 +278,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 83c8ffa24fd7b..8bb288d492fa3 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -1131,8 +1131,8 @@ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c h1:9g7erC9qu44ks7UK4gDNlnk4kOxZG707xKm4jVniy6o= google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c h1:NUsgEN92SQQqzfA+YtqYNqYmB3DMMYLlIwUZAQFVFbo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/go.mod b/go.mod index f813dfcecbc96..c5b030933b21f 100644 --- a/go.mod +++ b/go.mod @@ -496,6 +496,7 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight v0.97.0 // indirect @@ -690,7 +691,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 5ceb572211a73..4b438c8ac5281 100644 --- a/go.sum +++ b/go.sum @@ -2257,8 +2257,8 @@ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= diff --git a/receiver/splunkhecreceiver/go.sum b/receiver/splunkhecreceiver/go.sum index 72e7d1ca2d032..7630bc84a6ecf 100644 --- a/receiver/splunkhecreceiver/go.sum +++ b/receiver/splunkhecreceiver/go.sum @@ -298,8 +298,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= diff --git a/testbed/go.mod b/testbed/go.mod index 054504218db4f..19409a9fb5f34 100644 --- a/testbed/go.mod +++ b/testbed/go.mod @@ -179,6 +179,7 @@ require ( github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.97.0 // indirect @@ -265,7 +266,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/testbed/go.sum b/testbed/go.sum index 9d1a0c1cc03b3..9fedaa2f882ac 100644 --- a/testbed/go.sum +++ b/testbed/go.sum @@ -1114,8 +1114,8 @@ google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/b google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe h1:0poefMBYvYbs7g5UkjS6HcxBPaTRAmznle9jnxYoAI8= google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= From 2ddbf6883a89cc2a98f7312f11b06d7334e69fa6 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 26 Mar 2024 23:06:44 -0700 Subject: [PATCH 21/46] test --- cmd/otelcontribcol/go.sum | 3 +-- cmd/oteltestbedcol/components.go | 20 ++++++++++---------- cmd/oteltestbedcol/components_test.go | 1 - cmd/oteltestbedcol/main_windows.go | 3 +-- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/cmd/otelcontribcol/go.sum b/cmd/otelcontribcol/go.sum index 239fd4382ffac..41d93eaa35307 100644 --- a/cmd/otelcontribcol/go.sum +++ b/cmd/otelcontribcol/go.sum @@ -2255,8 +2255,7 @@ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJ google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= diff --git a/cmd/oteltestbedcol/components.go b/cmd/oteltestbedcol/components.go index d3a593c7b081a..6efb290a1161a 100644 --- a/cmd/oteltestbedcol/components.go +++ b/cmd/oteltestbedcol/components.go @@ -5,19 +5,13 @@ package main import ( "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/exporter" - debugexporter "go.opentelemetry.io/collector/exporter/debugexporter" - otlpexporter "go.opentelemetry.io/collector/exporter/otlpexporter" - otlphttpexporter "go.opentelemetry.io/collector/exporter/otlphttpexporter" "go.opentelemetry.io/collector/extension" - ballastextension "go.opentelemetry.io/collector/extension/ballastextension" - zpagesextension "go.opentelemetry.io/collector/extension/zpagesextension" "go.opentelemetry.io/collector/otelcol" "go.opentelemetry.io/collector/processor" - batchprocessor "go.opentelemetry.io/collector/processor/batchprocessor" - memorylimiterprocessor "go.opentelemetry.io/collector/processor/memorylimiterprocessor" "go.opentelemetry.io/collector/receiver" - otlpreceiver "go.opentelemetry.io/collector/receiver/otlpreceiver" - + debugexporter "go.opentelemetry.io/collector/exporter/debugexporter" + otlpexporter "go.opentelemetry.io/collector/exporter/otlpexporter" + otlphttpexporter "go.opentelemetry.io/collector/exporter/otlphttpexporter" carbonexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter" opencensusexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter" opensearchexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter" @@ -27,10 +21,15 @@ import ( splunkhecexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" syslogexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter" zipkinexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter" + ballastextension "go.opentelemetry.io/collector/extension/ballastextension" + zpagesextension "go.opentelemetry.io/collector/extension/zpagesextension" pprofextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" filestorage "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" + batchprocessor "go.opentelemetry.io/collector/processor/batchprocessor" + memorylimiterprocessor "go.opentelemetry.io/collector/processor/memorylimiterprocessor" attributesprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" resourceprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor" + otlpreceiver "go.opentelemetry.io/collector/receiver/otlpreceiver" carbonreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver" filelogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver" fluentforwardreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver" @@ -108,7 +107,8 @@ func components() (otelcol.Factories, error) { return otelcol.Factories{}, err } - factories.Connectors, err = connector.MakeFactoryMap() + factories.Connectors, err = connector.MakeFactoryMap( + ) if err != nil { return otelcol.Factories{}, err } diff --git a/cmd/oteltestbedcol/components_test.go b/cmd/oteltestbedcol/components_test.go index 89859a065f241..aaf9ee8b965ff 100644 --- a/cmd/oteltestbedcol/components_test.go +++ b/cmd/oteltestbedcol/components_test.go @@ -4,7 +4,6 @@ package main import ( "testing" - "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/component/componenttest" ) diff --git a/cmd/oteltestbedcol/main_windows.go b/cmd/oteltestbedcol/main_windows.go index bb68124a52c9b..a4930afdca100 100644 --- a/cmd/oteltestbedcol/main_windows.go +++ b/cmd/oteltestbedcol/main_windows.go @@ -7,10 +7,9 @@ package main import ( "errors" "fmt" - - "go.opentelemetry.io/collector/otelcol" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" + "go.opentelemetry.io/collector/otelcol" ) func run(params otelcol.CollectorSettings) error { From cf85bb97d5654966efd373934672c0b06c0e4694 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 27 Mar 2024 10:31:47 -0700 Subject: [PATCH 22/46] fix lint --- receiver/splunkhecreceiver/receiver.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 35f004d6c68a5..7cc34691c1c4e 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -397,9 +397,8 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques } func (r *splunkReceiver) validateChannelHeader(ctx context.Context, resp http.ResponseWriter, req *http.Request) string { - var partitionID string // check channel header exists - partitionID = req.Header.Get(splunk.HTTPSplunkChannelHeader) + partitionID := req.Header.Get(splunk.HTTPSplunkChannelHeader) if len(partitionID) == 0 { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return "" From e4239178b505c64b334c3a31e54ef9194c843481 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 27 Mar 2024 14:24:46 -0700 Subject: [PATCH 23/46] test --- cmd/oteltestbedcol/go.mod | 250 +------------------- cmd/oteltestbedcol/go.sum | 2 + receiver/splunkhecreceiver/receiver.go | 2 +- receiver/splunkhecreceiver/receiver_test.go | 44 ++-- 4 files changed, 27 insertions(+), 271 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index 28d6eb5845254..77e53b83159eb 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -31,269 +31,21 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.97.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.97.0 - go.opentelemetry.io/collector/connector v0.97.0 - go.opentelemetry.io/collector/exporter v0.97.0 go.opentelemetry.io/collector/exporter/debugexporter v0.97.0 go.opentelemetry.io/collector/exporter/otlpexporter v0.97.0 go.opentelemetry.io/collector/exporter/otlphttpexporter v0.97.0 - go.opentelemetry.io/collector/extension v0.97.0 go.opentelemetry.io/collector/extension/ballastextension v0.97.0 go.opentelemetry.io/collector/extension/zpagesextension v0.97.0 go.opentelemetry.io/collector/otelcol v0.97.0 - go.opentelemetry.io/collector/processor v0.97.0 go.opentelemetry.io/collector/processor/batchprocessor v0.97.0 go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.97.0 - go.opentelemetry.io/collector/receiver v0.97.0 go.opentelemetry.io/collector/receiver/otlpreceiver v0.97.0 - go.uber.org/goleak v1.3.0 - golang.org/x/sys v0.18.0 ) require ( - cloud.google.com/go/compute v1.24.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.4.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect - github.com/apache/thrift v0.20.0 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.50.17 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.108.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect - github.com/docker/go-connections v0.5.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/elastic/go-structform v0.0.10 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/expr-lang/expr v1.16.2 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.20.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect - github.com/go-resty/resty/v2 v2.11.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gogo/googleapis v1.4.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.1 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect - github.com/hashicorp/consul/api v1.27.0 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.6.2 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect - github.com/iancoleman/strcase v0.3.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/influxdata/go-syslog/v3 v3.0.1-0.20230911200830-875f5bc594a4 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jaegertracing/jaeger v1.55.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.7 // indirect + cloud.google.com/go v0.112.1 // 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.0 // indirect - github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165 // indirect - github.com/linode/linodego v1.27.1 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/miekg/dns v1.1.58 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // 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/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.97.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opensearch-project/opensearch-go/v2 v2.3.0 // indirect - github.com/openzipkin/zipkin-go v0.4.2 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect - github.com/philhofer/fwd v1.1.2 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.0 // indirect - github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.51.1 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/prometheus/prometheus v0.50.1 // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.22 // indirect - github.com/shirou/gopsutil/v3 v3.24.2 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 // indirect - github.com/signalfx/sapm-proto v0.14.0 // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/tinylib/msgp v1.1.9 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/valyala/fastjson v1.6.4 // indirect - github.com/vultr/govultr/v2 v2.17.2 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.etcd.io/bbolt v1.3.9 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.97.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.97.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.4.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.97.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.97.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.97.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.4.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.97.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.97.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.97.0 // indirect - go.opentelemetry.io/collector/config/internal v0.97.0 // indirect - go.opentelemetry.io/collector/confmap v0.97.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.97.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.97.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.97.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.97.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.97.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.97.0 // indirect - go.opentelemetry.io/collector/consumer v0.97.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.97.0 // indirect - go.opentelemetry.io/collector/featuregate v1.4.0 // indirect - go.opentelemetry.io/collector/pdata v1.4.0 // indirect - go.opentelemetry.io/collector/semconv v0.97.0 // indirect - go.opentelemetry.io/collector/service v0.97.0 // indirect - go.opentelemetry.io/contrib/config v0.4.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.24.0 // indirect - go.opentelemetry.io/contrib/zpages v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.46.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.1.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.17.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.166.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect - google.golang.org/grpc v1.62.1 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.6 // indirect - k8s.io/apimachinery v0.28.6 // indirect - k8s.io/client-go v0.28.6 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ../../extension/storage diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 8bb288d492fa3..077f010716191 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -13,6 +13,8 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 7cc34691c1c4e..d9366420fc45c 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -307,7 +307,7 @@ func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) var ackRequest splunk.AckRequest err = dec.Decode(&ackRequest) - if err != nil { + if err != nil || len(ackRequest.Acks) == 0 { r.failRequest(ctx, resp, http.StatusBadRequest, invalidFormatRespBody, 0, err) return } diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index 90e21052aca60..d2073ac594d54 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1175,13 +1175,13 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { tests := []struct { name string req *http.Request - setupMockAckExtension func(t *testing.T) component.Component + setupMockAckExtension func() component.Component assertResponse func(t *testing.T, resp *http.Response, body any) }{ { name: "incorrect_method", req: httptest.NewRequest("PUT", "http://localhost/ack", nil), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1197,7 +1197,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { req := httptest.NewRequest("POST", "http://localhost/ack", nil) return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1214,7 +1214,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "invalid-id") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1231,7 +1231,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1242,13 +1242,15 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { }, }, { - name: "invalid_request_body", + name: "empty_ack_in_request_body", req: func() *http.Request { - req := httptest.NewRequest("POST", "http://localhost/ack", bytes.NewReader([]byte(`hi there`))) + msgBytes, err := json.Marshal(buildSplunkHecAckMsg([]uint64{})) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/ack", bytes.NewReader(msgBytes)) req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1265,7 +1267,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1284,7 +1286,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} mockAckExtension.On("QueryAcks", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", []uint64{1, 2, 3}).Once().Return(map[uint64]bool{ 1: true, @@ -1312,7 +1314,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { assert.NoError(t, err) mockHost := mockHost{extensions: map[component.ID]component.Component{ - id: tt.setupMockAckExtension(t), + id: tt.setupMockAckExtension(), }} r := rcv.(*splunkReceiver) @@ -1351,7 +1353,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { tests := []struct { name string req *http.Request - setupMockAckExtension func(t *testing.T) component.Component + setupMockAckExtension func() component.Component assertResponse func(t *testing.T, resp *http.Response, body any) }{ { @@ -1362,7 +1364,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1381,7 +1383,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "invalid-id") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1400,7 +1402,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} mockAckExtension.On("ProcessEvent", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90").Once().Return(uint64(1)) mockAckExtension.On("Ack", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", uint64(1)).Once() @@ -1419,7 +1421,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { assert.NoError(t, err) mh := mockHost{extensions: map[component.ID]component.Component{ - id: tt.setupMockAckExtension(t), + id: tt.setupMockAckExtension(), }} r := rcv.(*splunkReceiver) @@ -1458,7 +1460,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { req *http.Request assertResponse func(t *testing.T, resp *http.Response, body any) assertSink func(t *testing.T, sink *consumertest.LogsSink) - setupMockAckExtension func(t *testing.T) component.Component + setupMockAckExtension func() component.Component }{ { name: "no_channel_header", @@ -1468,7 +1470,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1490,7 +1492,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "invalid-id") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} return &mockAckExtension }, @@ -1512,7 +1514,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { req.Header.Set("X-Splunk-Request-Channel", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90") return req }(), - setupMockAckExtension: func(t *testing.T) component.Component { + setupMockAckExtension: func() component.Component { mockAckExtension := mocks.AckExtension{} mockAckExtension.On("ProcessEvent", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90").Once().Return(uint64(1)) mockAckExtension.On("Ack", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", uint64(1)).Once() @@ -1537,7 +1539,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { w := httptest.NewRecorder() mh := mockHost{extensions: map[component.ID]component.Component{ - id: tt.setupMockAckExtension(t), + id: tt.setupMockAckExtension(), }} assert.NoError(t, r.Start(context.Background(), mh)) From ba5127652239cbb2b654381eb5b57a75c8455956 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 27 Mar 2024 14:42:32 -0700 Subject: [PATCH 24/46] test --- cmd/oteltestbedcol/go.mod | 250 +++++++++++++++++++++++++++++++++++++- cmd/oteltestbedcol/go.sum | 2 - 2 files changed, 249 insertions(+), 3 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index 77e53b83159eb..28d6eb5845254 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -31,21 +31,269 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.97.0 + github.com/stretchr/testify v1.9.0 + go.opentelemetry.io/collector/component v0.97.0 + go.opentelemetry.io/collector/connector v0.97.0 + go.opentelemetry.io/collector/exporter v0.97.0 go.opentelemetry.io/collector/exporter/debugexporter v0.97.0 go.opentelemetry.io/collector/exporter/otlpexporter v0.97.0 go.opentelemetry.io/collector/exporter/otlphttpexporter v0.97.0 + go.opentelemetry.io/collector/extension v0.97.0 go.opentelemetry.io/collector/extension/ballastextension v0.97.0 go.opentelemetry.io/collector/extension/zpagesextension v0.97.0 go.opentelemetry.io/collector/otelcol v0.97.0 + go.opentelemetry.io/collector/processor v0.97.0 go.opentelemetry.io/collector/processor/batchprocessor v0.97.0 go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.97.0 + go.opentelemetry.io/collector/receiver v0.97.0 go.opentelemetry.io/collector/receiver/otlpreceiver v0.97.0 + go.uber.org/goleak v1.3.0 + golang.org/x/sys v0.18.0 ) require ( - cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute v1.24.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.4.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect + github.com/Code-Hex/go-generics-cache v1.3.1 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/alecthomas/participle/v2 v2.1.1 // indirect + github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect + github.com/apache/thrift v0.20.0 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/aws/aws-sdk-go v1.50.17 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dennwc/varint v1.0.0 // indirect + github.com/digitalocean/godo v1.108.0 // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/docker v25.0.5+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/elastic/go-structform v0.0.10 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/envoyproxy/go-control-plane v0.12.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect + github.com/expr-lang/expr v1.16.2 // indirect + github.com/fatih/color v1.15.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-resty/resty/v2 v2.11.0 // indirect + github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-zookeeper/zk v1.0.3 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.1 // indirect + github.com/gophercloud/gophercloud v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect + github.com/hashicorp/consul/api v1.27.0 // indirect + github.com/hashicorp/cronexpr v1.1.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.6.2 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.4 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/influxdata/go-syslog/v3 v3.0.1-0.20230911200830-875f5bc594a4 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect + github.com/jaegertracing/jaeger v1.55.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.7 // 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.0 // indirect + github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165 // indirect + github.com/linode/linodego v1.27.1 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/miekg/dns v1.1.58 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // 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/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.97.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.97.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/opensearch-project/opensearch-go/v2 v2.3.0 // indirect + github.com/openzipkin/zipkin-go v0.4.2 // indirect + github.com/ovh/go-ovh v1.4.3 // indirect + github.com/philhofer/fwd v1.1.2 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.51.1 // indirect + github.com/prometheus/common/sigv4 v0.1.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/prometheus v0.50.1 // indirect + github.com/rs/cors v1.10.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.22 // indirect + github.com/shirou/gopsutil/v3 v3.24.2 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 // indirect + github.com/signalfx/sapm-proto v0.14.0 // indirect + github.com/soheilhy/cmux v0.1.5 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/tinylib/msgp v1.1.9 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/valyala/fastjson v1.6.4 // indirect + github.com/vultr/govultr/v2 v2.17.2 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.etcd.io/bbolt v1.3.9 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/collector v0.97.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.97.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.4.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.97.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.97.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.97.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.4.0 // indirect + go.opentelemetry.io/collector/config/configretry v0.97.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.97.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.97.0 // indirect + go.opentelemetry.io/collector/config/internal v0.97.0 // indirect + go.opentelemetry.io/collector/confmap v0.97.0 // indirect + go.opentelemetry.io/collector/confmap/converter/expandconverter v0.97.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v0.97.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v0.97.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v0.97.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.97.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.97.0 // indirect + go.opentelemetry.io/collector/consumer v0.97.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.97.0 // indirect + go.opentelemetry.io/collector/featuregate v1.4.0 // indirect + go.opentelemetry.io/collector/pdata v1.4.0 // indirect + go.opentelemetry.io/collector/semconv v0.97.0 // indirect + go.opentelemetry.io/collector/service v0.97.0 // indirect + go.opentelemetry.io/contrib/config v0.4.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.24.0 // indirect + go.opentelemetry.io/contrib/zpages v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/bridge/opencensus v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.46.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/sdk v1.24.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/proto/otlp v1.1.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.17.0 // indirect + gonum.org/v1/gonum v0.15.0 // indirect + google.golang.org/api v0.166.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.28.6 // indirect + k8s.io/apimachinery v0.28.6 // indirect + k8s.io/client-go v0.28.6 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ../../extension/storage diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 077f010716191..8bb288d492fa3 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -13,8 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= From 510673f8a9d15f432c0ddbf5f7645c6008d91ed9 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 27 Mar 2024 15:03:17 -0700 Subject: [PATCH 25/46] test --- cmd/oteltestbedcol/go.mod | 2 +- cmd/oteltestbedcol/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index e70e755e6d023..4653df1bd1135 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -277,7 +277,7 @@ require ( google.golang.org/api v0.170.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum index 3bb88e745c835..a946d0e1e2845 100644 --- a/cmd/oteltestbedcol/go.sum +++ b/cmd/oteltestbedcol/go.sum @@ -1129,8 +1129,8 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c h1:kaI7oewGK5YnVwj+Y+EJBO/YN1ht8iTL9XkFHtVZLsc= google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c/go.mod h1:VQW3tUculP/D4B+xVCo+VgSq8As6wA9ZjHl//pmk+6s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c h1:lfpJ/2rWPa/kJgxyyXM8PrNnfCzcmxJ265mADgwmvLI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= From 9f91b679f393eb5c8ce8a8d8d6b99b2a314a6fc1 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 27 Mar 2024 16:21:34 -0700 Subject: [PATCH 26/46] test --- cmd/oteltestbedcol/builder-config.yaml | 1 + cmd/oteltestbedcol/components.go | 20 ++++++++++---------- cmd/oteltestbedcol/components_test.go | 1 + cmd/oteltestbedcol/main_windows.go | 3 ++- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/cmd/oteltestbedcol/builder-config.yaml b/cmd/oteltestbedcol/builder-config.yaml index 28bac3a3117ab..e697559a3a1f8 100644 --- a/cmd/oteltestbedcol/builder-config.yaml +++ b/cmd/oteltestbedcol/builder-config.yaml @@ -99,3 +99,4 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 - github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 + - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/oteltestbedcol/components.go b/cmd/oteltestbedcol/components.go index 6efb290a1161a..d3a593c7b081a 100644 --- a/cmd/oteltestbedcol/components.go +++ b/cmd/oteltestbedcol/components.go @@ -5,13 +5,19 @@ package main import ( "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/exporter" + debugexporter "go.opentelemetry.io/collector/exporter/debugexporter" + otlpexporter "go.opentelemetry.io/collector/exporter/otlpexporter" + otlphttpexporter "go.opentelemetry.io/collector/exporter/otlphttpexporter" "go.opentelemetry.io/collector/extension" + ballastextension "go.opentelemetry.io/collector/extension/ballastextension" + zpagesextension "go.opentelemetry.io/collector/extension/zpagesextension" "go.opentelemetry.io/collector/otelcol" "go.opentelemetry.io/collector/processor" + batchprocessor "go.opentelemetry.io/collector/processor/batchprocessor" + memorylimiterprocessor "go.opentelemetry.io/collector/processor/memorylimiterprocessor" "go.opentelemetry.io/collector/receiver" - debugexporter "go.opentelemetry.io/collector/exporter/debugexporter" - otlpexporter "go.opentelemetry.io/collector/exporter/otlpexporter" - otlphttpexporter "go.opentelemetry.io/collector/exporter/otlphttpexporter" + otlpreceiver "go.opentelemetry.io/collector/receiver/otlpreceiver" + carbonexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter" opencensusexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter" opensearchexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter" @@ -21,15 +27,10 @@ import ( splunkhecexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" syslogexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter" zipkinexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter" - ballastextension "go.opentelemetry.io/collector/extension/ballastextension" - zpagesextension "go.opentelemetry.io/collector/extension/zpagesextension" pprofextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" filestorage "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" - batchprocessor "go.opentelemetry.io/collector/processor/batchprocessor" - memorylimiterprocessor "go.opentelemetry.io/collector/processor/memorylimiterprocessor" attributesprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" resourceprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor" - otlpreceiver "go.opentelemetry.io/collector/receiver/otlpreceiver" carbonreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver" filelogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver" fluentforwardreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver" @@ -107,8 +108,7 @@ func components() (otelcol.Factories, error) { return otelcol.Factories{}, err } - factories.Connectors, err = connector.MakeFactoryMap( - ) + factories.Connectors, err = connector.MakeFactoryMap() if err != nil { return otelcol.Factories{}, err } diff --git a/cmd/oteltestbedcol/components_test.go b/cmd/oteltestbedcol/components_test.go index aaf9ee8b965ff..89859a065f241 100644 --- a/cmd/oteltestbedcol/components_test.go +++ b/cmd/oteltestbedcol/components_test.go @@ -4,6 +4,7 @@ package main import ( "testing" + "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/component/componenttest" ) diff --git a/cmd/oteltestbedcol/main_windows.go b/cmd/oteltestbedcol/main_windows.go index a4930afdca100..bb68124a52c9b 100644 --- a/cmd/oteltestbedcol/main_windows.go +++ b/cmd/oteltestbedcol/main_windows.go @@ -7,9 +7,10 @@ package main import ( "errors" "fmt" + + "go.opentelemetry.io/collector/otelcol" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" - "go.opentelemetry.io/collector/otelcol" ) func run(params otelcol.CollectorSettings) error { From 18dbe877e83f67d10fa18c95b0282a060b07b182 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 27 Mar 2024 22:03:25 -0700 Subject: [PATCH 27/46] address PR comments --- receiver/splunkhecreceiver/receiver.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index d9366420fc45c..34f6916717217 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -332,8 +332,9 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques } var partitionID string if r.ackExt != nil { - partitionID = r.validateChannelHeader(ctx, resp, req) - if len(partitionID) == 0 { + var err error + if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) return } } @@ -396,21 +397,21 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques } } -func (r *splunkReceiver) validateChannelHeader(ctx context.Context, resp http.ResponseWriter, req *http.Request) string { +func (r *splunkReceiver) validateAndExtractChannelHeader(req *http.Request) (string, error) { // check channel header exists partitionID := req.Header.Get(splunk.HTTPSplunkChannelHeader) + if len(partitionID) == 0 { - r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) - return "" + return partitionID, errors.New(responseErrDataChannelMissing) } + // check validity of channel _, err := uuid.Parse(partitionID) if err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) - return "" + return partitionID, errors.New(responseErrInvalidDataChannel) } - return partitionID + return partitionID, nil } func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) { @@ -435,8 +436,9 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) var partitionID string if r.ackExt != nil { - partitionID = r.validateChannelHeader(ctx, resp, req) - if len(partitionID) == 0 { + var err error + if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) return } } From e8035b99c9d6c614dd71a9bf359d02ea23cd2b03 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 1 Apr 2024 22:12:10 -0700 Subject: [PATCH 28/46] address MR comments --- receiver/splunkhecreceiver/receiver.go | 38 ++++++++++++--------- receiver/splunkhecreceiver/receiver_test.go | 10 ++---- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 34f6916717217..6f848520aeadd 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -331,12 +331,15 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques return } var partitionID string - if r.ackExt != nil { - var err error - if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) - return - } + var err error + if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) + return + } + + if len(partitionID) > 0 && r.ackExt == nil { + // when channel id is provided in request but ackExt is not set up, fail the request. + r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, 0, nil) } if req.ContentLength == 0 { @@ -388,7 +391,7 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques if consumerErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, slLen, consumerErr) } else { - if r.ackExt != nil { + if len(partitionID) > 0 && r.ackExt != nil { r.writeSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), partitionID) } else { r.writeSuccessResponseWithoutAck(ctx, resp, ld.LogRecordCount()) @@ -402,13 +405,13 @@ func (r *splunkReceiver) validateAndExtractChannelHeader(req *http.Request) (str partitionID := req.Header.Get(splunk.HTTPSplunkChannelHeader) if len(partitionID) == 0 { - return partitionID, errors.New(responseErrDataChannelMissing) + return "", nil } // check validity of channel _, err := uuid.Parse(partitionID) if err != nil { - return partitionID, errors.New(responseErrInvalidDataChannel) + return "", errors.New(responseErrInvalidDataChannel) } return partitionID, nil @@ -435,12 +438,15 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } var partitionID string - if r.ackExt != nil { - var err error - if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) - return - } + var err error + if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) + return + } + + if len(partitionID) > 0 && r.ackExt == nil { + // when channel id is provided in request but ackExt is not set up, fail the request. + r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, 0, nil) } bodyReader := req.Body @@ -529,7 +535,7 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } } - if r.ackExt != nil { + if len(partitionID) > 0 && r.ackExt != nil { r.writeSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), partitionID) } else { r.writeSuccessResponseWithoutAck(ctx, resp, len(events)+len(metricEvents)) diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index 4c864064c70f1..e84521c6a6852 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1369,9 +1369,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { - status := resp.StatusCode - assert.Equal(t, http.StatusBadRequest, status) - assert.Equal(t, map[string]any{"code": float64(10), "text": "Data channel is missing"}, body) + assertHecSuccessResponse(t, resp, body) }, }, { @@ -1475,12 +1473,10 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { - status := resp.StatusCode - assert.Equal(t, http.StatusBadRequest, status) - assert.Equal(t, map[string]any{"code": float64(10), "text": "Data channel is missing"}, body) + assertHecSuccessResponse(t, resp, body) }, assertSink: func(t *testing.T, sink *consumertest.LogsSink) { - assert.Equal(t, 0, len(sink.AllLogs())) + assert.Equal(t, 1, len(sink.AllLogs())) }, }, { From f0e3f20e02fb2077997a45e9394c88865099771f Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 1 Apr 2024 22:23:05 -0700 Subject: [PATCH 29/46] fix lint --- cmd/otelcontribcol/go.mod | 2 +- receiver/splunkhecreceiver/receiver.go | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index 75214576c814c..88356456b2e0e 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -530,8 +530,8 @@ require ( github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect github.com/oklog/ulid/v2 v2.1.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect github.com/open-telemetry/opamp-go v0.14.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.97.0 // indirect diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 6f848520aeadd..54e1e8d9069d1 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -331,9 +331,9 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques return } var partitionID string - var err error - if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) + var partitionErr error + if partitionID, partitionErr = r.validateAndExtractChannelHeader(req); partitionErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) return } @@ -438,9 +438,9 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } var partitionID string - var err error - if partitionID, err = r.validateAndExtractChannelHeader(req); err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(err.Error()), 0, err) + var partitionErr error + if partitionID, partitionErr = r.validateAndExtractChannelHeader(req); partitionErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) return } From 883b7784e997780bed048f0d99f16cf405853035 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 2 Apr 2024 21:51:01 -0700 Subject: [PATCH 30/46] make backward compatible --- receiver/splunkhecreceiver/receiver.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 54e1e8d9069d1..5fe331a4b5532 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -337,11 +337,6 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques return } - if len(partitionID) > 0 && r.ackExt == nil { - // when channel id is provided in request but ackExt is not set up, fail the request. - r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, 0, nil) - } - if req.ContentLength == 0 { r.obsrecv.EndLogsOp(ctx, metadata.Type.String(), 0, nil) r.failRequest(ctx, resp, http.StatusBadRequest, noDataRespBody, 0, nil) @@ -444,11 +439,6 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) return } - if len(partitionID) > 0 && r.ackExt == nil { - // when channel id is provided in request but ackExt is not set up, fail the request. - r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, 0, nil) - } - bodyReader := req.Body if encoding == gzipEncoding { reader := r.gzipReaderPool.Get().(*gzip.Reader) From 57494074da3e9fb9335c6c5cdd27b58fffa75237 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 3 Apr 2024 10:36:01 -0700 Subject: [PATCH 31/46] address PR comment --- receiver/splunkhecreceiver/receiver.go | 14 ++++--- receiver/splunkhecreceiver/receiver_test.go | 41 +++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 5fe331a4b5532..9e4b65b9cb1e3 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -396,20 +396,24 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques } func (r *splunkReceiver) validateAndExtractChannelHeader(req *http.Request) (string, error) { - // check channel header exists - partitionID := req.Header.Get(splunk.HTTPSplunkChannelHeader) + partitionID, ok := req.Header[splunk.HTTPSplunkChannelHeader] - if len(partitionID) == 0 { + // check channel header exists + if !ok { return "", nil } + if len(partitionID[0]) == 0 { + return "", errors.New(responseErrInvalidDataChannel) + } + // check validity of channel - _, err := uuid.Parse(partitionID) + _, err := uuid.Parse(partitionID[0]) if err != nil { return "", errors.New(responseErrInvalidDataChannel) } - return partitionID, nil + return partitionID[0], nil } func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) { diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index e84521c6a6852..4911c6fa2d417 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1372,6 +1372,25 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { assertHecSuccessResponse(t, resp, body) }, }, + { + name: "empty_channel_header", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + req.Header.Set("X-Splunk-Request-Channel", "") + return req + }(), + setupMockAckExtension: func() component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data channel", "code": float64(11)}, body) + }, + }, { name: "invalid_channel_header", req: func() *http.Request { @@ -1479,6 +1498,28 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { assert.Equal(t, 1, len(sink.AllLogs())) }, }, + { + name: "empty_channel_header", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(msgBytes)) + req.Header.Set("X-Splunk-Request-Channel", "") + return req + }(), + setupMockAckExtension: func() component.Component { + mockAckExtension := mocks.AckExtension{} + return &mockAckExtension + }, + assertResponse: func(t *testing.T, resp *http.Response, body any) { + status := resp.StatusCode + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, map[string]any{"text": "Invalid data channel", "code": float64(11)}, body) + }, + assertSink: func(t *testing.T, sink *consumertest.LogsSink) { + assert.Equal(t, 0, len(sink.AllLogs())) + }, + }, { name: "invalid_channel_header", req: func() *http.Request { From b3571a55d6ec97d1afd53115d352afbd0c1be237 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 3 Apr 2024 10:59:47 -0700 Subject: [PATCH 32/46] fix CI --- cmd/configschema/go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index 59014b25ef8f1..a28117e532cc3 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -1160,4 +1160,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/enco replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding => ../../extension/encoding replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension + replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector => ../../connector/grafanacloudconnector From 4df1c3f0f61f4b74d94c19576982e4b2563cc1f1 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 10 Apr 2024 11:31:28 -0700 Subject: [PATCH 33/46] address PR comments --- cmd/configschema/go.mod | 2 +- cmd/otelcontribcol/go.mod | 2 +- cmd/oteltestbedcol/go.mod | 2 +- exporter/splunkhecexporter/client.go | 8 +-- go.mod | 2 +- internal/splunk/common.go | 2 +- receiver/splunkhecreceiver/README.md | 3 + receiver/splunkhecreceiver/config.go | 2 +- receiver/splunkhecreceiver/go.mod | 2 +- receiver/splunkhecreceiver/receiver.go | 76 +++++++++++---------- receiver/splunkhecreceiver/receiver_test.go | 4 +- testbed/go.mod | 2 +- 12 files changed, 58 insertions(+), 49 deletions(-) diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index a28117e532cc3..a02821a09f754 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -490,7 +490,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.97.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.97.0 // indirect diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index a45af563457c1..1f06f8b346995 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -532,7 +532,7 @@ require ( github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect github.com/oklog/ulid/v2 v2.1.0 // indirect github.com/open-telemetry/opamp-go v0.14.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.97.0 // indirect diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index b5f491b6dbbac..689f62b40d7b5 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -167,7 +167,7 @@ require ( github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0 // indirect diff --git a/exporter/splunkhecexporter/client.go b/exporter/splunkhecexporter/client.go index e8d1748f520c2..73c3fa49b41cb 100644 --- a/exporter/splunkhecexporter/client.go +++ b/exporter/splunkhecexporter/client.go @@ -95,7 +95,7 @@ func (c *client) pushMetricsData( if md.ResourceMetrics().Len() != 0 { accessToken, found := md.ResourceMetrics().At(0).Resource().Attributes().Get(splunk.HecTokenLabel) if found { - localHeaders["Authorization"] = splunk.HECTokenHeader + " " + accessToken.Str() + localHeaders["Authorization"] = splunk.HecTokenHeader + " " + accessToken.Str() } } @@ -116,7 +116,7 @@ func (c *client) pushTraceData( if td.ResourceSpans().Len() != 0 { accessToken, found := td.ResourceSpans().At(0).Resource().Attributes().Get(splunk.HecTokenLabel) if found { - localHeaders["Authorization"] = splunk.HECTokenHeader + " " + accessToken.Str() + localHeaders["Authorization"] = splunk.HecTokenHeader + " " + accessToken.Str() } } @@ -136,7 +136,7 @@ func (c *client) pushLogData(ctx context.Context, ld plog.Logs) error { // All logs in a batch have the same access token after batchperresourceattr, so we can just check the first one. accessToken, found := ld.ResourceLogs().At(0).Resource().Attributes().Get(splunk.HecTokenLabel) if found { - localHeaders["Authorization"] = splunk.HECTokenHeader + " " + accessToken.Str() + localHeaders["Authorization"] = splunk.HecTokenHeader + " " + accessToken.Str() } // All logs in a batch have only one type (regular or profiling logs) after perScopeBatcher, @@ -677,7 +677,7 @@ func buildHTTPHeaders(config *Config, buildInfo component.BuildInfo) map[string] "Connection": "keep-alive", "Content-Type": "application/json", "User-Agent": config.SplunkAppName + "/" + appVersion, - "Authorization": splunk.HECTokenHeader + " " + string(config.Token), + "Authorization": splunk.HecTokenHeader + " " + string(config.Token), "__splunk_app_name": config.SplunkAppName, "__splunk_app_version": config.SplunkAppVersion, } diff --git a/go.mod b/go.mod index 81b07f295e8e1..0cba0d7ced354 100644 --- a/go.mod +++ b/go.mod @@ -497,7 +497,7 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight v0.97.0 // indirect diff --git a/internal/splunk/common.go b/internal/splunk/common.go index a9ad5088ebb22..fe9235e5485f8 100644 --- a/internal/splunk/common.go +++ b/internal/splunk/common.go @@ -22,7 +22,7 @@ const ( DefaultNameLabel = "otel.log.name" DefaultSeverityTextLabel = "otel.log.severity.text" DefaultSeverityNumberLabel = "otel.log.severity.number" - HECTokenHeader = "Splunk" + HecTokenHeader = "Splunk" HTTPSplunkChannelHeader = "X-Splunk-Request-Channel" HecTokenLabel = "com.splunk.hec.access_token" // #nosec diff --git a/receiver/splunkhecreceiver/README.md b/receiver/splunkhecreceiver/README.md index dccfb30c88e29..2a724944ed342 100644 --- a/receiver/splunkhecreceiver/README.md +++ b/receiver/splunkhecreceiver/README.md @@ -51,6 +51,8 @@ The following settings are optional: * `hec_metadata_to_otel_attrs/sourcetype` (default = 'com.splunk.sourcetype'): Specifies the mapping of the sourcetype field to a specific unified model attribute. * `hec_metadata_to_otel_attrs/index` (default = 'com.splunk.index'): Specifies the mapping of the index field to a specific unified model attribute. * `hec_metadata_to_otel_attrs/host` (default = 'host.name'): Specifies the mapping of the host field to a specific unified model attribute. +* `ack_extension` (no default): Specifies the ack extension ID the receiver should use. If left blank, ack is turned off. +* `ack_path` (default = '/services/collector/ack'): The path ack extension will listen on for ack requests, if the extension is enabled. Example: ```yaml @@ -67,6 +69,7 @@ receivers: sourcetype: "mysourcetype" index: "myindex" host: "myhost" + ack_extension: ack/in_memory ``` The full list of settings exposed for this receiver are documented [here](./config.go) diff --git a/receiver/splunkhecreceiver/config.go b/receiver/splunkhecreceiver/config.go index 99ead74205e4c..158eeef45cf06 100644 --- a/receiver/splunkhecreceiver/config.go +++ b/receiver/splunkhecreceiver/config.go @@ -39,6 +39,6 @@ type Config struct { type Ack struct { // Extension defines the extension to use for acking of events. Without specifying an extension, the ACK endpoint won't be exposed Extension *component.ID `mapstructure:"ack_extension"` - // Path for Ack API, default is '/services/collector/ack' + // Path for Ack API, default is '/services/collector/ack'. Ignored if Extension is not provided. Path string `mapstructure:"ack_path"` } diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index 01283286af8bd..32b386c387a64 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -7,7 +7,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/json-iterator/go v1.1.12 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.97.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.97.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.97.0 diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 9e4b65b9cb1e3..8d6f1ad90e3ec 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -254,9 +254,11 @@ func (r *splunkReceiver) Shutdown(context.Context) error { } func (r *splunkReceiver) writeSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, partitionID string) { - ackID := r.ackExt.ProcessEvent(partitionID) - r.ackExt.Ack(partitionID, ackID) - r.writeSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) + if r.ackExt != nil { + ackID := r.ackExt.ProcessEvent(partitionID) + r.ackExt.Ack(partitionID, ackID) + r.writeSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) + } } func (r *splunkReceiver) writeSuccessResponseWithoutAck(ctx context.Context, resp http.ResponseWriter, eventCount int) { @@ -289,24 +291,22 @@ func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) return } - // check that the channel exists - partitionID := req.Header.Get(splunk.HTTPSplunkChannelHeader) - if len(partitionID) == 0 { + var partitionID string + var extracted bool + if partitionID, extracted = r.extractChannelHeader(req); extracted { + if partitionErr := r.validateChannelHeader(partitionID); partitionErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) + return + } + } else { r.failRequest(ctx, resp, http.StatusBadRequest, requiredDataChannelHeader, 0, nil) return } - // check validity of channel - _, err := uuid.Parse(partitionID) - if err != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, invalidDataChannelHeader, 0, err) - return - } - dec := json.NewDecoder(req.Body) var ackRequest splunk.AckRequest - err = dec.Decode(&ackRequest) + err := dec.Decode(&ackRequest) if err != nil || len(ackRequest.Acks) == 0 { r.failRequest(ctx, resp, http.StatusBadRequest, invalidFormatRespBody, 0, err) return @@ -330,11 +330,14 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques r.failRequest(ctx, resp, http.StatusUnsupportedMediaType, invalidEncodingRespBody, 0, errInvalidEncoding) return } + var partitionID string - var partitionErr error - if partitionID, partitionErr = r.validateAndExtractChannelHeader(req); partitionErr != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) - return + var extracted bool + if partitionID, extracted = r.extractChannelHeader(req); extracted { + if partitionErr := r.validateChannelHeader(partitionID); partitionErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) + return + } } if req.ContentLength == 0 { @@ -395,25 +398,26 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques } } -func (r *splunkReceiver) validateAndExtractChannelHeader(req *http.Request) (string, error) { - partitionID, ok := req.Header[splunk.HTTPSplunkChannelHeader] - - // check channel header exists - if !ok { - return "", nil +func (r *splunkReceiver) extractChannelHeader(req *http.Request) (string, bool) { + headers, ok := req.Header[splunk.HTTPSplunkChannelHeader] + if ok { + return headers[0], true } + return "", false +} - if len(partitionID[0]) == 0 { - return "", errors.New(responseErrInvalidDataChannel) +func (r *splunkReceiver) validateChannelHeader(partitionID string) error { + if len(partitionID) == 0 { + return errors.New(responseErrDataChannelMissing) } // check validity of channel - _, err := uuid.Parse(partitionID[0]) + _, err := uuid.Parse(partitionID) if err != nil { - return "", errors.New(responseErrInvalidDataChannel) + return errors.New(responseErrInvalidDataChannel) } - return partitionID[0], nil + return nil } func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) { @@ -437,10 +441,12 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } var partitionID string - var partitionErr error - if partitionID, partitionErr = r.validateAndExtractChannelHeader(req); partitionErr != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) - return + var extracted bool + if partitionID, extracted = r.extractChannelHeader(req); extracted { + if partitionErr := r.validateChannelHeader(partitionID); partitionErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) + return + } } bodyReader := req.Body @@ -539,8 +545,8 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) func (r *splunkReceiver) createResourceCustomizer(req *http.Request) func(resource pcommon.Resource) { if r.config.AccessTokenPassthrough { accessToken := req.Header.Get("Authorization") - if strings.HasPrefix(accessToken, splunk.HECTokenHeader+" ") { - accessTokenValue := accessToken[len(splunk.HECTokenHeader)+1:] + if strings.HasPrefix(accessToken, splunk.HecTokenHeader+" ") { + accessTokenValue := accessToken[len(splunk.HecTokenHeader)+1:] return func(resource pcommon.Resource) { resource.Attributes().PutStr(splunk.HecTokenLabel, accessTokenValue) } diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index 4911c6fa2d417..a01130978fb28 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1388,7 +1388,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode assert.Equal(t, http.StatusBadRequest, status) - assert.Equal(t, map[string]any{"text": "Invalid data channel", "code": float64(11)}, body) + assert.Equal(t, map[string]any{"code": float64(10), "text": "Data channel is missing"}, body) }, }, { @@ -1514,7 +1514,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode assert.Equal(t, http.StatusBadRequest, status) - assert.Equal(t, map[string]any{"text": "Invalid data channel", "code": float64(11)}, body) + assert.Equal(t, map[string]any{"code": float64(10), "text": "Data channel is missing"}, body) }, assertSink: func(t *testing.T, sink *consumertest.LogsSink) { assert.Equal(t, 0, len(sink.AllLogs())) diff --git a/testbed/go.mod b/testbed/go.mod index 9cf236faf7d38..88138f95d4464 100644 --- a/testbed/go.mod +++ b/testbed/go.mod @@ -179,7 +179,7 @@ require ( github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.0.0-00010101000000-000000000000 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.97.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.97.0 // indirect From 504626ae0bb3132739212db953ddc430df1ccdaa Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 10 Apr 2024 11:53:27 -0700 Subject: [PATCH 34/46] rebase --- cmd/configschema/go.mod | 2 +- cmd/otelcontribcol/go.mod | 2 +- cmd/oteltestbedcol/go.mod | 2 +- go.mod | 2 +- testbed/go.mod | 3 ++- testbed/go.sum | 4 ++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index 618d9577a5fa3..9f15e8f2b5f1d 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -697,7 +697,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index c80c3d1aeface..7ccdecc20ecb7 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -716,7 +716,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod index 46bad1fc8406d..7af6a71d907e5 100644 --- a/cmd/oteltestbedcol/go.mod +++ b/cmd/oteltestbedcol/go.mod @@ -277,7 +277,7 @@ require ( google.golang.org/api v0.170.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.mod b/go.mod index 0fb2a32b8ad86..bd02a9facb89a 100644 --- a/go.mod +++ b/go.mod @@ -691,7 +691,7 @@ require ( google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/testbed/go.mod b/testbed/go.mod index db0a18d99a1d4..1d35a6e92f0be 100644 --- a/testbed/go.mod +++ b/testbed/go.mod @@ -144,6 +144,7 @@ require ( github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect @@ -264,7 +265,7 @@ require ( google.golang.org/api v0.168.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/testbed/go.sum b/testbed/go.sum index 849506b1f8f0b..871e730d2eb1a 100644 --- a/testbed/go.sum +++ b/testbed/go.sum @@ -1109,8 +1109,8 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 h1:8eadJkXbwDEMNwcB5O0s5Y5eCfyuCLdvaiOIaGTrWmQ= google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78 h1:Xs9lu+tLXxLIfuci70nG4cpwaRC+mRQPUL7LoIeDJC4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= From f350656a0af55781f0470d52cec09743c19b0eb0 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 10 Apr 2024 17:54:46 -0700 Subject: [PATCH 35/46] test --- cmd/configschema/go.mod | 2 +- receiver/splunkhecreceiver/go.mod | 1 + receiver/splunkhecreceiver/receiver.go | 94 ++++++++++---------------- 3 files changed, 39 insertions(+), 58 deletions(-) diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index e4c51c17c8534..dc8e6d0f59b2d 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -473,7 +473,6 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.98.0 // indirect @@ -490,6 +489,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.98.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.98.0 // indirect diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index 83e35da6df500..52dbfb982d878 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -42,6 +42,7 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/hashicorp/go-version v1.6.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/klauspost/compress v1.17.8 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index be670f9c00c73..991eebeb4814c 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -10,7 +10,6 @@ import ( "errors" "fmt" "io" - "net" "net/http" "strconv" "strings" @@ -198,7 +197,6 @@ func (r *splunkReceiver) Start(ctx context.Context, host component.Host) error { return nil } - var ln net.Listener // set up the listener ln, err := r.config.ServerConfig.ToListenerContext(ctx) if err != nil { @@ -214,28 +212,15 @@ func (r *splunkReceiver) Start(ctx context.Context, host component.Host) error { mx.NewRoute().HandlerFunc(r.handleReq) // set up the ack API handler if the ack extension is present - if storageID := r.config.Ack.Extension; storageID != nil { - if ext, found := host.GetExtensions()[*storageID]; found { + if r.config.Ack.Extension != nil { + if ext, found := host.GetExtensions()[*r.config.Ack.Extension]; found { r.ackExt = ext.(ackextension.AckExtension) mx.NewRoute().Path(r.config.Ack.Path).HandlerFunc(r.handleAck) } else { - return fmt.Errorf("specified ack extension with id '%q' could not be found", *storageID) + return fmt.Errorf("specified ack extension with id %q could not be found", *r.config.Ack.Extension) } } - var ln net.Listener - // set up the listener - ln, err := r.config.ServerConfig.ToListener() - if err != nil { - return fmt.Errorf("failed to bind to address %s: %w", r.config.Endpoint, err) - } - - r.server, err = r.config.ServerConfig.ToServerContext(ctx, host, r.settings.TelemetrySettings, mx) - - if err != nil { - return err - } - // TODO: Evaluate what properties should be configurable, for now // set some hard-coded values. r.server.ReadHeaderTimeout = defaultServerTimeout @@ -261,21 +246,14 @@ func (r *splunkReceiver) Shutdown(context.Context) error { return err } -func (r *splunkReceiver) writeSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, partitionID string) { - if r.ackExt != nil { - ackID := r.ackExt.ProcessEvent(partitionID) - r.ackExt.Ack(partitionID, ackID) - r.writeSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) +func (r *splunkReceiver) writeSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, channelID string) { + if r.ackExt == nil { + return } -} - -func (r *splunkReceiver) writeSuccessResponseWithoutAck(ctx context.Context, resp http.ResponseWriter, eventCount int) { - r.writeSuccessResponse(ctx, resp, eventCount, okRespBody) -} -func (r *splunkReceiver) writeSuccessAckResponse(ctx context.Context, resp http.ResponseWriter, acks map[uint64]bool) { - ackString, _ := json.Marshal(acks) - r.writeSuccessResponse(ctx, resp, 0, []byte(fmt.Sprintf(ackResponse, ackString))) + ackID := r.ackExt.ProcessEvent(channelID) + r.ackExt.Ack(channelID, ackID) + r.writeSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) } func (r *splunkReceiver) writeSuccessResponse(ctx context.Context, resp http.ResponseWriter, eventCount int, bodyContent []byte) { @@ -299,11 +277,11 @@ func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) return } - var partitionID string + var channelID string var extracted bool - if partitionID, extracted = r.extractChannelHeader(req); extracted { - if partitionErr := r.validateChannelHeader(partitionID); partitionErr != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) + if channelID, extracted = r.extractChannelHeader(req); extracted { + if channelErr := r.validateChannelHeader(channelID); channelErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(channelErr.Error()), 0, channelErr) return } } else { @@ -320,8 +298,9 @@ func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) return } - queriedAcks := r.ackExt.QueryAcks(partitionID, ackRequest.Acks) - r.writeSuccessAckResponse(req.Context(), resp, queriedAcks) + queriedAcks := r.ackExt.QueryAcks(channelID, ackRequest.Acks) + ackString, _ := json.Marshal(queriedAcks) + r.writeSuccessResponse(ctx, resp, 0, []byte(fmt.Sprintf(ackResponse, ackString))) } func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Request) { @@ -339,11 +318,11 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques return } - var partitionID string + var channelID string var extracted bool - if partitionID, extracted = r.extractChannelHeader(req); extracted { - if partitionErr := r.validateChannelHeader(partitionID); partitionErr != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) + if channelID, extracted = r.extractChannelHeader(req); extracted { + if channelErr := r.validateChannelHeader(channelID); channelErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(channelErr.Error()), 0, channelErr) return } } @@ -397,10 +376,10 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques if consumerErr != nil { r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, slLen, consumerErr) } else { - if len(partitionID) > 0 && r.ackExt != nil { - r.writeSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), partitionID) + if len(channelID) > 0 && r.ackExt != nil { + r.writeSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), channelID) } else { - r.writeSuccessResponseWithoutAck(ctx, resp, ld.LogRecordCount()) + r.writeSuccessResponse(ctx, resp, ld.LogRecordCount(), okRespBody) } r.obsrecv.EndLogsOp(ctx, metadata.Type.String(), slLen, nil) } @@ -408,19 +387,20 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques func (r *splunkReceiver) extractChannelHeader(req *http.Request) (string, bool) { headers, ok := req.Header[splunk.HTTPSplunkChannelHeader] - if ok { - return headers[0], true + if !ok { + return "", false } - return "", false + return headers[0], true + } -func (r *splunkReceiver) validateChannelHeader(partitionID string) error { - if len(partitionID) == 0 { +func (r *splunkReceiver) validateChannelHeader(channelID string) error { + if len(channelID) == 0 { return errors.New(responseErrDataChannelMissing) } // check validity of channel - _, err := uuid.Parse(partitionID) + _, err := uuid.Parse(channelID) if err != nil { return errors.New(responseErrInvalidDataChannel) } @@ -448,11 +428,11 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) return } - var partitionID string + var channelID string var extracted bool - if partitionID, extracted = r.extractChannelHeader(req); extracted { - if partitionErr := r.validateChannelHeader(partitionID); partitionErr != nil { - r.failRequest(ctx, resp, http.StatusBadRequest, []byte(partitionErr.Error()), 0, partitionErr) + if channelID, extracted = r.extractChannelHeader(req); extracted { + if channelErr := r.validateChannelHeader(channelID); channelErr != nil { + r.failRequest(ctx, resp, http.StatusBadRequest, []byte(channelErr.Error()), 0, channelErr) return } } @@ -543,10 +523,10 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } } - if len(partitionID) > 0 && r.ackExt != nil { - r.writeSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), partitionID) + if len(channelID) > 0 && r.ackExt != nil { + r.writeSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), channelID) } else { - r.writeSuccessResponseWithoutAck(ctx, resp, len(events)+len(metricEvents)) + r.writeSuccessResponse(ctx, resp, len(events)+len(metricEvents), okRespBody) } } From ddb578e41df612d91fb6949b075c60847296975d Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 10 Apr 2024 18:52:42 -0700 Subject: [PATCH 36/46] test --- receiver/splunkhecreceiver/receiver.go | 4 ++++ receiver/splunkhecreceiver/receiver_test.go | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 991eebeb4814c..395f93425e306 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -221,6 +221,10 @@ func (r *splunkReceiver) Start(ctx context.Context, host component.Host) error { } } + r.server, err = r.config.ServerConfig.ToServerContext(ctx, host, r.settings.TelemetrySettings, mx) + if err != nil { + return err + } // TODO: Evaluate what properties should be configurable, for now // set some hard-coded values. r.server.ReadHeaderTimeout = defaultServerTimeout diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index a01130978fb28..c07d6b0ee2058 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1126,6 +1126,13 @@ func Test_splunkhecReceiver_Start(t *testing.T) { getConfig func() *Config errorExpected bool }{ + { + name: "no_ack_extension_configured", + getConfig: func() *Config { + return createDefaultConfig().(*Config) + }, + errorExpected: false, + }, { name: "ack_extension_does_not_exist", getConfig: func() *Config { @@ -1135,13 +1142,6 @@ func Test_splunkhecReceiver_Start(t *testing.T) { }, errorExpected: true, }, - { - name: "no_ack_extension_configured", - getConfig: func() *Config { - return createDefaultConfig().(*Config) - }, - errorExpected: false, - }, } for _, tt := range tests { From 634c0d57c207033eaf89dd13725f6e00d2909140 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 10 Apr 2024 19:03:12 -0700 Subject: [PATCH 37/46] test --- receiver/splunkhecreceiver/receiver.go | 1 - 1 file changed, 1 deletion(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 395f93425e306..fd05ecaa6bc96 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -71,7 +71,6 @@ var ( eventRequiredRespBody = []byte(responseErrEventRequired) eventBlankRespBody = []byte(responseErrEventBlank) requiredDataChannelHeader = []byte(responseErrDataChannelMissing) - invalidDataChannelHeader = []byte(responseErrInvalidDataChannel) invalidEncodingRespBody = []byte(responseInvalidEncoding) invalidFormatRespBody = []byte(responseInvalidDataFormat) invalidMethodRespBodyPostOnly = []byte(responseInvalidMethodPostOnly) From 821f5c3207ac4404c2b79c30a428fa3ada809f9b Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Mon, 15 Apr 2024 13:42:24 -0700 Subject: [PATCH 38/46] address PR comments --- .../integrationtest/go.mod | 2 ++ receiver/splunkhecreceiver/receiver_test.go | 27 +++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/exporter/elasticsearchexporter/integrationtest/go.mod b/exporter/elasticsearchexporter/integrationtest/go.mod index 92ffafb1683c1..e903cac049849 100644 --- a/exporter/elasticsearchexporter/integrationtest/go.mod +++ b/exporter/elasticsearchexporter/integrationtest/go.mod @@ -255,3 +255,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmr replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../../pkg/resourcetotelemetry replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter => ../../prometheusremotewriteexporter + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../../extension/ackextension diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index e4dbaf8eb2e44..6ee61f718b1c2 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -38,15 +38,18 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver/internal/mocks" ) -func assertHecSuccessResponse(t *testing.T, resp *http.Response, body any, ackID ...uint64) { +func assertHecSuccessResponse(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode assert.Equal(t, http.StatusOK, status) assert.Equal(t, httpJSONTypeHeader, resp.Header.Get(httpContentTypeHeader)) - if len(ackID) > 0 { - assert.Equal(t, map[string]any{"code": float64(0), "text": "Success", "ackId": float64(ackID[0])}, body) - } else { - assert.Equal(t, map[string]any{"code": float64(0), "text": "Success"}, body) - } + assert.Equal(t, map[string]any{"code": float64(0), "text": "Success"}, body) +} + +func assertHecSuccessResponseWithAckId(t *testing.T, resp *http.Response, body any, ackID uint64) { + status := resp.StatusCode + assert.Equal(t, http.StatusOK, status) + assert.Equal(t, httpJSONTypeHeader, resp.Header.Get(httpContentTypeHeader)) + assert.Equal(t, map[string]any{"code": float64(0), "text": "Success", "ackId": float64(ackID)}, body) } func Test_splunkhecreceiver_NewLogsReceiver(t *testing.T) { @@ -909,11 +912,9 @@ func buildSplunkHecMsg(time float64, dimensions uint) *splunk.Event { } func buildSplunkHecAckMsg(acks []uint64) *splunk.AckRequest { - ar := &splunk.AckRequest{ + return &splunk.AckRequest{ Acks: acks, } - - return ar } type badReqBody struct{} @@ -1157,9 +1158,7 @@ func Test_splunkhecReceiver_Start(t *testing.T) { assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) } - defer func() { - assert.NoError(t, r.Shutdown(context.Background())) - }() + assert.NoError(t, r.Shutdown(context.Background())) }) } } @@ -1426,7 +1425,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { - assertHecSuccessResponse(t, resp, body, 1) + assertHecSuccessResponseWithAckId(t, resp, body, 1) }, }, } @@ -1558,7 +1557,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { - assertHecSuccessResponse(t, resp, body, 1) + assertHecSuccessResponseWithAckId(t, resp, body, 1) }, assertSink: func(t *testing.T, sink *consumertest.LogsSink) { assert.Equal(t, 1, len(sink.AllLogs())) From d37dd118987c521e15dbb4726a4841948c4b7936 Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Tue, 16 Apr 2024 15:38:36 -0700 Subject: [PATCH 39/46] fix lint --- receiver/splunkhecreceiver/receiver.go | 3 +-- receiver/splunkhecreceiver/receiver_test.go | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index bdfc75354420f..0e891cef2ad10 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -220,10 +220,9 @@ func (r *splunkReceiver) Start(ctx context.Context, host component.Host) error { } } - r.server, err = r.config.ServerConfig.ToServer(ctx, host, r.settings.TelemetrySettings, mx) - if err != nil { + if err != nil { return err } // TODO: Evaluate what properties should be configurable, for now diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index cd2ec53ffd2d4..a119788d84fe1 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -45,7 +45,7 @@ func assertHecSuccessResponse(t *testing.T, resp *http.Response, body any) { assert.Equal(t, map[string]any{"code": float64(0), "text": "Success"}, body) } -func assertHecSuccessResponseWithAckId(t *testing.T, resp *http.Response, body any, ackID uint64) { +func assertHecSuccessResponseWithAckID(t *testing.T, resp *http.Response, body any, ackID uint64) { status := resp.StatusCode assert.Equal(t, http.StatusOK, status) assert.Equal(t, httpJSONTypeHeader, resp.Header.Get(httpContentTypeHeader)) @@ -1425,7 +1425,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { - assertHecSuccessResponseWithAckId(t, resp, body, 1) + assertHecSuccessResponseWithAckID(t, resp, body, 1) }, }, } @@ -1557,7 +1557,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { - assertHecSuccessResponseWithAckId(t, resp, body, 1) + assertHecSuccessResponseWithAckID(t, resp, body, 1) }, assertSink: func(t *testing.T, sink *consumertest.LogsSink) { assert.Equal(t, 1, len(sink.AllLogs())) From 8ea06a4990f80a69fe7fd3934d9e2eb39ac69afb Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 17 Apr 2024 15:15:41 -0700 Subject: [PATCH 40/46] address comments --- cmd/otelcontribcol/go.mod | 3 - .../integrationtest/go.mod | 2 - exporter/splunkhecexporter/client.go | 8 +- internal/splunk/common.go | 4 +- receiver/splunkhecreceiver/README.md | 9 +- receiver/splunkhecreceiver/config.go | 6 +- .../internal/mocks/ack_extension.go | 109 ---- receiver/splunkhecreceiver/receiver.go | 73 +-- receiver/splunkhecreceiver/receiver_test.go | 525 ++++++++++-------- 9 files changed, 331 insertions(+), 408 deletions(-) delete mode 100644 receiver/splunkhecreceiver/internal/mocks/ack_extension.go diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index 7a87dbdbf52b9..19ce22177ae90 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -527,7 +527,6 @@ require ( github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect github.com/oklog/ulid/v2 v2.1.0 // indirect github.com/open-telemetry/opamp-go v0.14.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.98.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.98.0 // indirect @@ -1191,8 +1190,6 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sola replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension => ../../extension/sumologicextension -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension - replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver => ../../receiver/namedpipereceiver replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => ../../internal/sqlquery diff --git a/exporter/elasticsearchexporter/integrationtest/go.mod b/exporter/elasticsearchexporter/integrationtest/go.mod index be051644af3b7..22bf28c1fee84 100644 --- a/exporter/elasticsearchexporter/integrationtest/go.mod +++ b/exporter/elasticsearchexporter/integrationtest/go.mod @@ -255,5 +255,3 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmr replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../../pkg/resourcetotelemetry replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter => ../../prometheusremotewriteexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../../extension/ackextension diff --git a/exporter/splunkhecexporter/client.go b/exporter/splunkhecexporter/client.go index 5cd12e320a135..90ec9289dd61f 100644 --- a/exporter/splunkhecexporter/client.go +++ b/exporter/splunkhecexporter/client.go @@ -95,7 +95,7 @@ func (c *client) pushMetricsData( if md.ResourceMetrics().Len() != 0 { accessToken, found := md.ResourceMetrics().At(0).Resource().Attributes().Get(splunk.HecTokenLabel) if found { - localHeaders["Authorization"] = splunk.HecTokenHeader + " " + accessToken.Str() + localHeaders["Authorization"] = splunk.HECTokenHeader + " " + accessToken.Str() } } @@ -116,7 +116,7 @@ func (c *client) pushTraceData( if td.ResourceSpans().Len() != 0 { accessToken, found := td.ResourceSpans().At(0).Resource().Attributes().Get(splunk.HecTokenLabel) if found { - localHeaders["Authorization"] = splunk.HecTokenHeader + " " + accessToken.Str() + localHeaders["Authorization"] = splunk.HECTokenHeader + " " + accessToken.Str() } } @@ -136,7 +136,7 @@ func (c *client) pushLogData(ctx context.Context, ld plog.Logs) error { // All logs in a batch have the same access token after batchperresourceattr, so we can just check the first one. accessToken, found := ld.ResourceLogs().At(0).Resource().Attributes().Get(splunk.HecTokenLabel) if found { - localHeaders["Authorization"] = splunk.HecTokenHeader + " " + accessToken.Str() + localHeaders["Authorization"] = splunk.HECTokenHeader + " " + accessToken.Str() } // All logs in a batch have only one type (regular or profiling logs) after perScopeBatcher, @@ -677,7 +677,7 @@ func buildHTTPHeaders(config *Config, buildInfo component.BuildInfo) map[string] "Connection": "keep-alive", "Content-Type": "application/json", "User-Agent": config.SplunkAppName + "/" + appVersion, - "Authorization": splunk.HecTokenHeader + " " + string(config.Token), + "Authorization": splunk.HECTokenHeader + " " + string(config.Token), "__splunk_app_name": config.SplunkAppName, "__splunk_app_version": config.SplunkAppVersion, } diff --git a/internal/splunk/common.go b/internal/splunk/common.go index fe9235e5485f8..9a1285e94ecaf 100644 --- a/internal/splunk/common.go +++ b/internal/splunk/common.go @@ -22,7 +22,7 @@ const ( DefaultNameLabel = "otel.log.name" DefaultSeverityTextLabel = "otel.log.severity.text" DefaultSeverityNumberLabel = "otel.log.severity.number" - HecTokenHeader = "Splunk" + HECTokenHeader = "Splunk" HTTPSplunkChannelHeader = "X-Splunk-Request-Channel" HecTokenLabel = "com.splunk.hec.access_token" // #nosec @@ -39,7 +39,7 @@ type AccessTokenPassthroughConfig struct { AccessTokenPassthrough bool `mapstructure:"access_token_passthrough"` } -// Event represents a metric in Splunk HEC format +// Event represents a metric in Splunk HEC receiver/splunkhecreceiver/receiver.goformat type Event struct { Time float64 `json:"time,omitempty"` // optional epoch time - set to zero if the event timestamp is missing or unknown (will be added at indexing time) Host string `json:"host"` // hostname diff --git a/receiver/splunkhecreceiver/README.md b/receiver/splunkhecreceiver/README.md index 2a724944ed342..f1d0cc7ee3963 100644 --- a/receiver/splunkhecreceiver/README.md +++ b/receiver/splunkhecreceiver/README.md @@ -51,8 +51,10 @@ The following settings are optional: * `hec_metadata_to_otel_attrs/sourcetype` (default = 'com.splunk.sourcetype'): Specifies the mapping of the sourcetype field to a specific unified model attribute. * `hec_metadata_to_otel_attrs/index` (default = 'com.splunk.index'): Specifies the mapping of the index field to a specific unified model attribute. * `hec_metadata_to_otel_attrs/host` (default = 'host.name'): Specifies the mapping of the host field to a specific unified model attribute. -* `ack_extension` (no default): Specifies the ack extension ID the receiver should use. If left blank, ack is turned off. -* `ack_path` (default = '/services/collector/ack'): The path ack extension will listen on for ack requests, if the extension is enabled. +* `ack` (no default): defines the ackextension to use for acking of events + * `extension` (no default): Specifies the ack extension ID the receiver should use. If left blank, ack is turned off. + * `path` (default = '/services/collector/ack'): The path ack extension will listen on for ack requests, if the extension is enabled. + Example: ```yaml @@ -69,7 +71,8 @@ receivers: sourcetype: "mysourcetype" index: "myindex" host: "myhost" - ack_extension: ack/in_memory + ack: + extension: ack/in_memory ``` The full list of settings exposed for this receiver are documented [here](./config.go) diff --git a/receiver/splunkhecreceiver/config.go b/receiver/splunkhecreceiver/config.go index 158eeef45cf06..8d6de7259aae5 100644 --- a/receiver/splunkhecreceiver/config.go +++ b/receiver/splunkhecreceiver/config.go @@ -23,7 +23,7 @@ type Config struct { splunk.AccessTokenPassthroughConfig `mapstructure:",squash"` - Ack `mapstructure:",squash"` + Ack `mapstructure:"ack"` // RawPath for raw data collection, default is '/services/collector/raw' RawPath string `mapstructure:"raw_path"` @@ -38,7 +38,7 @@ type Config struct { // Ack defines configuration for the ACK functionality of the HEC receiver type Ack struct { // Extension defines the extension to use for acking of events. Without specifying an extension, the ACK endpoint won't be exposed - Extension *component.ID `mapstructure:"ack_extension"` + Extension *component.ID `mapstructure:"extension"` // Path for Ack API, default is '/services/collector/ack'. Ignored if Extension is not provided. - Path string `mapstructure:"ack_path"` + Path string `mapstructure:"path"` } diff --git a/receiver/splunkhecreceiver/internal/mocks/ack_extension.go b/receiver/splunkhecreceiver/internal/mocks/ack_extension.go deleted file mode 100644 index d707ed33d5152..0000000000000 --- a/receiver/splunkhecreceiver/internal/mocks/ack_extension.go +++ /dev/null @@ -1,109 +0,0 @@ -// Code generated by mockery v2.42.1. DO NOT EDIT. - -package mocks - -import ( - context "context" - - component "go.opentelemetry.io/collector/component" - - mock "github.com/stretchr/testify/mock" -) - -// AckExtension is an autogenerated mock type for the AckExtension type -type AckExtension struct { - mock.Mock -} - -// Ack provides a mock function with given fields: partitionID, ackID -func (_m *AckExtension) Ack(partitionID string, ackID uint64) { - _m.Called(partitionID, ackID) -} - -// ProcessEvent provides a mock function with given fields: partitionID -func (_m *AckExtension) ProcessEvent(partitionID string) uint64 { - ret := _m.Called(partitionID) - - if len(ret) == 0 { - panic("no return value specified for ProcessEvent") - } - - var r0 uint64 - if rf, ok := ret.Get(0).(func(string) uint64); ok { - r0 = rf(partitionID) - } else { - r0 = ret.Get(0).(uint64) - } - - return r0 -} - -// QueryAcks provides a mock function with given fields: partitionID, ackIDs -func (_m *AckExtension) QueryAcks(partitionID string, ackIDs []uint64) map[uint64]bool { - ret := _m.Called(partitionID, ackIDs) - - if len(ret) == 0 { - panic("no return value specified for QueryAcks") - } - - var r0 map[uint64]bool - if rf, ok := ret.Get(0).(func(string, []uint64) map[uint64]bool); ok { - r0 = rf(partitionID, ackIDs) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[uint64]bool) - } - } - - return r0 -} - -// Shutdown provides a mock function with given fields: ctx -func (_m *AckExtension) Shutdown(ctx context.Context) error { - ret := _m.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for Shutdown") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { - r0 = rf(ctx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Start provides a mock function with given fields: ctx, host -func (_m *AckExtension) Start(ctx context.Context, host component.Host) error { - ret := _m.Called(ctx, host) - - if len(ret) == 0 { - panic("no return value specified for Start") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, component.Host) error); ok { - r0 = rf(ctx, host) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// NewAckExtension creates a new instance of AckExtension. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewAckExtension(t interface { - mock.TestingT - Cleanup(func()) -}) *AckExtension { - mock := &AckExtension{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} \ No newline at end of file diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 0e891cef2ad10..1a81b72ba9361 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -196,20 +196,7 @@ func (r *splunkReceiver) Start(ctx context.Context, host component.Host) error { return nil } - // set up the listener - ln, err := r.config.ServerConfig.ToListener(ctx) - if err != nil { - return fmt.Errorf("failed to bind to address %s: %w", r.config.Endpoint, err) - } - mx := mux.NewRouter() - mx.NewRoute().Path(r.config.HealthPath).HandlerFunc(r.handleHealthReq) - mx.NewRoute().Path(r.config.HealthPath + "/1.0").HandlerFunc(r.handleHealthReq).Methods("GET") - if r.logsConsumer != nil { - mx.NewRoute().Path(r.config.RawPath).HandlerFunc(r.handleRawReq) - } - mx.NewRoute().HandlerFunc(r.handleReq) - // set up the ack API handler if the ack extension is present if r.config.Ack.Extension != nil { if ext, found := host.GetExtensions()[*r.config.Ack.Extension]; found { @@ -220,18 +207,30 @@ func (r *splunkReceiver) Start(ctx context.Context, host component.Host) error { } } - r.server, err = r.config.ServerConfig.ToServer(ctx, host, r.settings.TelemetrySettings, mx) + mx.NewRoute().Path(r.config.HealthPath).HandlerFunc(r.handleHealthReq) + mx.NewRoute().Path(r.config.HealthPath + "/1.0").HandlerFunc(r.handleHealthReq).Methods("GET") + if r.logsConsumer != nil { + mx.NewRoute().Path(r.config.RawPath).HandlerFunc(r.handleRawReq) + } + mx.NewRoute().HandlerFunc(r.handleReq) + // set up the listener + ln, err := r.config.ServerConfig.ToListener(ctx) + if err != nil { + return fmt.Errorf("failed to bind to address %s: %w", r.config.Endpoint, err) + } + + r.server, err = r.config.ServerConfig.ToServer(ctx, host, r.settings.TelemetrySettings, mx) if err != nil { return err } + // TODO: Evaluate what properties should be configurable, for now // set some hard-coded values. r.server.ReadHeaderTimeout = defaultServerTimeout r.server.WriteTimeout = defaultServerTimeout r.shutdownWG.Add(1) - go func() { defer r.shutdownWG.Done() if errHTTP := r.server.Serve(ln); !errors.Is(errHTTP, http.ErrServerClosed) && errHTTP != nil { @@ -250,17 +249,17 @@ func (r *splunkReceiver) Shutdown(context.Context) error { return err } -func (r *splunkReceiver) writeSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, channelID string) { +func (r *splunkReceiver) processSuccessResponseWithAck(ctx context.Context, resp http.ResponseWriter, eventCount int, channelID string) { if r.ackExt == nil { - return + panic("writing response with ack when ack extension is not configured") } ackID := r.ackExt.ProcessEvent(channelID) r.ackExt.Ack(channelID, ackID) - r.writeSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) + r.processSuccessResponse(ctx, resp, eventCount, []byte(fmt.Sprintf(responseOKWithAckID, ackID))) } -func (r *splunkReceiver) writeSuccessResponse(ctx context.Context, resp http.ResponseWriter, eventCount int, bodyContent []byte) { +func (r *splunkReceiver) processSuccessResponse(ctx context.Context, resp http.ResponseWriter, eventCount int, bodyContent []byte) { resp.Header().Set(httpContentTypeHeader, httpJSONTypeHeader) resp.WriteHeader(http.StatusOK) if _, err := resp.Write(bodyContent); err != nil { @@ -297,14 +296,19 @@ func (r *splunkReceiver) handleAck(resp http.ResponseWriter, req *http.Request) var ackRequest splunk.AckRequest err := dec.Decode(&ackRequest) - if err != nil || len(ackRequest.Acks) == 0 { + if err != nil { r.failRequest(ctx, resp, http.StatusBadRequest, invalidFormatRespBody, 0, err) return } + if len(ackRequest.Acks) == 0 { + r.failRequest(ctx, resp, http.StatusBadRequest, invalidFormatRespBody, 0, errors.New("request body must include at least one ackID to be queried")) + return + } + queriedAcks := r.ackExt.QueryAcks(channelID, ackRequest.Acks) ackString, _ := json.Marshal(queriedAcks) - r.writeSuccessResponse(ctx, resp, 0, []byte(fmt.Sprintf(ackResponse, ackString))) + r.processSuccessResponse(ctx, resp, 0, []byte(fmt.Sprintf(ackResponse, ackString))) } func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Request) { @@ -372,7 +376,6 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, slLen, err) return } - consumerErr := r.logsConsumer.ConsumeLogs(ctx, ld) _ = bodyReader.Close() @@ -381,21 +384,20 @@ func (r *splunkReceiver) handleRawReq(resp http.ResponseWriter, req *http.Reques r.failRequest(ctx, resp, http.StatusInternalServerError, errInternalServerError, slLen, consumerErr) } else { if len(channelID) > 0 && r.ackExt != nil { - r.writeSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), channelID) + r.processSuccessResponseWithAck(ctx, resp, ld.LogRecordCount(), channelID) } else { - r.writeSuccessResponse(ctx, resp, ld.LogRecordCount(), okRespBody) + r.processSuccessResponse(ctx, resp, ld.LogRecordCount(), okRespBody) } r.obsrecv.EndLogsOp(ctx, metadata.Type.String(), slLen, nil) } } func (r *splunkReceiver) extractChannelHeader(req *http.Request) (string, bool) { - headers, ok := req.Header[splunk.HTTPSplunkChannelHeader] - if !ok { - return "", false + if headers, ok := req.Header[splunk.HTTPSplunkChannelHeader]; ok { + return headers[0], true } - return headers[0], true + return "", false } func (r *splunkReceiver) validateChannelHeader(channelID string) error { @@ -432,9 +434,8 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) return } - var channelID string - var extracted bool - if channelID, extracted = r.extractChannelHeader(req); extracted { + channelID, extracted := r.extractChannelHeader(req) + if extracted { if channelErr := r.validateChannelHeader(channelID); channelErr != nil { r.failRequest(ctx, resp, http.StatusBadRequest, []byte(channelErr.Error()), 0, channelErr) return @@ -503,7 +504,6 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } resourceCustomizer := r.createResourceCustomizer(req) - if r.logsConsumer != nil && len(events) > 0 { ld, err := splunkHecToLogData(r.settings.Logger, events, resourceCustomizer, r.config) if err != nil { @@ -519,6 +519,7 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } if r.metricsConsumer != nil && len(metricEvents) > 0 { md, _ := splunkHecToMetricsData(r.settings.Logger, metricEvents, resourceCustomizer, r.config) + decodeErr := r.metricsConsumer.ConsumeMetrics(ctx, md) r.obsrecv.EndMetricsOp(ctx, metadata.Type.String(), len(metricEvents), decodeErr) if decodeErr != nil { @@ -528,17 +529,17 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request) } if len(channelID) > 0 && r.ackExt != nil { - r.writeSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), channelID) + r.processSuccessResponseWithAck(ctx, resp, len(events)+len(metricEvents), channelID) } else { - r.writeSuccessResponse(ctx, resp, len(events)+len(metricEvents), okRespBody) + r.processSuccessResponse(ctx, resp, len(events)+len(metricEvents), okRespBody) } } func (r *splunkReceiver) createResourceCustomizer(req *http.Request) func(resource pcommon.Resource) { if r.config.AccessTokenPassthrough { accessToken := req.Header.Get("Authorization") - if strings.HasPrefix(accessToken, splunk.HecTokenHeader+" ") { - accessTokenValue := accessToken[len(splunk.HecTokenHeader)+1:] + if strings.HasPrefix(accessToken, splunk.HECTokenHeader+" ") { + accessTokenValue := accessToken[len(splunk.HECTokenHeader)+1:] return func(resource pcommon.Resource) { resource.Attributes().PutStr(splunk.HecTokenLabel, accessTokenValue) } diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index a119788d84fe1..4d8865dac5ebe 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -35,7 +35,6 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver/internal/mocks" ) func assertHecSuccessResponse(t *testing.T, resp *http.Response, body any) { @@ -1120,7 +1119,6 @@ func Test_splunkhecReceiver_handleRawReq(t *testing.T) { }) } } - func Test_splunkhecReceiver_Start(t *testing.T) { tests := []struct { name string @@ -1157,12 +1155,10 @@ func Test_splunkhecReceiver_Start(t *testing.T) { } else { assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) } - assert.NoError(t, r.Shutdown(context.Background())) }) } } - func Test_splunkhecReceiver_handleAck(t *testing.T) { t.Parallel() config := createDefaultConfig().(*Config) @@ -1181,7 +1177,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { name: "incorrect_method", req: httptest.NewRequest("PUT", "http://localhost/ack", nil), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1197,7 +1193,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1214,7 +1210,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1231,7 +1227,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1250,7 +1246,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1267,7 +1263,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1286,12 +1282,15 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} - mockAckExtension.On("QueryAcks", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", []uint64{1, 2, 3}).Once().Return(map[uint64]bool{ - 1: true, - 2: false, - 3: true, - }) + mockAckExtension := mockAckExtension{ + queryAcks: func(partitionID string, ackIDs []uint64) map[uint64]bool { + return map[uint64]bool{ + 1: true, + 2: false, + 3: true, + } + }, + } return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1364,7 +1363,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1381,7 +1380,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1400,7 +1399,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1419,9 +1418,13 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} - mockAckExtension.On("ProcessEvent", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90").Once().Return(uint64(1)) - mockAckExtension.On("Ack", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", uint64(1)).Once() + mockAckExtension := mockAckExtension{ + processEvent: func(_ string) (ackID uint64) { + return uint64(1) + }, + ack: func(_ string, _ uint64) {}, + } + return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1487,7 +1490,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1507,7 +1510,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1529,7 +1532,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} + mockAckExtension := mockAckExtension{} return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1551,9 +1554,13 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mocks.AckExtension{} - mockAckExtension.On("ProcessEvent", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90").Once().Return(uint64(1)) - mockAckExtension.On("Ack", "fbd3036f-0f1c-4e98-b71c-d4cd61213f90", uint64(1)).Once() + mockAckExtension := mockAckExtension{ + processEvent: func(_ string) (ackID uint64) { + return uint64(1) + }, + ack: func(_ string, _ uint64) { + }, + } return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { @@ -1695,234 +1702,260 @@ func Test_splunkhecreceiver_handle_nested_fields(t *testing.T) { } } -func Test_splunkhecReceiver_rawReqHasmetadataInResource(t *testing.T) { - t.Parallel() - config := createDefaultConfig().(*Config) - config.Endpoint = "localhost:0" // Actually not creating the endpoint - config.RawPath = "/foo" - config.HecToOtelAttrs = splunk.HecToOtelAttrs{ - Source: "com.source.foo", - SourceType: "com.sourcetype.foo", - Index: "com.index.foo", - Host: "com.host.foo", - } - - currentTime := float64(time.Now().UnixNano()) / 1e6 - splunkMsg := buildSplunkHecMsg(currentTime, 3) - - assertResponse := func(t *testing.T, status int, body string) { - assert.Equal(t, http.StatusOK, status) - assert.Equal(t, responseOK, body) - } - - tests := []struct { - name string - req *http.Request - assertResource func(t *testing.T, got []plog.Logs) - }{ - { - name: "all_metadata", - req: func() *http.Request { - msgBytes, err := json.Marshal(splunkMsg) - require.NoError(t, err) - req := httptest.NewRequest("POST", - "http://localhost/foo?index=bar&source=bar&sourcetype=bar&host=bar", - bytes.NewReader(msgBytes)) - return req - }(), - assertResource: func(t *testing.T, got []plog.Logs) { - require.Equal(t, 1, len(got)) - resources := got[0].ResourceLogs() - assert.Equal(t, 1, resources.Len()) - resource := resources.At(0).Resource().Attributes() - assert.Equal(t, 4, resource.Len()) - for _, k := range []string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.SourceType, config.HecToOtelAttrs.Source, config.HecToOtelAttrs.Host} { - v, ok := resource.Get(k) - if !ok { - assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) - } - assert.Equal(t, "bar", v.AsString()) - } - }, - }, - { - name: "some_metadata", - req: func() *http.Request { - msgBytes, err := json.Marshal(splunkMsg) - require.NoError(t, err) - req := httptest.NewRequest("POST", - "http://localhost/foo?index=bar&source=bar", - bytes.NewReader(msgBytes)) - return req - }(), - assertResource: func(t *testing.T, got []plog.Logs) { - require.Equal(t, 1, len(got)) - resources := got[0].ResourceLogs() - assert.Equal(t, 1, resources.Len()) - resource := resources.At(0).Resource().Attributes() - assert.Equal(t, 2, resource.Len()) - for _, k := range [2]string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.Source} { - v, ok := resource.Get(k) - if !ok { - assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) - } - assert.Equal(t, "bar", v.AsString()) - } - }, - }, - { - name: "no_matching_metadata", - req: func() *http.Request { - msgBytes, err := json.Marshal(splunkMsg) - require.NoError(t, err) - req := httptest.NewRequest("POST", - "http://localhost/foo?foo=bar", - bytes.NewReader(msgBytes)) - return req - }(), - assertResource: func(t *testing.T, got []plog.Logs) { - require.Equal(t, 1, len(got)) - resources := got[0].ResourceLogs() - assert.Equal(t, 1, resources.Len()) - resource := resources.At(0).Resource().Attributes() - assert.Equal(t, 0, resource.Len()) - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - sink := new(consumertest.LogsSink) - rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) - assert.NoError(t, err) - - r := rcv.(*splunkReceiver) - assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) - defer func() { - assert.NoError(t, r.Shutdown(context.Background())) - }() - w := httptest.NewRecorder() - r.handleRawReq(w, tt.req) - - resp := w.Result() - assert.NoError(t, err) - defer resp.Body.Close() +//func Test_splunkhecReceiver_rawReqHasmetadataInResource(t *testing.T) { +// t.Parallel() +// config := createDefaultConfig().(*Config) +// config.Endpoint = "localhost:0" // Actually not creating the endpoint +// config.RawPath = "/foo" +// config.HecToOtelAttrs = splunk.HecToOtelAttrs{ +// Source: "com.source.foo", +// SourceType: "com.sourcetype.foo", +// Index: "com.index.foo", +// Host: "com.host.foo", +// } +// +// currentTime := float64(time.Now().UnixNano()) / 1e6 +// splunkMsg := buildSplunkHecMsg(currentTime, 3) +// +// assertResponse := func(t *testing.T, status int, body string) { +// assert.Equal(t, http.StatusOK, status) +// assert.Equal(t, responseOK, body) +// } +// +// tests := []struct { +// name string +// req *http.Request +// assertResource func(t *testing.T, got []plog.Logs) +// }{ +// { +// name: "all_metadata", +// req: func() *http.Request { +// msgBytes, err := json.Marshal(splunkMsg) +// require.NoError(t, err) +// req := httptest.NewRequest("POST", +// "http://localhost/foo?index=bar&source=bar&sourcetype=bar&host=bar", +// bytes.NewReader(msgBytes)) +// return req +// }(), +// assertResource: func(t *testing.T, got []plog.Logs) { +// require.Equal(t, 1, len(got)) +// resources := got[0].ResourceLogs() +// assert.Equal(t, 1, resources.Len()) +// resource := resources.At(0).Resource().Attributes() +// assert.Equal(t, 4, resource.Len()) +// for _, k := range []string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.SourceType, config.HecToOtelAttrs.Source, config.HecToOtelAttrs.Host} { +// v, ok := resource.Get(k) +// if !ok { +// assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) +// } +// assert.Equal(t, "bar", v.AsString()) +// } +// }, +// }, +// { +// name: "some_metadata", +// req: func() *http.Request { +// msgBytes, err := json.Marshal(splunkMsg) +// require.NoError(t, err) +// req := httptest.NewRequest("POST", +// "http://localhost/foo?index=bar&source=bar", +// bytes.NewReader(msgBytes)) +// return req +// }(), +// assertResource: func(t *testing.T, got []plog.Logs) { +// require.Equal(t, 1, len(got)) +// resources := got[0].ResourceLogs() +// assert.Equal(t, 1, resources.Len()) +// resource := resources.At(0).Resource().Attributes() +// assert.Equal(t, 2, resource.Len()) +// for _, k := range [2]string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.Source} { +// v, ok := resource.Get(k) +// if !ok { +// assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) +// } +// assert.Equal(t, "bar", v.AsString()) +// } +// }, +// }, +// { +// name: "no_matching_metadata", +// req: func() *http.Request { +// msgBytes, err := json.Marshal(splunkMsg) +// require.NoError(t, err) +// req := httptest.NewRequest("POST", +// "http://localhost/foo?foo=bar", +// bytes.NewReader(msgBytes)) +// return req +// }(), +// assertResource: func(t *testing.T, got []plog.Logs) { +// require.Equal(t, 1, len(got)) +// resources := got[0].ResourceLogs() +// assert.Equal(t, 1, resources.Len()) +// resource := resources.At(0).Resource().Attributes() +// assert.Equal(t, 0, resource.Len()) +// }, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// sink := new(consumertest.LogsSink) +// rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) +// assert.NoError(t, err) +// +// r := rcv.(*splunkReceiver) +// assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) +// defer func() { +// assert.NoError(t, r.Shutdown(context.Background())) +// }() +// w := httptest.NewRecorder() +// r.handleRawReq(w, tt.req) +// +// resp := w.Result() +// assert.NoError(t, err) +// defer resp.Body.Close() +// +// assertResponse(t, resp.StatusCode, responseOK) +// tt.assertResource(t, sink.AllLogs()) +// }) +// } +//} +// +//func BenchmarkHandleReq(b *testing.B) { +// config := createDefaultConfig().(*Config) +// config.Endpoint = "localhost:0" +// sink := new(consumertest.LogsSink) +// rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) +// assert.NoError(b, err) +// +// r := rcv.(*splunkReceiver) +// w := httptest.NewRecorder() +// currentTime := float64(time.Now().UnixNano()) / 1e6 +// splunkMsg := buildSplunkHecMsg(currentTime, 2) +// msgBytes, err := json.Marshal(splunkMsg) +// require.NoError(b, err) +// totalMessage := make([]byte, 100*len(msgBytes)) +// for i := 0; i < 100; i++ { +// offset := len(msgBytes) * i +// for bi, b := range msgBytes { +// totalMessage[offset+bi] = b +// } +// } +// +// for n := 0; n < b.N; n++ { +// req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(totalMessage)) +// r.handleReq(w, req) +// +// resp := w.Result() +// _, err = io.ReadAll(resp.Body) +// defer resp.Body.Close() +// assert.NoError(b, err) +// } +//} +// +//func Test_splunkhecReceiver_healthCheck_success(t *testing.T) { +// t.Parallel() +// config := createDefaultConfig().(*Config) +// config.Endpoint = "localhost:0" // Actually not creating the endpoint +// +// tests := []struct { +// name string +// req *http.Request +// assertResponse func(t *testing.T, status int, body string) +// }{ +// { +// name: "correct_healthcheck", +// req: func() *http.Request { +// req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health", nil) +// return req +// }(), +// assertResponse: func(t *testing.T, status int, body string) { +// assert.Equal(t, http.StatusOK, status) +// assert.Equal(t, responseHecHealthy, body) +// }, +// }, +// { +// name: "correct_healthcheck_v1", +// req: func() *http.Request { +// req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health/1.0", nil) +// return req +// }(), +// assertResponse: func(t *testing.T, status int, body string) { +// assert.Equal(t, http.StatusOK, status) +// assert.Equal(t, responseHecHealthy, body) +// }, +// }, +// { +// name: "incorrect_healthcheck_methods_v1", +// req: func() *http.Request { +// req := httptest.NewRequest("POST", "http://localhost:0/services/collector/health/1.0", nil) +// return req +// }(), +// assertResponse: func(t *testing.T, status int, body string) { +// assert.Equal(t, http.StatusBadRequest, status) +// assert.Equal(t, responseNoData, body) +// }, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// sink := new(consumertest.LogsSink) +// rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) +// assert.NoError(t, err) +// +// r := rcv.(*splunkReceiver) +// assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) +// defer func() { +// assert.NoError(t, r.Shutdown(context.Background())) +// }() +// +// w := httptest.NewRecorder() +// r.server.Handler.ServeHTTP(w, tt.req) +// resp := w.Result() +// defer resp.Body.Close() +// respBytes, err := io.ReadAll(resp.Body) +// assert.NoError(t, err) +// var bodyStr string +// if err := json.Unmarshal(respBytes, &bodyStr); err != nil { +// bodyStr = string(respBytes) +// } +// +// tt.assertResponse(t, resp.StatusCode, bodyStr) +// }) +// } +//} - assertResponse(t, resp.StatusCode, responseOK) - tt.assertResource(t, sink.AllLogs()) - }) - } +type mockHost struct { + component.Host + extensions map[component.ID]component.Component } -func BenchmarkHandleReq(b *testing.B) { - config := createDefaultConfig().(*Config) - config.Endpoint = "localhost:0" - sink := new(consumertest.LogsSink) - rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) - assert.NoError(b, err) - - r := rcv.(*splunkReceiver) - w := httptest.NewRecorder() - currentTime := float64(time.Now().UnixNano()) / 1e6 - splunkMsg := buildSplunkHecMsg(currentTime, 2) - msgBytes, err := json.Marshal(splunkMsg) - require.NoError(b, err) - totalMessage := make([]byte, 100*len(msgBytes)) - for i := 0; i < 100; i++ { - offset := len(msgBytes) * i - for bi, b := range msgBytes { - totalMessage[offset+bi] = b - } - } - - for n := 0; n < b.N; n++ { - req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(totalMessage)) - r.handleReq(w, req) - - resp := w.Result() - _, err = io.ReadAll(resp.Body) - defer resp.Body.Close() - assert.NoError(b, err) - } +func (h mockHost) GetExtensions() map[component.ID]component.Component { + return h.extensions } -func Test_splunkhecReceiver_healthCheck_success(t *testing.T) { - t.Parallel() - config := createDefaultConfig().(*Config) - config.Endpoint = "localhost:0" // Actually not creating the endpoint - - tests := []struct { - name string - req *http.Request - assertResponse func(t *testing.T, status int, body string) - }{ - { - name: "correct_healthcheck", - req: func() *http.Request { - req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health", nil) - return req - }(), - assertResponse: func(t *testing.T, status int, body string) { - assert.Equal(t, http.StatusOK, status) - assert.Equal(t, responseHecHealthy, body) - }, - }, - { - name: "correct_healthcheck_v1", - req: func() *http.Request { - req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health/1.0", nil) - return req - }(), - assertResponse: func(t *testing.T, status int, body string) { - assert.Equal(t, http.StatusOK, status) - assert.Equal(t, responseHecHealthy, body) - }, - }, - { - name: "incorrect_healthcheck_methods_v1", - req: func() *http.Request { - req := httptest.NewRequest("POST", "http://localhost:0/services/collector/health/1.0", nil) - return req - }(), - assertResponse: func(t *testing.T, status int, body string) { - assert.Equal(t, http.StatusBadRequest, status) - assert.Equal(t, responseNoData, body) - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - sink := new(consumertest.LogsSink) - rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) - assert.NoError(t, err) +type mockAckExtension struct { + queryAcks func(partitionID string, ackIDs []uint64) map[uint64]bool + ack func(partitionID string, ackID uint64) + processEvent func(partitionID string) (ackID uint64) +} - r := rcv.(*splunkReceiver) - assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) - defer func() { - assert.NoError(t, r.Shutdown(context.Background())) - }() +func (ae *mockAckExtension) Start(ctx context.Context, host component.Host) error { + return nil +} - w := httptest.NewRecorder() - r.server.Handler.ServeHTTP(w, tt.req) - resp := w.Result() - defer resp.Body.Close() - respBytes, err := io.ReadAll(resp.Body) - assert.NoError(t, err) - var bodyStr string - if err := json.Unmarshal(respBytes, &bodyStr); err != nil { - bodyStr = string(respBytes) - } +func (ae *mockAckExtension) Shutdown(ctx context.Context) error { + return nil +} - tt.assertResponse(t, resp.StatusCode, bodyStr) - }) - } +func (ae *mockAckExtension) QueryAcks(partitionID string, ackIDs []uint64) map[uint64]bool { + return ae.queryAcks(partitionID, ackIDs) } -type mockHost struct { - component.Host - extensions map[component.ID]component.Component +func (ae *mockAckExtension) Ack(partitionID string, ackID uint64) { + ae.ack(partitionID, ackID) } -func (h mockHost) GetExtensions() map[component.ID]component.Component { - return h.extensions +func (ae *mockAckExtension) ProcessEvent(partitionID string) (ackID uint64) { + return ae.processEvent(partitionID) } From dac6cb38c9d9a964e91eb0091a7ad3dfaecfbedd Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 17 Apr 2024 15:41:54 -0700 Subject: [PATCH 41/46] address PR comments pt2 --- cmd/otelcontribcol/builder-config.yaml | 1 - .../integrationtest/go.mod | 2 + receiver/splunkhecreceiver/go.mod | 1 - receiver/splunkhecreceiver/go.sum | 2 - receiver/splunkhecreceiver/receiver_test.go | 496 +++++++++--------- 5 files changed, 242 insertions(+), 260 deletions(-) diff --git a/cmd/otelcontribcol/builder-config.yaml b/cmd/otelcontribcol/builder-config.yaml index f3e7d2c8783dc..4e0e2e0315f5e 100644 --- a/cmd/otelcontribcol/builder-config.yaml +++ b/cmd/otelcontribcol/builder-config.yaml @@ -447,7 +447,6 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension => ../../extension/opampextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension => ../../extension/solarwindsapmsettingsextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension => ../../extension/sumologicextension - - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver => ../../receiver/namedpipereceiver - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => ../../internal/sqlquery - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/exporter/elasticsearchexporter/integrationtest/go.mod b/exporter/elasticsearchexporter/integrationtest/go.mod index 22bf28c1fee84..be051644af3b7 100644 --- a/exporter/elasticsearchexporter/integrationtest/go.mod +++ b/exporter/elasticsearchexporter/integrationtest/go.mod @@ -255,3 +255,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmr replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../../pkg/resourcetotelemetry replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter => ../../prometheusremotewriteexporter + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../../extension/ackextension diff --git a/receiver/splunkhecreceiver/go.mod b/receiver/splunkhecreceiver/go.mod index 4d0d9b99151f0..7eff3e1d78e1c 100644 --- a/receiver/splunkhecreceiver/go.mod +++ b/receiver/splunkhecreceiver/go.mod @@ -59,7 +59,6 @@ require ( github.com/prometheus/common v0.52.3 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/rs/cors v1.10.1 // indirect - github.com/stretchr/objx v0.5.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector v0.98.1-0.20240416174005-d0f15e2463f8 // indirect go.opentelemetry.io/collector/config/configauth v0.98.1-0.20240416174005-d0f15e2463f8 // indirect diff --git a/receiver/splunkhecreceiver/go.sum b/receiver/splunkhecreceiver/go.sum index 323d587aeb35f..ba95de1a9bd9c 100644 --- a/receiver/splunkhecreceiver/go.sum +++ b/receiver/splunkhecreceiver/go.sum @@ -157,8 +157,6 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -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.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= diff --git a/receiver/splunkhecreceiver/receiver_test.go b/receiver/splunkhecreceiver/receiver_test.go index 4d8865dac5ebe..77146db2c79c8 100644 --- a/receiver/splunkhecreceiver/receiver_test.go +++ b/receiver/splunkhecreceiver/receiver_test.go @@ -1177,8 +1177,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { name: "incorrect_method", req: httptest.NewRequest("PUT", "http://localhost/ack", nil), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1193,8 +1192,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1210,8 +1208,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1227,8 +1224,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1246,8 +1242,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1263,8 +1258,7 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1282,8 +1276,8 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{ - queryAcks: func(partitionID string, ackIDs []uint64) map[uint64]bool { + return &mockAckExtension{ + queryAcks: func(_ string, _ []uint64) map[uint64]bool { return map[uint64]bool{ 1: true, 2: false, @@ -1291,7 +1285,6 @@ func Test_splunkhecReceiver_handleAck(t *testing.T) { } }, } - return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1363,8 +1356,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { assertHecSuccessResponse(t, resp, body) @@ -1380,8 +1372,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1399,8 +1390,7 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1418,14 +1408,12 @@ func Test_splunkhecReceiver_handleRawReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{ + return &mockAckExtension{ processEvent: func(_ string) (ackID uint64) { return uint64(1) }, ack: func(_ string, _ uint64) {}, } - - return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { assertHecSuccessResponseWithAckID(t, resp, body, 1) @@ -1490,8 +1478,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { assertHecSuccessResponse(t, resp, body) @@ -1510,8 +1497,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1532,8 +1518,7 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{} - return &mockAckExtension + return &mockAckExtension{} }, assertResponse: func(t *testing.T, resp *http.Response, body any) { status := resp.StatusCode @@ -1554,14 +1539,13 @@ func Test_splunkhecReceiver_handleReq_WithAck(t *testing.T) { return req }(), setupMockAckExtension: func() component.Component { - mockAckExtension := mockAckExtension{ + return &mockAckExtension{ processEvent: func(_ string) (ackID uint64) { return uint64(1) }, ack: func(_ string, _ uint64) { }, } - return &mockAckExtension }, assertResponse: func(t *testing.T, resp *http.Response, body any) { assertHecSuccessResponseWithAckID(t, resp, body, 1) @@ -1702,228 +1686,228 @@ func Test_splunkhecreceiver_handle_nested_fields(t *testing.T) { } } -//func Test_splunkhecReceiver_rawReqHasmetadataInResource(t *testing.T) { -// t.Parallel() -// config := createDefaultConfig().(*Config) -// config.Endpoint = "localhost:0" // Actually not creating the endpoint -// config.RawPath = "/foo" -// config.HecToOtelAttrs = splunk.HecToOtelAttrs{ -// Source: "com.source.foo", -// SourceType: "com.sourcetype.foo", -// Index: "com.index.foo", -// Host: "com.host.foo", -// } -// -// currentTime := float64(time.Now().UnixNano()) / 1e6 -// splunkMsg := buildSplunkHecMsg(currentTime, 3) -// -// assertResponse := func(t *testing.T, status int, body string) { -// assert.Equal(t, http.StatusOK, status) -// assert.Equal(t, responseOK, body) -// } -// -// tests := []struct { -// name string -// req *http.Request -// assertResource func(t *testing.T, got []plog.Logs) -// }{ -// { -// name: "all_metadata", -// req: func() *http.Request { -// msgBytes, err := json.Marshal(splunkMsg) -// require.NoError(t, err) -// req := httptest.NewRequest("POST", -// "http://localhost/foo?index=bar&source=bar&sourcetype=bar&host=bar", -// bytes.NewReader(msgBytes)) -// return req -// }(), -// assertResource: func(t *testing.T, got []plog.Logs) { -// require.Equal(t, 1, len(got)) -// resources := got[0].ResourceLogs() -// assert.Equal(t, 1, resources.Len()) -// resource := resources.At(0).Resource().Attributes() -// assert.Equal(t, 4, resource.Len()) -// for _, k := range []string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.SourceType, config.HecToOtelAttrs.Source, config.HecToOtelAttrs.Host} { -// v, ok := resource.Get(k) -// if !ok { -// assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) -// } -// assert.Equal(t, "bar", v.AsString()) -// } -// }, -// }, -// { -// name: "some_metadata", -// req: func() *http.Request { -// msgBytes, err := json.Marshal(splunkMsg) -// require.NoError(t, err) -// req := httptest.NewRequest("POST", -// "http://localhost/foo?index=bar&source=bar", -// bytes.NewReader(msgBytes)) -// return req -// }(), -// assertResource: func(t *testing.T, got []plog.Logs) { -// require.Equal(t, 1, len(got)) -// resources := got[0].ResourceLogs() -// assert.Equal(t, 1, resources.Len()) -// resource := resources.At(0).Resource().Attributes() -// assert.Equal(t, 2, resource.Len()) -// for _, k := range [2]string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.Source} { -// v, ok := resource.Get(k) -// if !ok { -// assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) -// } -// assert.Equal(t, "bar", v.AsString()) -// } -// }, -// }, -// { -// name: "no_matching_metadata", -// req: func() *http.Request { -// msgBytes, err := json.Marshal(splunkMsg) -// require.NoError(t, err) -// req := httptest.NewRequest("POST", -// "http://localhost/foo?foo=bar", -// bytes.NewReader(msgBytes)) -// return req -// }(), -// assertResource: func(t *testing.T, got []plog.Logs) { -// require.Equal(t, 1, len(got)) -// resources := got[0].ResourceLogs() -// assert.Equal(t, 1, resources.Len()) -// resource := resources.At(0).Resource().Attributes() -// assert.Equal(t, 0, resource.Len()) -// }, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// sink := new(consumertest.LogsSink) -// rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) -// assert.NoError(t, err) -// -// r := rcv.(*splunkReceiver) -// assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) -// defer func() { -// assert.NoError(t, r.Shutdown(context.Background())) -// }() -// w := httptest.NewRecorder() -// r.handleRawReq(w, tt.req) -// -// resp := w.Result() -// assert.NoError(t, err) -// defer resp.Body.Close() -// -// assertResponse(t, resp.StatusCode, responseOK) -// tt.assertResource(t, sink.AllLogs()) -// }) -// } -//} -// -//func BenchmarkHandleReq(b *testing.B) { -// config := createDefaultConfig().(*Config) -// config.Endpoint = "localhost:0" -// sink := new(consumertest.LogsSink) -// rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) -// assert.NoError(b, err) -// -// r := rcv.(*splunkReceiver) -// w := httptest.NewRecorder() -// currentTime := float64(time.Now().UnixNano()) / 1e6 -// splunkMsg := buildSplunkHecMsg(currentTime, 2) -// msgBytes, err := json.Marshal(splunkMsg) -// require.NoError(b, err) -// totalMessage := make([]byte, 100*len(msgBytes)) -// for i := 0; i < 100; i++ { -// offset := len(msgBytes) * i -// for bi, b := range msgBytes { -// totalMessage[offset+bi] = b -// } -// } -// -// for n := 0; n < b.N; n++ { -// req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(totalMessage)) -// r.handleReq(w, req) -// -// resp := w.Result() -// _, err = io.ReadAll(resp.Body) -// defer resp.Body.Close() -// assert.NoError(b, err) -// } -//} -// -//func Test_splunkhecReceiver_healthCheck_success(t *testing.T) { -// t.Parallel() -// config := createDefaultConfig().(*Config) -// config.Endpoint = "localhost:0" // Actually not creating the endpoint -// -// tests := []struct { -// name string -// req *http.Request -// assertResponse func(t *testing.T, status int, body string) -// }{ -// { -// name: "correct_healthcheck", -// req: func() *http.Request { -// req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health", nil) -// return req -// }(), -// assertResponse: func(t *testing.T, status int, body string) { -// assert.Equal(t, http.StatusOK, status) -// assert.Equal(t, responseHecHealthy, body) -// }, -// }, -// { -// name: "correct_healthcheck_v1", -// req: func() *http.Request { -// req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health/1.0", nil) -// return req -// }(), -// assertResponse: func(t *testing.T, status int, body string) { -// assert.Equal(t, http.StatusOK, status) -// assert.Equal(t, responseHecHealthy, body) -// }, -// }, -// { -// name: "incorrect_healthcheck_methods_v1", -// req: func() *http.Request { -// req := httptest.NewRequest("POST", "http://localhost:0/services/collector/health/1.0", nil) -// return req -// }(), -// assertResponse: func(t *testing.T, status int, body string) { -// assert.Equal(t, http.StatusBadRequest, status) -// assert.Equal(t, responseNoData, body) -// }, -// }, -// } -// -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// sink := new(consumertest.LogsSink) -// rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) -// assert.NoError(t, err) -// -// r := rcv.(*splunkReceiver) -// assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) -// defer func() { -// assert.NoError(t, r.Shutdown(context.Background())) -// }() -// -// w := httptest.NewRecorder() -// r.server.Handler.ServeHTTP(w, tt.req) -// resp := w.Result() -// defer resp.Body.Close() -// respBytes, err := io.ReadAll(resp.Body) -// assert.NoError(t, err) -// var bodyStr string -// if err := json.Unmarshal(respBytes, &bodyStr); err != nil { -// bodyStr = string(respBytes) -// } -// -// tt.assertResponse(t, resp.StatusCode, bodyStr) -// }) -// } -//} +func Test_splunkhecReceiver_rawReqHasmetadataInResource(t *testing.T) { + t.Parallel() + config := createDefaultConfig().(*Config) + config.Endpoint = "localhost:0" // Actually not creating the endpoint + config.RawPath = "/foo" + config.HecToOtelAttrs = splunk.HecToOtelAttrs{ + Source: "com.source.foo", + SourceType: "com.sourcetype.foo", + Index: "com.index.foo", + Host: "com.host.foo", + } + + currentTime := float64(time.Now().UnixNano()) / 1e6 + splunkMsg := buildSplunkHecMsg(currentTime, 3) + + assertResponse := func(t *testing.T, status int, body string) { + assert.Equal(t, http.StatusOK, status) + assert.Equal(t, responseOK, body) + } + + tests := []struct { + name string + req *http.Request + assertResource func(t *testing.T, got []plog.Logs) + }{ + { + name: "all_metadata", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", + "http://localhost/foo?index=bar&source=bar&sourcetype=bar&host=bar", + bytes.NewReader(msgBytes)) + return req + }(), + assertResource: func(t *testing.T, got []plog.Logs) { + require.Equal(t, 1, len(got)) + resources := got[0].ResourceLogs() + assert.Equal(t, 1, resources.Len()) + resource := resources.At(0).Resource().Attributes() + assert.Equal(t, 4, resource.Len()) + for _, k := range []string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.SourceType, config.HecToOtelAttrs.Source, config.HecToOtelAttrs.Host} { + v, ok := resource.Get(k) + if !ok { + assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) + } + assert.Equal(t, "bar", v.AsString()) + } + }, + }, + { + name: "some_metadata", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", + "http://localhost/foo?index=bar&source=bar", + bytes.NewReader(msgBytes)) + return req + }(), + assertResource: func(t *testing.T, got []plog.Logs) { + require.Equal(t, 1, len(got)) + resources := got[0].ResourceLogs() + assert.Equal(t, 1, resources.Len()) + resource := resources.At(0).Resource().Attributes() + assert.Equal(t, 2, resource.Len()) + for _, k := range [2]string{config.HecToOtelAttrs.Index, config.HecToOtelAttrs.Source} { + v, ok := resource.Get(k) + if !ok { + assert.Fail(t, fmt.Sprintf("does not contain query param: %s", k)) + } + assert.Equal(t, "bar", v.AsString()) + } + }, + }, + { + name: "no_matching_metadata", + req: func() *http.Request { + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(t, err) + req := httptest.NewRequest("POST", + "http://localhost/foo?foo=bar", + bytes.NewReader(msgBytes)) + return req + }(), + assertResource: func(t *testing.T, got []plog.Logs) { + require.Equal(t, 1, len(got)) + resources := got[0].ResourceLogs() + assert.Equal(t, 1, resources.Len()) + resource := resources.At(0).Resource().Attributes() + assert.Equal(t, 0, resource.Len()) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sink := new(consumertest.LogsSink) + rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) + assert.NoError(t, err) + + r := rcv.(*splunkReceiver) + assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, r.Shutdown(context.Background())) + }() + w := httptest.NewRecorder() + r.handleRawReq(w, tt.req) + + resp := w.Result() + assert.NoError(t, err) + defer resp.Body.Close() + + assertResponse(t, resp.StatusCode, responseOK) + tt.assertResource(t, sink.AllLogs()) + }) + } +} + +func BenchmarkHandleReq(b *testing.B) { + config := createDefaultConfig().(*Config) + config.Endpoint = "localhost:0" + sink := new(consumertest.LogsSink) + rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) + assert.NoError(b, err) + + r := rcv.(*splunkReceiver) + w := httptest.NewRecorder() + currentTime := float64(time.Now().UnixNano()) / 1e6 + splunkMsg := buildSplunkHecMsg(currentTime, 2) + msgBytes, err := json.Marshal(splunkMsg) + require.NoError(b, err) + totalMessage := make([]byte, 100*len(msgBytes)) + for i := 0; i < 100; i++ { + offset := len(msgBytes) * i + for bi, b := range msgBytes { + totalMessage[offset+bi] = b + } + } + + for n := 0; n < b.N; n++ { + req := httptest.NewRequest("POST", "http://localhost/foo", bytes.NewReader(totalMessage)) + r.handleReq(w, req) + + resp := w.Result() + _, err = io.ReadAll(resp.Body) + defer resp.Body.Close() + assert.NoError(b, err) + } +} + +func Test_splunkhecReceiver_healthCheck_success(t *testing.T) { + t.Parallel() + config := createDefaultConfig().(*Config) + config.Endpoint = "localhost:0" // Actually not creating the endpoint + + tests := []struct { + name string + req *http.Request + assertResponse func(t *testing.T, status int, body string) + }{ + { + name: "correct_healthcheck", + req: func() *http.Request { + req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health", nil) + return req + }(), + assertResponse: func(t *testing.T, status int, body string) { + assert.Equal(t, http.StatusOK, status) + assert.Equal(t, responseHecHealthy, body) + }, + }, + { + name: "correct_healthcheck_v1", + req: func() *http.Request { + req := httptest.NewRequest("GET", "http://localhost:0/services/collector/health/1.0", nil) + return req + }(), + assertResponse: func(t *testing.T, status int, body string) { + assert.Equal(t, http.StatusOK, status) + assert.Equal(t, responseHecHealthy, body) + }, + }, + { + name: "incorrect_healthcheck_methods_v1", + req: func() *http.Request { + req := httptest.NewRequest("POST", "http://localhost:0/services/collector/health/1.0", nil) + return req + }(), + assertResponse: func(t *testing.T, status int, body string) { + assert.Equal(t, http.StatusBadRequest, status) + assert.Equal(t, responseNoData, body) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sink := new(consumertest.LogsSink) + rcv, err := newLogsReceiver(receivertest.NewNopCreateSettings(), *config, sink) + assert.NoError(t, err) + + r := rcv.(*splunkReceiver) + assert.NoError(t, r.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, r.Shutdown(context.Background())) + }() + + w := httptest.NewRecorder() + r.server.Handler.ServeHTTP(w, tt.req) + resp := w.Result() + defer resp.Body.Close() + respBytes, err := io.ReadAll(resp.Body) + assert.NoError(t, err) + var bodyStr string + if err := json.Unmarshal(respBytes, &bodyStr); err != nil { + bodyStr = string(respBytes) + } + + tt.assertResponse(t, resp.StatusCode, bodyStr) + }) + } +} type mockHost struct { component.Host @@ -1940,11 +1924,11 @@ type mockAckExtension struct { processEvent func(partitionID string) (ackID uint64) } -func (ae *mockAckExtension) Start(ctx context.Context, host component.Host) error { +func (ae *mockAckExtension) Start(_ context.Context, _ component.Host) error { return nil } -func (ae *mockAckExtension) Shutdown(ctx context.Context) error { +func (ae *mockAckExtension) Shutdown(_ context.Context) error { return nil } From ca2cae5bd0bc68a38d51f116db85c7d94289ed62 Mon Sep 17 00:00:00 2001 From: Antoine Toulme Date: Wed, 17 Apr 2024 16:45:37 -0700 Subject: [PATCH 42/46] Update receiver/splunkhecreceiver/receiver.go --- receiver/splunkhecreceiver/receiver.go | 1 - 1 file changed, 1 deletion(-) diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 1a81b72ba9361..43c269eeb5481 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -213,7 +213,6 @@ func (r *splunkReceiver) Start(ctx context.Context, host component.Host) error { mx.NewRoute().Path(r.config.RawPath).HandlerFunc(r.handleRawReq) } mx.NewRoute().HandlerFunc(r.handleReq) - // set up the listener ln, err := r.config.ServerConfig.ToListener(ctx) if err != nil { From 1d387da74db34234fe379b8a7dabd49b32848bad Mon Sep 17 00:00:00 2001 From: Peng Zhu Date: Wed, 17 Apr 2024 16:56:43 -0700 Subject: [PATCH 43/46] address PR comments --- internal/splunk/common.go | 2 +- receiver/splunkhecreceiver/receiver.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/splunk/common.go b/internal/splunk/common.go index 9a1285e94ecaf..a9ad5088ebb22 100644 --- a/internal/splunk/common.go +++ b/internal/splunk/common.go @@ -39,7 +39,7 @@ type AccessTokenPassthroughConfig struct { AccessTokenPassthrough bool `mapstructure:"access_token_passthrough"` } -// Event represents a metric in Splunk HEC receiver/splunkhecreceiver/receiver.goformat +// Event represents a metric in Splunk HEC format type Event struct { Time float64 `json:"time,omitempty"` // optional epoch time - set to zero if the event timestamp is missing or unknown (will be added at indexing time) Host string `json:"host"` // hostname diff --git a/receiver/splunkhecreceiver/receiver.go b/receiver/splunkhecreceiver/receiver.go index 43c269eeb5481..9a1d7d8248274 100644 --- a/receiver/splunkhecreceiver/receiver.go +++ b/receiver/splunkhecreceiver/receiver.go @@ -404,7 +404,8 @@ func (r *splunkReceiver) validateChannelHeader(channelID string) error { return errors.New(responseErrDataChannelMissing) } - // check validity of channel + // channel id must be a valid uuid + // https://docs.splunk.com/Documentation/Splunk/9.2.1/Data/AboutHECIDXAck#:~:text=close%20the%20file.-,About%20channels%20and%20sending%20data,-Sending%20events%20to _, err := uuid.Parse(channelID) if err != nil { return errors.New(responseErrInvalidDataChannel) From 4f77fe022b7fa6e28efb59d984c3d286c13cacf3 Mon Sep 17 00:00:00 2001 From: zpzhuSplunk <127359723+zpzhuSplunk@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:55:29 -0700 Subject: [PATCH 44/46] Update receiver/splunkhecreceiver/README.md Co-authored-by: Curtis Robert --- receiver/splunkhecreceiver/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receiver/splunkhecreceiver/README.md b/receiver/splunkhecreceiver/README.md index f1d0cc7ee3963..27631f7ec7633 100644 --- a/receiver/splunkhecreceiver/README.md +++ b/receiver/splunkhecreceiver/README.md @@ -51,7 +51,7 @@ The following settings are optional: * `hec_metadata_to_otel_attrs/sourcetype` (default = 'com.splunk.sourcetype'): Specifies the mapping of the sourcetype field to a specific unified model attribute. * `hec_metadata_to_otel_attrs/index` (default = 'com.splunk.index'): Specifies the mapping of the index field to a specific unified model attribute. * `hec_metadata_to_otel_attrs/host` (default = 'host.name'): Specifies the mapping of the host field to a specific unified model attribute. -* `ack` (no default): defines the ackextension to use for acking of events +* `ack` (no default): defines the ackextension to use for acknowledging events * `extension` (no default): Specifies the ack extension ID the receiver should use. If left blank, ack is turned off. * `path` (default = '/services/collector/ack'): The path ack extension will listen on for ack requests, if the extension is enabled. From 1597db086bef824c0a4b94eee9c52025bf6a93ab Mon Sep 17 00:00:00 2001 From: zpzhuSplunk <127359723+zpzhuSplunk@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:55:37 -0700 Subject: [PATCH 45/46] Update receiver/splunkhecreceiver/README.md Co-authored-by: Curtis Robert --- receiver/splunkhecreceiver/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receiver/splunkhecreceiver/README.md b/receiver/splunkhecreceiver/README.md index 27631f7ec7633..1b9d423ae0809 100644 --- a/receiver/splunkhecreceiver/README.md +++ b/receiver/splunkhecreceiver/README.md @@ -52,7 +52,7 @@ The following settings are optional: * `hec_metadata_to_otel_attrs/index` (default = 'com.splunk.index'): Specifies the mapping of the index field to a specific unified model attribute. * `hec_metadata_to_otel_attrs/host` (default = 'host.name'): Specifies the mapping of the host field to a specific unified model attribute. * `ack` (no default): defines the ackextension to use for acknowledging events - * `extension` (no default): Specifies the ack extension ID the receiver should use. If left blank, ack is turned off. + * `extension` (no default): Specifies the ack extension ID the receiver should use. If left blank, ack is disabled. * `path` (default = '/services/collector/ack'): The path ack extension will listen on for ack requests, if the extension is enabled. Example: From 5560287d084e84c8e4af5b5a16381689e8fa63d6 Mon Sep 17 00:00:00 2001 From: zpzhuSplunk <127359723+zpzhuSplunk@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:55:44 -0700 Subject: [PATCH 46/46] Update receiver/splunkhecreceiver/README.md Co-authored-by: Curtis Robert --- receiver/splunkhecreceiver/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receiver/splunkhecreceiver/README.md b/receiver/splunkhecreceiver/README.md index 1b9d423ae0809..d04a318547a72 100644 --- a/receiver/splunkhecreceiver/README.md +++ b/receiver/splunkhecreceiver/README.md @@ -53,7 +53,7 @@ The following settings are optional: * `hec_metadata_to_otel_attrs/host` (default = 'host.name'): Specifies the mapping of the host field to a specific unified model attribute. * `ack` (no default): defines the ackextension to use for acknowledging events * `extension` (no default): Specifies the ack extension ID the receiver should use. If left blank, ack is disabled. - * `path` (default = '/services/collector/ack'): The path ack extension will listen on for ack requests, if the extension is enabled. + * `path` (default = '/services/collector/ack'): The path the ack extension will listen on for ack requests, if the extension is enabled. Example: