Skip to content

Commit

Permalink
allow '-' rune in datastream namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
rubvs committed Sep 25, 2024
1 parent f40b9b1 commit 4ce11ed
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 42 deletions.
4 changes: 2 additions & 2 deletions input/otlp/logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,12 +195,12 @@ func (c *Consumer) convertLogRecord(
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Dataset = sanitizeDataStreamField(v.Str())
event.DataStream.Dataset = sanitizeDataStreamDataset(v.Str())
case attributeDataStreamNamespace:
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Namespace = sanitizeDataStreamField(v.Str())
event.DataStream.Namespace = sanitizeDataStreamNamespace(v.Str())
default:
setLabel(replaceDots(k), event, v)
}
Expand Down
11 changes: 6 additions & 5 deletions input/otlp/logs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,8 @@ func processLogEvents(t *testing.T, logs plog.Logs) modelpb.Batch {

func TestConsumerConsumeLogsDataStream(t *testing.T) {
randomString := strings.Repeat("abcdefghijklmnopqrstuvwxyz0123456789", 10)
maxLen := otlp.MaxDataStreamBytes - len(otlp.DisallowedDataStreamRunes)
maxLenNamespace := otlp.MaxDataStreamBytes - len(otlp.DisallowedNamespaceRunes)
maxLenDataset := otlp.MaxDataStreamBytes - len(otlp.DisallowedDatasetRunes)

for _, tc := range []struct {
resourceDataStreamDataset string
Expand Down Expand Up @@ -575,10 +576,10 @@ func TestConsumerConsumeLogsDataStream(t *testing.T) {
// 1. Replace all disallowed runes with _
// 2. Datastream length should not exceed otlp.MaxDataStreamBytes
{
resourceDataStreamDataset: otlp.DisallowedDataStreamRunes + randomString,
resourceDataStreamNamespace: otlp.DisallowedDataStreamRunes + randomString,
expectedDataStreamDataset: strings.Repeat("_", len(otlp.DisallowedDataStreamRunes)) + randomString[:maxLen],
expectedDataStreamNamespace: strings.Repeat("_", len(otlp.DisallowedDataStreamRunes)) + randomString[:maxLen],
resourceDataStreamDataset: otlp.DisallowedDatasetRunes + randomString,
resourceDataStreamNamespace: otlp.DisallowedNamespaceRunes + randomString,
expectedDataStreamDataset: strings.Repeat("_", len(otlp.DisallowedDatasetRunes)) + randomString[:maxLenDataset],
expectedDataStreamNamespace: strings.Repeat("_", len(otlp.DisallowedNamespaceRunes)) + randomString[:maxLenNamespace],
},
} {
tcName := fmt.Sprintf("%s,%s", tc.expectedDataStreamDataset, tc.expectedDataStreamNamespace)
Expand Down
40 changes: 27 additions & 13 deletions input/otlp/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ import (
)

const (
AgentNameJaeger = "Jaeger"
MaxDataStreamBytes = 100
DisallowedDataStreamRunes = "-\\/*?\"<>| ,#:"
AgentNameJaeger = "Jaeger"
MaxDataStreamBytes = 100
DisallowedNamespaceRunes = "\\/*?\"<>| ,#:"
DisallowedDatasetRunes = "-\\/*?\"<>| ,#:"
)

var (
Expand Down Expand Up @@ -319,12 +320,12 @@ func translateResourceMetadata(resource pcommon.Resource, out *modelpb.APMEvent)
if out.DataStream == nil {
out.DataStream = &modelpb.DataStream{}
}
out.DataStream.Dataset = sanitizeDataStreamField(v.Str())
out.DataStream.Dataset = sanitizeDataStreamDataset(v.Str())
case attributeDataStreamNamespace:
if out.DataStream == nil {
out.DataStream = &modelpb.DataStream{}
}
out.DataStream.Namespace = sanitizeDataStreamField(v.Str())
out.DataStream.Namespace = sanitizeDataStreamNamespace(v.Str())
default:
if out.Labels == nil {
out.Labels = make(modelpb.Labels)
Expand Down Expand Up @@ -462,12 +463,12 @@ func translateScopeMetadata(scope pcommon.InstrumentationScope, out *modelpb.APM
if out.DataStream == nil {
out.DataStream = &modelpb.DataStream{}
}
out.DataStream.Dataset = sanitizeDataStreamField(v.Str())
out.DataStream.Dataset = sanitizeDataStreamDataset(v.Str())
case attributeDataStreamNamespace:
if out.DataStream == nil {
out.DataStream = &modelpb.DataStream{}
}
out.DataStream.Namespace = sanitizeDataStreamField(v.Str())
out.DataStream.Namespace = sanitizeDataStreamNamespace(v.Str())
}
return true
})
Expand Down Expand Up @@ -551,17 +552,30 @@ func setLabel(key string, event *modelpb.APMEvent, v pcommon.Value) {

// Sanitize the datastream fields (dataset, namespace) to apply restrictions
// as outlined in https://www.elastic.co/guide/en/ecs/current/ecs-data_stream.html
func sanitizeDataStreamField(field string) string {
field = strings.Map(replaceReservedRune, field)
func sanitizeDataStreamDataset(field string) string {
field = strings.Map(replaceReservedRune(DisallowedDatasetRunes), field)
if len(field) > MaxDataStreamBytes {
return field[:MaxDataStreamBytes]
}

return field
}

// Sanitize the datastream fields (dataset, namespace) to apply restrictions
// as outlined in https://www.elastic.co/guide/en/ecs/current/ecs-data_stream.html
func sanitizeDataStreamNamespace(field string) string {
field = strings.Map(replaceReservedRune(DisallowedNamespaceRunes), field)
if len(field) > MaxDataStreamBytes {
return field[:MaxDataStreamBytes]
}
return field
}

func replaceReservedRune(r rune) rune {
if strings.ContainsRune(DisallowedDataStreamRunes, r) {
return '_'
func replaceReservedRune(disallowedRunes string) func(r rune) rune {
return func(r rune) rune {
if strings.ContainsRune(disallowedRunes, r) {
return '_'
}
return unicode.ToLower(r)
}
return unicode.ToLower(r)
}
4 changes: 2 additions & 2 deletions input/otlp/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,12 +180,12 @@ func (c *Consumer) handleScopeMetrics(
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Dataset = sanitizeDataStreamField(v.Str())
event.DataStream.Dataset = sanitizeDataStreamDataset(v.Str())
case attributeDataStreamNamespace:
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Namespace = sanitizeDataStreamField(v.Str())
event.DataStream.Namespace = sanitizeDataStreamNamespace(v.Str())

// The below fields are required by the Processes tab of the
// curated Kibana's hostmetrics UI. These fields are
Expand Down
11 changes: 6 additions & 5 deletions input/otlp/metrics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,8 @@ func TestConsumeMetricsExportTimestamp(t *testing.T) {

func TestConsumeMetricsDataStream(t *testing.T) {
randomString := strings.Repeat("abcdefghijklmnopqrstuvwxyz0123456789", 10)
maxLen := otlp.MaxDataStreamBytes - len(otlp.DisallowedDataStreamRunes)
maxLenNamespace := otlp.MaxDataStreamBytes - len(otlp.DisallowedNamespaceRunes)
maxLenDataset := otlp.MaxDataStreamBytes - len(otlp.DisallowedDatasetRunes)

for _, tc := range []struct {
resourceDataStreamDataset string
Expand Down Expand Up @@ -771,10 +772,10 @@ func TestConsumeMetricsDataStream(t *testing.T) {
// 1. Replace all disallowed runes with _
// 2. Datastream length should not exceed otlp.MaxDataStreamBytes
{
resourceDataStreamDataset: otlp.DisallowedDataStreamRunes + randomString,
resourceDataStreamNamespace: otlp.DisallowedDataStreamRunes + randomString,
expectedDataStreamDataset: strings.Repeat("_", len(otlp.DisallowedDataStreamRunes)) + randomString[:maxLen],
expectedDataStreamNamespace: strings.Repeat("_", len(otlp.DisallowedDataStreamRunes)) + randomString[:maxLen],
resourceDataStreamDataset: otlp.DisallowedDatasetRunes + randomString,
resourceDataStreamNamespace: otlp.DisallowedNamespaceRunes + randomString,
expectedDataStreamDataset: strings.Repeat("_", len(otlp.DisallowedDatasetRunes)) + randomString[:maxLenDataset],
expectedDataStreamNamespace: strings.Repeat("_", len(otlp.DisallowedNamespaceRunes)) + randomString[:maxLenNamespace],
},
} {
tcName := fmt.Sprintf("%s,%s", tc.expectedDataStreamDataset, tc.expectedDataStreamNamespace)
Expand Down
20 changes: 10 additions & 10 deletions input/otlp/traces.go
Original file line number Diff line number Diff line change
Expand Up @@ -481,12 +481,12 @@ func TranslateTransaction(
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Dataset = sanitizeDataStreamField(stringval)
event.DataStream.Dataset = sanitizeDataStreamDataset(stringval)
case attributeDataStreamNamespace:
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Namespace = sanitizeDataStreamField(stringval)
event.DataStream.Namespace = sanitizeDataStreamNamespace(stringval)
default:
modelpb.Labels(event.Labels).Set(k, stringval)
}
Expand Down Expand Up @@ -824,12 +824,12 @@ func TranslateSpan(spanKind ptrace.SpanKind, attributes pcommon.Map, event *mode
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Dataset = sanitizeDataStreamField(stringval)
event.DataStream.Dataset = sanitizeDataStreamDataset(stringval)
case attributeDataStreamNamespace:
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Namespace = sanitizeDataStreamField(stringval)
event.DataStream.Namespace = sanitizeDataStreamNamespace(stringval)
default:
setLabel(k, event, v)
}
Expand Down Expand Up @@ -1103,12 +1103,12 @@ func (c *Consumer) convertSpanEvent(
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Dataset = sanitizeDataStreamField(v.Str())
event.DataStream.Dataset = sanitizeDataStreamDataset(v.Str())
case attributeDataStreamNamespace:
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Namespace = sanitizeDataStreamField(v.Str())
event.DataStream.Namespace = sanitizeDataStreamNamespace(v.Str())

default:
setLabel(replaceDots(k), event, v)
Expand Down Expand Up @@ -1144,12 +1144,12 @@ func (c *Consumer) convertSpanEvent(
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Dataset = sanitizeDataStreamField(v.Str())
event.DataStream.Dataset = sanitizeDataStreamDataset(v.Str())
case attributeDataStreamNamespace:
if event.DataStream == nil {
event.DataStream = &modelpb.DataStream{}
}
event.DataStream.Namespace = sanitizeDataStreamField(v.Str())
event.DataStream.Namespace = sanitizeDataStreamNamespace(v.Str())
default:
k = replaceDots(k)
if isJaeger && k == "message" {
Expand Down Expand Up @@ -1202,12 +1202,12 @@ func (c *Consumer) convertJaegerErrorSpanEvent(event ptrace.SpanEvent, apmEvent
if apmEvent.DataStream == nil {
apmEvent.DataStream = &modelpb.DataStream{}
}
apmEvent.DataStream.Dataset = sanitizeDataStreamField(v.Str())
apmEvent.DataStream.Dataset = sanitizeDataStreamDataset(v.Str())
case attributeDataStreamNamespace:
if apmEvent.DataStream == nil {
apmEvent.DataStream = &modelpb.DataStream{}
}
apmEvent.DataStream.Namespace = sanitizeDataStreamField(v.Str())
apmEvent.DataStream.Namespace = sanitizeDataStreamNamespace(v.Str())

default:
setLabel(replaceDots(k), apmEvent, v)
Expand Down
11 changes: 6 additions & 5 deletions input/otlp/traces_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -874,7 +874,8 @@ func TestSpanNetworkAttributes(t *testing.T) {

func TestSpanDataStream(t *testing.T) {
randomString := strings.Repeat("abcdefghijklmnopqrstuvwxyz0123456789", 10)
maxLen := otlp.MaxDataStreamBytes - len(otlp.DisallowedDataStreamRunes)
maxLenNamespace := otlp.MaxDataStreamBytes - len(otlp.DisallowedNamespaceRunes)
maxLenDataset := otlp.MaxDataStreamBytes - len(otlp.DisallowedDatasetRunes)

for _, tc := range []struct {
resourceDataStreamDataset string
Expand Down Expand Up @@ -915,10 +916,10 @@ func TestSpanDataStream(t *testing.T) {
// 1. Replace all disallowed runes with _
// 2. Datastream length should not exceed otlp.MaxDataStreamBytes
{
resourceDataStreamDataset: otlp.DisallowedDataStreamRunes + randomString,
resourceDataStreamNamespace: otlp.DisallowedDataStreamRunes + randomString,
expectedDataStreamDataset: strings.Repeat("_", len(otlp.DisallowedDataStreamRunes)) + randomString[:maxLen],
expectedDataStreamNamespace: strings.Repeat("_", len(otlp.DisallowedDataStreamRunes)) + randomString[:maxLen],
resourceDataStreamDataset: otlp.DisallowedDatasetRunes + randomString,
resourceDataStreamNamespace: otlp.DisallowedNamespaceRunes + randomString,
expectedDataStreamDataset: strings.Repeat("_", len(otlp.DisallowedDatasetRunes)) + randomString[:maxLenDataset],
expectedDataStreamNamespace: strings.Repeat("_", len(otlp.DisallowedNamespaceRunes)) + randomString[:maxLenNamespace],
},
} {
for _, isTxn := range []bool{false, true} {
Expand Down

0 comments on commit 4ce11ed

Please sign in to comment.