Enable Django collect http parameters (#49)

diff --git a/README.md b/README.md
index 7509bb4..af16be6 100755
--- a/README.md
+++ b/README.md
@@ -62,6 +62,7 @@
 | `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 @@
 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 @@
                 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 @@
         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 @@
             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 @@
                 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 @@
             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 @@
                 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
-            tags:
-              - key: http.method
-                value: GET
-              - key: url
-                value: http://0.0.0.0:9090/users
-              - 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
+            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'
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 @@
 
 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 @@
         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)