This is an automated email from the ASF dual-hosted git repository. kezhenxu94 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/skywalking-python.git
The following commit(s) were added to refs/heads/master by this push: new 3c2fdd0 Enable Django collect http parameters (#49) 3c2fdd0 is described below commit 3c2fdd064de9f31c6a5bbcbbe56c670c0653e6d1 Author: Humbertzhang <504490...@qq.com> AuthorDate: Sat Jul 25 13:29:15 2020 +0800 Enable Django collect http parameters (#49) --- README.md | 1 + skywalking/config/__init__.py | 2 ++ skywalking/plugins/sw_django/__init__.py | 14 +++++++++-- tests/plugin/sw_django/expected.data.yml | 38 +++++++++++++++-------------- tests/plugin/sw_django/services/consumer.py | 1 + tests/plugin/sw_django/test_django.py | 2 +- 6 files changed, 37 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 7509bb4..af16be6 100755 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ Environment Variable | Description | Default | `SW_MYSQL_SQL_PARAMETERS_MAX_LENGTH` | The maximum length of the collected parameter, parameters longer than the specified length will be truncated | `512` | | `SW_IGNORE_SUFFIX` | If the operation name of the first span is included in this set, this segment should be ignored. | `.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg` | | `SW_FLASK_COLLECT_HTTP_PARAMS`| This config item controls that whether the Flask plugin should collect the parameters of the request.| `false` | +| `SW_DJANGO_COLLECT_HTTP_PARAMS`| This config item controls that whether the Django plugin should collect the parameters of the request.| `false` | | `SW_HTTP_PARAMS_LENGTH_THRESHOLD`| When `COLLECT_HTTP_PARAMS` is enabled, how many characters to keep and send to the OAP backend, use negative values to keep and send the complete parameters, NB. this config item is added for the sake of performance. | `1024` | diff --git a/skywalking/config/__init__.py b/skywalking/config/__init__.py index 919bd7f..e6e0920 100644 --- a/skywalking/config/__init__.py +++ b/skywalking/config/__init__.py @@ -34,6 +34,8 @@ ignore_suffix = os.getenv('SW_IGNORE_SUFFIX') or '.jpg,.jpeg,.js,.css,.png,.bmp, flask_collect_http_params = True if os.getenv('SW_FLASK_COLLECT_HTTP_PARAMS') and \ os.getenv('SW_FLASK_COLLECT_HTTP_PARAMS') == 'True' else False # type: bool http_params_length_threshold = int(os.getenv('SW_HTTP_PARAMS_LENGTH_THRESHOLD') or '1024') # type: int +django_collect_http_params = True if os.getenv('SW_DJANGO_COLLECT_HTTP_PARAMS') and \ + os.getenv('SW_DJANGO_COLLECT_HTTP_PARAMS') == 'True' else False # type: bool def init( diff --git a/skywalking/plugins/sw_django/__init__.py b/skywalking/plugins/sw_django/__init__.py index 042b16f..0b22621 100644 --- a/skywalking/plugins/sw_django/__init__.py +++ b/skywalking/plugins/sw_django/__init__.py @@ -16,7 +16,7 @@ # import logging -from skywalking import Layer, Component +from skywalking import Layer, Component, config from skywalking.trace import tags from skywalking.trace.carrier import Carrier from skywalking.trace.context import get_context @@ -50,7 +50,13 @@ def install(): span.peer = '%s:%s' % (request.META.get('REMOTE_ADDR'), request.META.get('REMOTE_PORT') or "80") span.tag(Tag(key=tags.HttpMethod, val=request.method)) - span.tag(Tag(key=tags.HttpUrl, val=request.build_absolute_uri())) + span.tag(Tag(key=tags.HttpUrl, val=request.build_absolute_uri().split("?")[0])) + + # you can get request parameters by `request.GET` even though client are using POST or other methods + if config.django_collect_http_params and request.GET: + span.tag(Tag(key=tags.HttpParams, + val=params_tostring(request.GET)[0:config.http_params_length_threshold])) + resp = _get_response(this, request) span.tag(Tag(key=tags.HttpStatus, val=resp.status_code)) if resp.status_code >= 400: @@ -70,3 +76,7 @@ def install(): exception.handle_uncaught_exception = _sw_handle_uncaught_exception except Exception: logger.warning('failed to install plugin %s', __name__) + + +def params_tostring(params): + return "\n".join([k + '=[' + ",".join(params.getlist(k)) + ']' for k, _ in params.items()]) diff --git a/tests/plugin/sw_django/expected.data.yml b/tests/plugin/sw_django/expected.data.yml index c946a3c..fafebed 100644 --- a/tests/plugin/sw_django/expected.data.yml +++ b/tests/plugin/sw_django/expected.data.yml @@ -26,6 +26,12 @@ segmentItems: parentSpanId: -1 spanId: 0 spanLayer: Http + startTime: gt 0 + endTime: gt 0 + componentId: 7004 + spanType: Entry + peer: not null + skipAnalysis: false tags: - key: http.method value: POST @@ -42,12 +48,6 @@ segmentItems: parentServiceInstance: not null parentService: consumer traceId: not null - startTime: gt 0 - endTime: gt 0 - componentId: 7004 - spanType: Entry - peer: not null - skipAnalysis: false - serviceName: consumer segmentSize: 1 segments: @@ -58,6 +58,12 @@ segmentItems: parentSpanId: 0 spanId: 1 spanLayer: Http + startTime: gt 0 + endTime: gt 0 + componentId: 7002 + spanType: Exit + peer: provider:9091 + skipAnalysis: false tags: - key: http.method value: POST @@ -65,27 +71,23 @@ segmentItems: value: http://provider:9091/users - key: status.code value: '200' - startTime: gt 0 - endTime: gt 0 - componentId: 7002 - spanType: Exit - peer: provider:9091 - skipAnalysis: false - operationName: /users operationId: 0 parentSpanId: -1 spanId: 0 spanLayer: Http + startTime: gt 0 + endTime: gt 0 + componentId: 7004 + spanType: Entry + peer: not null + skipAnalysis: false tags: - key: http.method value: GET - key: url value: http://0.0.0.0:9090/users + - key: http.params + value: "test=[test1,test2]\ntest2=[test2]" - key: status.code value: '200' - startTime: gt 0 - endTime: gt 0 - componentId: 7004 - spanType: Entry - peer: not null - skipAnalysis: false \ No newline at end of file diff --git a/tests/plugin/sw_django/services/consumer.py b/tests/plugin/sw_django/services/consumer.py index 60c9328..194122c 100644 --- a/tests/plugin/sw_django/services/consumer.py +++ b/tests/plugin/sw_django/services/consumer.py @@ -27,6 +27,7 @@ from django.http import JsonResponse config.service_name = "consumer" config.logging_level = "DEBUG" +config.django_collect_http_params = True agent.start() diff --git a/tests/plugin/sw_django/test_django.py b/tests/plugin/sw_django/test_django.py index 8187451..79827f5 100644 --- a/tests/plugin/sw_django/test_django.py +++ b/tests/plugin/sw_django/test_django.py @@ -30,7 +30,7 @@ class TestPlugin(BasePluginTest): cls.compose = DockerCompose(filepath=dirname(inspect.getfile(cls))) cls.compose.start() - cls.compose.wait_for(cls.url(('consumer', '9090'), 'users')) + cls.compose.wait_for(cls.url(('consumer', '9090'), 'users?test=test1&test=test2&test2=test2')) def test_plugin(self): time.sleep(3)