7
7
set_dsm_context ,
8
8
_dsm_set_sqs_context ,
9
9
_dsm_set_sns_context ,
10
+ _dsm_set_kinesis_context ,
10
11
_get_dsm_context_from_lambda ,
11
12
)
12
13
from datadog_lambda .trigger import EventTypes , _EventSource
@@ -24,12 +25,14 @@ def setUp(self):
24
25
25
26
patcher = patch ("datadog_lambda.dsm._get_dsm_context_from_lambda" )
26
27
self .mock_get_dsm_context_from_lambda = patcher .start ()
28
+ self .addCleanup (patcher .stop )
29
+
27
30
patcher = patch ("datadog_lambda.dsm._dsm_set_sns_context" )
28
31
self .mock_dsm_set_sns_context = patcher .start ()
29
32
self .addCleanup (patcher .stop )
30
33
31
- patcher = patch ("ddtrace.internal.datastreams.data_streams_processor " )
32
- self .mock_data_streams_processor = patcher .start ()
34
+ patcher = patch ("datadog_lambda.dsm._dsm_set_kinesis_context " )
35
+ self .mock_dsm_set_kinesis_context = patcher .start ()
33
36
self .addCleanup (patcher .stop )
34
37
35
38
def test_non_sqs_event_source_does_nothing (self ):
@@ -263,6 +266,103 @@ def test_sns_multiple_records_process_each_record(self):
263
266
pathway_ctx = carrier_get_func ("dd-pathway-ctx-base64" )
264
267
self .assertEqual (pathway_ctx , expected_contexts [i ])
265
268
269
+ def test_kinesis_event_with_no_records_does_nothing (self ):
270
+ """Test that events where Records is None don't trigger DSM processing"""
271
+ events_with_no_records = [
272
+ {},
273
+ {"Records" : None },
274
+ {"someOtherField" : "value" },
275
+ ]
276
+
277
+ for event in events_with_no_records :
278
+ _dsm_set_kinesis_context (event )
279
+ self .mock_set_consume_checkpoint .assert_not_called ()
280
+
281
+ def test_kinesis_event_triggers_dsm_kinesis_context (self ):
282
+ """Test that Kinesis event sources trigger the Kinesis-specific DSM context function"""
283
+ kinesis_event = {
284
+ "Records" : [
285
+ {
286
+ "eventSource" : "aws:kinesis" ,
287
+ "eventSourceARN" : "arn:aws:kinesis:us-east-1:123456789012:stream/my-stream" ,
288
+ "kinesis" : {
289
+ "data" : "SGVsbG8gZnJvbSBLaW5lc2lzIQ==" ,
290
+ "partitionKey" : "partition-key" ,
291
+ },
292
+ }
293
+ ]
294
+ }
295
+
296
+ event_source = _EventSource (EventTypes .KINESIS )
297
+ set_dsm_context (kinesis_event , event_source )
298
+
299
+ self .mock_dsm_set_kinesis_context .assert_called_once_with (kinesis_event )
300
+
301
+ def test_kinesis_multiple_records_process_each_record (self ):
302
+ """Test that each record in a Kinesis event gets processed individually"""
303
+ multi_record_event = {
304
+ "Records" : [
305
+ {
306
+ "eventSourceARN" : "arn:aws:kinesis:us-east-1:123456789012:stream/stream1" ,
307
+ "kinesis" : {
308
+ "data" : base64 .b64encode (
309
+ json .dumps ({"dd-pathway-ctx-base64" : "context1" }).encode ("utf-8" )
310
+ ).decode ("utf-8" ),
311
+ "partitionKey" : "partition-1" ,
312
+ },
313
+ },
314
+ {
315
+ "eventSourceARN" : "arn:aws:kinesis:us-east-1:123456789012:stream/stream2" ,
316
+ "kinesis" : {
317
+ "data" : base64 .b64encode (
318
+ json .dumps ({"dd-pathway-ctx-base64" : "context2" }).encode ("utf-8" )
319
+ ).decode ("utf-8" ),
320
+ "partitionKey" : "partition-2" ,
321
+ },
322
+ },
323
+ {
324
+ "eventSourceARN" : "arn:aws:kinesis:us-east-1:123456789012:stream/stream3" ,
325
+ "kinesis" : {
326
+ "data" : base64 .b64encode (
327
+ json .dumps ({"dd-pathway-ctx-base64" : "context3" }).encode ("utf-8" )
328
+ ).decode ("utf-8" ),
329
+ "partitionKey" : "partition-3" ,
330
+ },
331
+ },
332
+ ]
333
+ }
334
+
335
+ self .mock_get_dsm_context_from_lambda .side_effect = [
336
+ {"dd-pathway-ctx-base64" : "context1" },
337
+ {"dd-pathway-ctx-base64" : "context2" },
338
+ {"dd-pathway-ctx-base64" : "context3" },
339
+ ]
340
+
341
+ _dsm_set_kinesis_context (multi_record_event )
342
+
343
+ self .assertEqual (self .mock_set_consume_checkpoint .call_count , 3 )
344
+
345
+ calls = self .mock_set_consume_checkpoint .call_args_list
346
+ expected_arns = [
347
+ "arn:aws:kinesis:us-east-1:123456789012:stream/stream1" ,
348
+ "arn:aws:kinesis:us-east-1:123456789012:stream/stream2" ,
349
+ "arn:aws:kinesis:us-east-1:123456789012:stream/stream3" ,
350
+ ]
351
+ expected_contexts = ["context1" , "context2" , "context3" ]
352
+
353
+ for i , call in enumerate (calls ):
354
+ args , kwargs = call
355
+ service_type = args [0 ]
356
+ arn = args [1 ]
357
+ carrier_get_func = args [2 ]
358
+
359
+ self .assertEqual (service_type , "kinesis" )
360
+
361
+ self .assertEqual (arn , expected_arns [i ])
362
+
363
+ pathway_ctx = carrier_get_func ("dd-pathway-ctx-base64" )
364
+ self .assertEqual (pathway_ctx , expected_contexts [i ])
365
+
266
366
267
367
class TestGetDSMContext (unittest .TestCase ):
268
368
def test_sqs_to_lambda_string_value_format (self ):
0 commit comments