Skip to content

Commit 98c82ef

Browse files
committed
[receiver/splunkhec] HEC metrics accepts empty string Event
1 parent 9ccb5d9 commit 98c82ef

File tree

3 files changed

+31
-18
lines changed

3 files changed

+31
-18
lines changed

internal/splunk/common.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ type Event struct {
6666

6767
// IsMetric returns true if the Splunk event is a metric.
6868
func (e *Event) IsMetric() bool {
69-
return e.Event == HecEventMetricType || (e.Event == nil && len(e.GetMetricValues()) > 0)
69+
return e.Event == HecEventMetricType || ((e.Event == nil || e.Event == "") && len(e.GetMetricValues()) > 0)
7070
}
7171

7272
// checks if the field name matches the requirements for a metric datapoint field,

receiver/splunkhecreceiver/receiver.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -427,36 +427,38 @@ func (r *splunkReceiver) handleReq(resp http.ResponseWriter, req *http.Request)
427427
return
428428
}
429429

430-
if msg.Event == nil {
431-
r.failRequest(resp, http.StatusBadRequest, eventRequiredRespBody, nil)
432-
return
433-
}
434-
435-
if msg.Event == "" {
436-
r.failRequest(resp, http.StatusBadRequest, eventBlankRespBody, nil)
437-
return
438-
}
439-
440430
for _, v := range msg.Fields {
441431
if !isFlatJSONField(v) {
442432
r.failRequest(resp, http.StatusBadRequest, []byte(fmt.Sprintf(responseErrHandlingIndexedFields, len(events)+len(metricEvents))), nil)
443433
return
444434
}
445435
}
436+
446437
if msg.IsMetric() {
447438
if r.metricsConsumer == nil {
448439
r.failRequest(resp, http.StatusBadRequest, errUnsupportedMetricEvent, err)
449440
return
450441
}
451442
metricEvents = append(metricEvents, &msg)
452443
} else {
444+
if msg.Event == nil {
445+
r.failRequest(resp, http.StatusBadRequest, eventRequiredRespBody, nil)
446+
return
447+
}
448+
449+
if msg.Event == "" {
450+
r.failRequest(resp, http.StatusBadRequest, eventBlankRespBody, nil)
451+
return
452+
}
453+
453454
if r.logsConsumer == nil {
454455
r.failRequest(resp, http.StatusBadRequest, errUnsupportedLogEvent, err)
455456
return
456457
}
457458
events = append(events, &msg)
458459
}
459460
}
461+
460462
resourceCustomizer := r.createResourceCustomizer(req)
461463
if r.logsConsumer != nil && len(events) > 0 {
462464
ld, err := splunkHecToLogData(r.settings.Logger, events, resourceCustomizer, r.config)

receiver/splunkhecreceiver/receiver_test.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ func Test_splunkhecReceiver_handleReq(t *testing.T) {
251251
{
252252
name: "metric_msg_accepted",
253253
req: func() *http.Request {
254-
msgBytes, err := json.Marshal(buildSplunkHecMetricsMsg(3, 4, 3))
254+
msgBytes, err := json.Marshal(buildSplunkHecMetricsMsg("metric", 3, 4, 3))
255255
require.NoError(t, err)
256256
req := httptest.NewRequest(http.MethodPost, "http://localhost/foo", bytes.NewReader(msgBytes))
257257
return req
@@ -368,7 +368,7 @@ func Test_consumer_err(t *testing.T) {
368368

369369
func Test_consumer_err_metrics(t *testing.T) {
370370
currentTime := float64(time.Now().UnixNano()) / 1e6
371-
splunkMsg := buildSplunkHecMetricsMsg(currentTime, 13, 2)
371+
splunkMsg := buildSplunkHecMetricsMsg("metric", currentTime, 13, 2)
372372
assert.True(t, splunkMsg.IsMetric())
373373
config := createDefaultConfig().(*Config)
374374
config.Endpoint = "localhost:0" // Actually not creating the endpoint\
@@ -570,7 +570,7 @@ func Test_splunkhecReceiver_AccessTokenPassthrough(t *testing.T) {
570570
currentTime := float64(time.Now().UnixNano()) / 1e6
571571
var splunkhecMsg *splunk.Event
572572
if tt.metric {
573-
splunkhecMsg = buildSplunkHecMetricsMsg(currentTime, 1.0, 3)
573+
splunkhecMsg = buildSplunkHecMetricsMsg("metric", currentTime, 1.0, 3)
574574
} else {
575575
splunkhecMsg = buildSplunkHecMsg(currentTime, 3)
576576
}
@@ -738,18 +738,29 @@ func Test_Metrics_splunkhecReceiver_IndexSourceTypePassthrough(t *testing.T) {
738738
name string
739739
index string
740740
sourcetype string
741+
event string
741742
}{
742743
{
743-
name: "No index, no source type",
744+
name: "No index, no source type",
745+
event: "metric",
744746
},
745747
{
746748
name: "Index, no source type",
747749
index: "myindex",
750+
event: "metric",
748751
},
749752
{
750753
name: "Index and source type",
751754
index: "myindex",
752755
sourcetype: "source:type",
756+
event: "metric",
757+
},
758+
{
759+
name: "empty event",
760+
event: "",
761+
},
762+
{
763+
name: "nil event",
753764
},
754765
}
755766

@@ -786,7 +797,7 @@ func Test_Metrics_splunkhecReceiver_IndexSourceTypePassthrough(t *testing.T) {
786797
rcv.metricsConsumer = exporter
787798

788799
currentTime := float64(time.Now().UnixNano()) / 1e6
789-
splunkhecMsg := buildSplunkHecMetricsMsg(currentTime, 42, 3)
800+
splunkhecMsg := buildSplunkHecMetricsMsg(tt.event, currentTime, 42, 3)
790801
splunkhecMsg.Index = tt.index
791802
splunkhecMsg.SourceType = tt.sourcetype
792803
msgBytes, _ := json.Marshal(splunkhecMsg)
@@ -834,10 +845,10 @@ func Test_Metrics_splunkhecReceiver_IndexSourceTypePassthrough(t *testing.T) {
834845
}
835846
}
836847

837-
func buildSplunkHecMetricsMsg(time float64, value int64, dimensions uint) *splunk.Event {
848+
func buildSplunkHecMetricsMsg(event any, time float64, value int64, dimensions uint) *splunk.Event {
838849
ev := &splunk.Event{
839850
Time: time,
840-
Event: "metric",
851+
Event: event,
841852
Fields: map[string]any{
842853
"metric_name:foo": value,
843854
},

0 commit comments

Comments
 (0)