@@ -20,6 +20,10 @@ This SDK enables Dynatrace customers to extend request level visibility into Pyt
20
20
* [ Outgoing web requests] ( #outgoing-web-requests )
21
21
* [ Trace in-process asynchronous execution] ( #trace-in-process-asynchronous-execution )
22
22
* [ Custom request attributes] ( #custom-request-attributes )
23
+ * [ Custom services] ( #custom-services )
24
+ * [ Messaging] ( #messaging )
25
+ * [ Outgoing Messages] ( #outgoing-messaging )
26
+ * [ Incoming Messages] ( #incoming-messaging )
23
27
- [ Troubleshooting] ( #troubleshooting )
24
28
* [ Installation issues] ( #installation-issues )
25
29
* [ Post-installation issues] ( #post-installation-issues )
@@ -54,6 +58,7 @@ Dynatrace OneAgent version (it is the same as
54
58
| :----------------------| :---------------------| :-----------------|
55
59
| 1.0 | 1.1.0 | ≥1.141 |
56
60
| 1.1 | 1.3.1 | ≥1.151 |
61
+ | 1.2 | 1.4.1 | ≥1.161 |
57
62
58
63
<a name =" #using-the-oneagent-sdk-for-python-in-your-application " ></a >
59
64
## Using the OneAgent SDK for Python in your application
@@ -207,6 +212,8 @@ A more detailed specification of the features can be found in [Dynatrace OneAgen
207
212
| Outgoing web requests | ≥1.1.0 |
208
213
| Custom request attributes | ≥1.1.0 |
209
214
| In-process linking | ≥1.1.0 |
215
+ | Messaging | ≥1.2.0 |
216
+ | Custom services | ≥1.2.0 |
210
217
211
218
<a name =" remote-calls " ></a >
212
219
### Remote calls
@@ -387,7 +394,7 @@ The provided in-process link must not be serialized and can only be used inside
387
394
tracing where the asynchronous execution takes place:
388
395
389
396
``` python
390
- with sdk.trace_in_process_link(in_process_link):
397
+ with sdk.trace_in_process_link(in_process_link):
391
398
# Do the asynchronous job
392
399
:
393
400
```
@@ -411,6 +418,121 @@ Check out the documentation at:
411
418
* [ ` add_custom_request_attribute ` ] ( https://dynatrace.github.io/OneAgent-SDK-for-Python/docs/sdkref.html#oneagent.sdk.SDK.add_custom_request_attribute )
412
419
413
420
421
+ <a name =" custom-services " ></a >
422
+ ### Custom services
423
+ You can use the SDK to trace custom service methods. A custom service method is a meaningful part
424
+ of your code that you want to trace but that does not fit any other tracer. An example could be
425
+ the callback of a periodic timer.
426
+
427
+ ``` python
428
+ with sdk.trace_custom_service(' onTimer' , ' CleanupTask' ):
429
+ # Do the cleanup task
430
+ :
431
+ ```
432
+
433
+ Check out the documentation at:
434
+ * [ ` trace_custom_service ` ] ( https://dynatrace.github.io/OneAgent-SDK-for-Python/docs/sdkref.html#oneagent.sdk.SDK.trace_custom_service )
435
+
436
+
437
+ <a name =" messaging " ></a >
438
+ ### Messaging
439
+
440
+ You can use the SDK to trace messages sent or received via a messaging system. When tracing messages,
441
+ we distinguish between:
442
+
443
+ * sending a message
444
+ * waiting for and receiving a message
445
+ * processing a received message
446
+
447
+ <a name =" outgoing-messaging " ></a >
448
+ #### Outgoing Messages
449
+
450
+ All messaging related tracers need a messaging system info object which you have to create prior
451
+ to the respective messaging tracer, which is an outgoing message tracer in the example below.
452
+
453
+ ``` python
454
+ msi_handle = sdk.create_messaging_system_info(
455
+ ' myMessagingSystem' , ' requestQueue' , MessagingDestinationType.QUEUE ,
456
+ ChannelType.TCP_IP , ' 10.11.12.13' )
457
+
458
+ with msi_handle:
459
+ with sdk.trace_outgoing_message(msi_handle) as tracer:
460
+ # Get and set the Dynatrace tag.
461
+ tag = tracer.outgoing_dynatrace_string_tag
462
+ message_to_send.add_header_field(oneagent.sdk.DYNATRACE_MESSAGE_PROPERTY_NAME , tag)
463
+
464
+ # Send the message.
465
+ the_queue.send(message_to_send)
466
+
467
+ # Optionally set message and/or correlation IDs
468
+ tracer.set_vendor_message_id(message_to_send.get_message_id())
469
+ tracer.set_correlation_id(message_to_send.get_correlation_id())
470
+ ```
471
+
472
+ <a name =" incoming-messaging " ></a >
473
+ #### Incoming Messages
474
+
475
+ On the incoming side, we need to differentiate between the blocking receiving part and processing
476
+ the received message. Therefore two different tracers are being used:
477
+
478
+ * IncomingMessageReceiveTracer
479
+ * IncomingMessageProcessTracer
480
+
481
+ ``` python
482
+ msi_handle = sdk.create_messaging_system_info(
483
+ ' myMessagingSystem' , ' requestQueue' , MessagingDestinationType.QUEUE ,
484
+ ChannelType.TCP_IP , ' 10.11.12.13' )
485
+
486
+ with msi_handle:
487
+ # Create the receive tracer for incoming messages.
488
+ with sdk.trace_incoming_message_receive(msi_handle):
489
+ # This is a blocking call, which will return as soon as a message is available.
490
+ Message query_message = the_queue.receive()
491
+
492
+ # Get the Dynatrace tag from the message.
493
+ tag = query_message.get_header_field(oneagent.sdk.DYNATRACE_MESSAGE_PROPERTY_NAME )
494
+
495
+ # Create the tracer for processing incoming messages.
496
+ tracer = sdk.trace_incoming_message_process(msi_handle, str_tag = tag)
497
+ tracer.set_vendor_message_id(query_message.get_vendor_id())
498
+ tracer.set_correlation_id(query_message.get_correlation_id())
499
+
500
+ with tracer:
501
+ # Now let's handle the message ...
502
+ print (' handle incoming message' )
503
+ ```
504
+
505
+ In case of non-blocking receive (e. g. using an event handler), there is no need to use an
506
+ IncomingMessageReceiveTracer - just trace processing of the message by using the IncomingMessageProcessTracer:
507
+
508
+ ``` python
509
+ msi_handle = sdk.create_messaging_system_info(
510
+ ' myMessagingSystem' , ' requestQueue' , MessagingDestinationType.QUEUE ,
511
+ ChannelType.TCP_IP , ' 10.11.12.13' )
512
+
513
+ def on_message_received (message ):
514
+ # Get the Dynatrace tag from the message.
515
+ tag = message.get_header_field(oneagent.sdk.DYNATRACE_MESSAGE_PROPERTY_NAME )
516
+
517
+ # Create the tracer for processing incoming messages.
518
+ tracer = sdk.trace_incoming_message_process(msi_handle, str_tag = tag)
519
+ tracer.set_vendor_message_id(message.get_vendor_id())
520
+ tracer.set_correlation_id(message.get_correlation_id())
521
+
522
+ with tracer:
523
+ # Now let's handle the message ...
524
+ print (' handle incoming message' )
525
+ ```
526
+
527
+ See the documentation for more information:
528
+
529
+ * [ ` create_messaging_system_info ` ] ( https://dynatrace.github.io/OneAgent-SDK-for-Python/docs/sdkref.html#oneagent.sdk.SDK.create_messaging_system_info )
530
+ * [ ` trace_outgoing_message ` ] ( https://dynatrace.github.io/OneAgent-SDK-for-Python/docs/sdkref.html#oneagent.sdk.tracers.trace_outgoing_message )
531
+ * [ ` trace_incoming_message_receive ` ] ( https://dynatrace.github.io/OneAgent-SDK-for-Python/docs/sdkref.html#oneagent.sdk.tracers.trace_incoming_message_receive )
532
+ * [ ` trace_incoming_message_process ` ] ( https://dynatrace.github.io/OneAgent-SDK-for-Python/docs/sdkref.html#oneagent.sdk.tracers.trace_incoming_message_process )
533
+ * [ General information on tagging] ( https://dynatrace.github.io/OneAgent-SDK-for-Python/docs/tagging.html )
534
+
535
+
414
536
<a name =" troubleshooting " ></a >
415
537
## Troubleshooting
416
538
0 commit comments