@@ -20,6 +20,7 @@ use std::collections::HashMap;
20
20
21
21
use actix_web:: HttpRequest ;
22
22
use chrono:: Utc ;
23
+ use http:: header:: USER_AGENT ;
23
24
use opentelemetry_proto:: tonic:: {
24
25
logs:: v1:: LogsData , metrics:: v1:: MetricsData , trace:: v1:: TracesData ,
25
26
} ;
@@ -28,7 +29,7 @@ use serde_json::Value;
28
29
use crate :: {
29
30
event:: {
30
31
format:: { json, EventFormat , LogSource } ,
31
- SOURCE_IP_KEY , USER_AGENT_KEY ,
32
+ FORMAT_KEY , SOURCE_IP_KEY , USER_AGENT_KEY ,
32
33
} ,
33
34
handlers:: {
34
35
http:: {
@@ -43,7 +44,7 @@ use crate::{
43
44
utils:: json:: { convert_array_to_object, flatten:: convert_to_array} ,
44
45
} ;
45
46
46
- const IGNORE_HEADERS : [ & str ; 2 ] = [ STREAM_NAME_HEADER_KEY , LOG_SOURCE_KEY ] ;
47
+ const IGNORE_HEADERS : [ & str ; 1 ] = [ STREAM_NAME_HEADER_KEY ] ;
47
48
48
49
pub async fn flatten_and_push_logs (
49
50
json : Value ,
@@ -146,7 +147,7 @@ async fn push_logs(
146
147
pub fn get_custom_fields_from_header ( req : HttpRequest ) -> HashMap < String , String > {
147
148
let user_agent = req
148
149
. headers ( )
149
- . get ( "User-Agent" )
150
+ . get ( USER_AGENT )
150
151
. and_then ( |a| a. to_str ( ) . ok ( ) )
151
152
. unwrap_or_default ( ) ;
152
153
@@ -166,6 +167,58 @@ pub fn get_custom_fields_from_header(req: HttpRequest) -> HashMap<String, String
166
167
p_custom_fields. insert ( key. to_string ( ) , value. to_string ( ) ) ;
167
168
}
168
169
}
170
+
171
+ if header_name == LOG_SOURCE_KEY {
172
+ if let Ok ( value) = header_value. to_str ( ) {
173
+ p_custom_fields. insert ( FORMAT_KEY . to_string ( ) , value. to_string ( ) ) ;
174
+ }
175
+ }
169
176
}
177
+
170
178
p_custom_fields
171
179
}
180
+
181
+ #[ cfg( test) ]
182
+ mod tests {
183
+ use super :: * ;
184
+ use actix_web:: test:: TestRequest ;
185
+
186
+ #[ test]
187
+ fn test_get_custom_fields_from_header_with_custom_fields ( ) {
188
+ let req = TestRequest :: default ( )
189
+ . insert_header ( ( USER_AGENT , "TestUserAgent" ) )
190
+ . insert_header ( ( "x-p-environment" , "dev" ) )
191
+ . to_http_request ( ) ;
192
+
193
+ let custom_fields = get_custom_fields_from_header ( req) ;
194
+
195
+ assert_eq ! ( custom_fields. get( USER_AGENT_KEY ) . unwrap( ) , "TestUserAgent" ) ;
196
+ assert_eq ! ( custom_fields. get( "environment" ) . unwrap( ) , "dev" ) ;
197
+ }
198
+
199
+ #[ test]
200
+ fn test_get_custom_fields_from_header_with_ignored_headers ( ) {
201
+ let req = TestRequest :: default ( )
202
+ . insert_header ( ( USER_AGENT , "TestUserAgent" ) )
203
+ . insert_header ( ( STREAM_NAME_HEADER_KEY , "teststream" ) )
204
+ . to_http_request ( ) ;
205
+
206
+ let custom_fields = get_custom_fields_from_header ( req) ;
207
+
208
+ assert_eq ! ( custom_fields. get( USER_AGENT_KEY ) . unwrap( ) , "TestUserAgent" ) ;
209
+ assert ! ( !custom_fields. contains_key( STREAM_NAME_HEADER_KEY ) ) ;
210
+ }
211
+
212
+ #[ test]
213
+ fn test_get_custom_fields_from_header_with_format_key ( ) {
214
+ let req = TestRequest :: default ( )
215
+ . insert_header ( ( USER_AGENT , "TestUserAgent" ) )
216
+ . insert_header ( ( LOG_SOURCE_KEY , "otel-logs" ) )
217
+ . to_http_request ( ) ;
218
+
219
+ let custom_fields = get_custom_fields_from_header ( req) ;
220
+
221
+ assert_eq ! ( custom_fields. get( USER_AGENT_KEY ) . unwrap( ) , "TestUserAgent" ) ;
222
+ assert_eq ! ( custom_fields. get( FORMAT_KEY ) . unwrap( ) , "otel-logs" ) ;
223
+ }
224
+ }
0 commit comments