|
1 | 1 | import botocore.vendored.requests.sessions
|
2 | 2 | import json
|
3 | 3 | import wrapt
|
| 4 | +import pynamodb |
4 | 5 |
|
5 | 6 | from aws_xray_sdk.core import xray_recorder
|
6 | 7 | from aws_xray_sdk.core.models import http
|
7 | 8 | from aws_xray_sdk.ext.boto_utils import _extract_whitelisted_params
|
8 | 9 |
|
| 10 | +PYNAMODB4 = int(pynamodb.__version__.split('.')[0]) >= 4 |
| 11 | + |
9 | 12 |
|
10 | 13 | def patch():
|
11 | 14 | """Patch PynamoDB so it generates subsegements when calling DynamoDB."""
|
12 |
| - import pynamodb |
13 | 15 |
|
14 | 16 | if hasattr(botocore.vendored.requests.sessions, '_xray_enabled'):
|
15 | 17 | return
|
16 | 18 | setattr(botocore.vendored.requests.sessions, '_xray_enabled', True)
|
17 | 19 |
|
| 20 | + if PYNAMODB4: |
| 21 | + module = 'botocore.httpsession' |
| 22 | + name = 'URLLib3Session.send' |
| 23 | + else: |
| 24 | + module = 'botocore.vendored.requests.sessions' |
| 25 | + name = 'Session.send' |
18 | 26 | wrapt.wrap_function_wrapper(
|
19 |
| - 'botocore.vendored.requests.sessions', |
20 |
| - 'Session.send', |
21 |
| - _xray_traced_pynamodb, |
| 27 | + module, name, _xray_traced_pynamodb, |
22 | 28 | )
|
23 | 29 |
|
24 | 30 |
|
@@ -59,7 +65,10 @@ def pynamodb_meta_processor(wrapped, instance, args, kwargs, return_value,
|
59 | 65 | subsegment.add_error_flag()
|
60 | 66 | subsegment.add_exception(exception, stack, True)
|
61 | 67 |
|
62 |
| - resp = return_value.json() if return_value else None |
| 68 | + if PYNAMODB4: |
| 69 | + resp = json.loads(return_value.text) if return_value else None |
| 70 | + else: |
| 71 | + resp = return_value.json() if return_value else None |
63 | 72 | _extract_whitelisted_params(subsegment.name, operation_name, aws_meta,
|
64 | 73 | [None, json.loads(args[0].body.decode('utf-8'))],
|
65 | 74 | None, resp)
|
|
0 commit comments