diff --git a/collector/receiver/telemetryapireceiver/receiver.go b/collector/receiver/telemetryapireceiver/receiver.go index 717244b431..9e7390b204 100644 --- a/collector/receiver/telemetryapireceiver/receiver.go +++ b/collector/receiver/telemetryapireceiver/receiver.go @@ -490,6 +490,19 @@ func (r *telemetryAPIReceiver) createLogs(slice []event) (plog.Logs, error) { } } else if line, ok := record["message"].(string); ok { logRecord.Body().SetStr(line) + + for key, value := range record { + switch key { + case "level", "message", "requestId", "timestamp": + continue + default: + attr, _ := logRecord.Attributes().GetOrPutEmpty(key) + if err := attr.FromRaw(value); err != nil { + r.logger.Warn(fmt.Sprintf("error creating attribute: %s", key), zap.Error(err)) + continue + } + } + } } } else { if requestId := r.getCurrentRequestId(); requestId != "" { diff --git a/collector/receiver/telemetryapireceiver/receiver_test.go b/collector/receiver/telemetryapireceiver/receiver_test.go index 476f22184f..a076898022 100644 --- a/collector/receiver/telemetryapireceiver/receiver_test.go +++ b/collector/receiver/telemetryapireceiver/receiver_test.go @@ -359,6 +359,7 @@ func TestCreateLogs(t *testing.T) { containsRequestId bool requestId string severityNumber plog.SeverityNumber + attributes map[string]interface{} } testCases := []struct { @@ -479,6 +480,109 @@ func TestCreateLogs(t *testing.T) { }, expectError: false, }, + { + desc: "function json with extra fields", + slice: []event{ + { + Time: "2026-02-26T20:15:32.000Z", + Type: "function", + Record: map[string]any{ + "timestamp": "2026-02-26T20:15:32.000Z", + "level": "INFO", + "requestId": "79b4f56e-95b1-4643-9700-2807f4e6", + "message": "Hello world, I am a function with extra data!", + "extraString": "stringValue", + "extraNumber": 2217, + "extraFloat": 3.14, + "extraBoolean": true, + "extraNull": nil, + "extraArrayOfStrings": []any{"stringValue", "stringValue"}, + "extraArrayOfNumbers": []any{2217, 2217}, + "extraArrayOfMixedTypes": []any{"stringValue", 2217, true, nil}, + "extraArrayWithNesting": []any{"stringValue", []any{2217, []any{true, nil}}}, + "extraObject": map[string]any{ + "stringValue": "stringValue", + "numberValue": 2217, + "booleanValue": true, + "nullValue": nil, + }, + "extraObjectWithNesting": map[string]any{ + "stringValue": "stringValue", + "numberValue": 2217, + "booleanValue": true, + "nullValue": nil, + "arrayValue": []any{"stringValue", 2217}, + "objectValue": map[string]any{ + "stringValue": "stringValue", + "numberValue": 2217, + }, + }, + }, + }, + }, + expectedLogs: []logInfo{ + { + logType: "function", + timestamp: "2026-02-26T20:15:32.000Z", + body: "Hello world, I am a function with extra data!", + containsRequestId: true, + requestId: "79b4f56e-95b1-4643-9700-2807f4e6", + severityText: "Info", + severityNumber: plog.SeverityNumberInfo, + attributes: map[string]any{ + "extraString": "stringValue", + "extraNumber": int64(2217), + "extraFloat": float64(3.14), + "extraBoolean": true, + "extraNull": nil, + "extraArrayOfStrings": []any{ + "stringValue", + "stringValue", + }, + "extraArrayOfNumbers": []any{ + int64(2217), + int64(2217), + }, + "extraArrayOfMixedTypes": []any{ + "stringValue", + int64(2217), + true, + nil, + }, + "extraArrayWithNesting": []any{ + "stringValue", + []any{ + int64(2217), + []any{ + true, nil, + }, + }, + }, + "extraObject": map[string]any{ + "stringValue": "stringValue", + "numberValue": int64(2217), + "booleanValue": true, + "nullValue": nil, + }, + "extraObjectWithNesting": map[string]any{ + "stringValue": "stringValue", + "numberValue": int64(2217), + "booleanValue": true, + "nullValue": nil, + "arrayValue": []any{ + "stringValue", + int64(2217), + }, + "objectValue": map[string]any{ + "stringValue": "stringValue", + "numberValue": int64(2217), + }, + }, + }, + }, + }, + expectError: false, + }, { desc: "extension text", slice: []event{ @@ -820,6 +924,13 @@ func TestCreateLogs(t *testing.T) { require.Equal(t, expected.severityText, logRecord.SeverityText()) require.Equal(t, expected.severityNumber, logRecord.SeverityNumber()) require.Equal(t, expected.body, logRecord.Body().Str()) + + // Check extra attributes + for key, value := range expected.attributes { + attr, ok := logRecord.Attributes().Get(key) + require.True(t, ok, "expected attribute %s not found", key) + require.Equal(t, value, attr.AsRaw(), "expected attribute %s to have value %v, got %v", key, value, attr.AsRaw()) + } } }) }