Skip to content

Commit ff9dc77

Browse files
committed
address PR feedback
- set ConvertHeadersToAttributes to false in `createDefaultConfig` - Adds additional test cases for ReqToLog - Adds tests for normalized header attribute key
1 parent fed620b commit ff9dc77

File tree

3 files changed

+76
-9
lines changed

3 files changed

+76
-9
lines changed

receiver/webhookeventreceiver/factory.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ func NewFactory() receiver.Factory {
3838
// Default configuration for the generic webhook receiver
3939
func createDefaultConfig() component.Config {
4040
return &Config{
41-
Path: defaultPath,
42-
HealthPath: defaultHealthPath,
43-
ReadTimeout: defaultReadTimeout,
44-
WriteTimeout: defaultWriteTimeout,
45-
SplitLogsAtNewLine: false,
41+
Path: defaultPath,
42+
HealthPath: defaultHealthPath,
43+
ReadTimeout: defaultReadTimeout,
44+
WriteTimeout: defaultWriteTimeout,
45+
ConvertHeadersToAttributes: false, // optional, off by default
46+
SplitLogsAtNewLine: false,
4647
}
4748
}
4849

receiver/webhookeventreceiver/req_to_log.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,13 @@ func appendHeaders(config *Config, scopeLog plog.ScopeLogs, headers http.Header)
7979
if k == textproto.CanonicalMIMEHeaderKey(config.RequiredHeader.Key) {
8080
continue
8181
}
82-
// store headers with "header" namespace and normalize key to snake_case
83-
normalizedHeader := strings.ReplaceAll(k, "-", "_")
84-
normalizedHeader = strings.ToLower(normalizedHeader)
85-
scopeLog.Scope().Attributes().PutStr("header."+normalizedHeader, strings.Join(headers.Values(k), ";"))
82+
scopeLog.Scope().Attributes().PutStr(headerAttributeKey(k), strings.Join(headers.Values(k), ";"))
8683
}
8784
}
85+
86+
// convert given header to snake_case and add "header" as a namespace prefix
87+
func headerAttributeKey(header string) string {
88+
snakeCaseHeader := strings.ReplaceAll(header, "-", "_")
89+
snakeCaseHeader = strings.ToLower(snakeCaseHeader)
90+
return "header." + snakeCaseHeader
91+
}

receiver/webhookeventreceiver/req_to_log_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,60 @@ func TestReqToLog(t *testing.T) {
136136
require.Equal(t, 2, scopeLogsScope.Attributes().Len()) // expect no additional attributes even though headers are set
137137
},
138138
},
139+
{
140+
desc: "ConvertHeadersToAttributes enabled but no headers included",
141+
headers: http.Header{},
142+
config: &Config{
143+
Path: defaultPath,
144+
HealthPath: defaultHealthPath,
145+
ReadTimeout: defaultReadTimeout,
146+
WriteTimeout: defaultWriteTimeout,
147+
RequiredHeader: RequiredHeader{Key: "X-Required-Header", Value: "password"},
148+
ConvertHeadersToAttributes: true,
149+
},
150+
sc: func() *bufio.Scanner {
151+
reader := io.NopCloser(bytes.NewReader([]byte("this is a: log")))
152+
return bufio.NewScanner(reader)
153+
}(),
154+
tt: func(t *testing.T, reqLog plog.Logs, reqLen int, _ receiver.Settings) {
155+
require.Equal(t, 1, reqLen)
156+
157+
attributes := reqLog.ResourceLogs().At(0).Resource().Attributes()
158+
require.Equal(t, 0, attributes.Len())
159+
160+
scopeLogsScope := reqLog.ResourceLogs().At(0).ScopeLogs().At(0).Scope()
161+
require.Equal(t, 2, scopeLogsScope.Attributes().Len()) // expect no additional attributes even though headers are set
162+
},
163+
},
164+
{
165+
desc: "ConvertHeadersToAttributes enabled but only a required header included",
166+
headers: http.Header{
167+
textproto.CanonicalMIMEHeaderKey("X-Required-Header"): []string{"password"},
168+
},
169+
config: &Config{
170+
Path: defaultPath,
171+
HealthPath: defaultHealthPath,
172+
ReadTimeout: defaultReadTimeout,
173+
WriteTimeout: defaultWriteTimeout,
174+
RequiredHeader: RequiredHeader{Key: "X-Required-Header", Value: "password"},
175+
ConvertHeadersToAttributes: true,
176+
},
177+
sc: func() *bufio.Scanner {
178+
reader := io.NopCloser(bytes.NewReader([]byte("this is a: log")))
179+
return bufio.NewScanner(reader)
180+
}(),
181+
tt: func(t *testing.T, reqLog plog.Logs, reqLen int, _ receiver.Settings) {
182+
require.Equal(t, 1, reqLen)
183+
184+
attributes := reqLog.ResourceLogs().At(0).Resource().Attributes()
185+
require.Equal(t, 0, attributes.Len())
186+
187+
scopeLogsScope := reqLog.ResourceLogs().At(0).ScopeLogs().At(0).Scope()
188+
require.Equal(t, 2, scopeLogsScope.Attributes().Len()) // expect no additional attributes even though headers are set
189+
_, exists := scopeLogsScope.Attributes().Get("header.x_required_header")
190+
require.False(t, exists)
191+
},
192+
},
139193
{
140194
desc: "Headers added if ConvertHeadersToAttributes enabled",
141195
headers: http.Header{
@@ -217,3 +271,11 @@ func TestReqToLog(t *testing.T) {
217271
})
218272
}
219273
}
274+
275+
func TestHeaderAttributeKey(t *testing.T) {
276+
// Test mix of header values to ensure consistent output
277+
require.Equal(t, "header.foo", headerAttributeKey("foo"))
278+
require.Equal(t, "header.1", headerAttributeKey("1"))
279+
require.Equal(t, "header.content_type", headerAttributeKey("Content-type"))
280+
require.Equal(t, "header.unexpected_camel_case_header", headerAttributeKey("UnExPectEd-CaMeL-CaSe-HeAdEr"))
281+
}

0 commit comments

Comments
 (0)