diff --git a/skywalking/config/__init__.py b/skywalking/config/__init__.py index 5eccc9dc..919bd7fd 100644 --- a/skywalking/config/__init__.py +++ b/skywalking/config/__init__.py @@ -31,6 +31,9 @@ mysql_sql_parameters_max_length = int(os.getenv('SW_MYSQL_SQL_PARAMETERS_MAX_LENGTH') or '512') # type: int ignore_suffix = os.getenv('SW_IGNORE_SUFFIX') or '.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,' \ '.mp4,.html,.svg ' # type: str +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 def init( diff --git a/skywalking/plugins/sw_flask/__init__.py b/skywalking/plugins/sw_flask/__init__.py index b62ceb09..04ffc76c 100644 --- a/skywalking/plugins/sw_flask/__init__.py +++ b/skywalking/plugins/sw_flask/__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 @@ -34,6 +34,9 @@ def install(): _handle_user_exception = Flask.handle_user_exception + def params_tostring(params): + return "\n".join([k + '=[' + ",".join(params.getlist(k)) + ']' for k, _ in params.items()]) + def _sw_full_dispatch_request(this: Flask): import flask req = flask.request @@ -48,7 +51,10 @@ def _sw_full_dispatch_request(this: Flask): span.component = Component.Flask span.peer = '%s:%s' % (req.environ["REMOTE_ADDR"], req.environ["REMOTE_PORT"]) span.tag(Tag(key=tags.HttpMethod, val=req.method)) - span.tag(Tag(key=tags.HttpUrl, val=req.url)) + span.tag(Tag(key=tags.HttpUrl, val=req.url.split("?")[0])) + if config.flask_collect_http_params and req.values: + span.tag(Tag(key=tags.HttpParams, + val=params_tostring(req.values)[0:config.http_params_length_threshold])) resp = _full_dispatch_request(this) if resp.status_code >= 400: diff --git a/skywalking/trace/tags/__init__.py b/skywalking/trace/tags/__init__.py index d642d699..89a6819a 100644 --- a/skywalking/trace/tags/__init__.py +++ b/skywalking/trace/tags/__init__.py @@ -27,3 +27,4 @@ DbInstance = 'db.instance' DbStatement = 'db.statement' DbSqlParameters = 'db.sql.parameters' +HttpParams = 'http.params' diff --git a/tests/plugin/sw_flask/expected.data.yml b/tests/plugin/sw_flask/expected.data.yml index 3e9d0b32..453f5392 100644 --- a/tests/plugin/sw_flask/expected.data.yml +++ b/tests/plugin/sw_flask/expected.data.yml @@ -81,6 +81,8 @@ segmentItems: 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 diff --git a/tests/plugin/sw_flask/services/consumer.py b/tests/plugin/sw_flask/services/consumer.py index c942f91c..45e7e804 100644 --- a/tests/plugin/sw_flask/services/consumer.py +++ b/tests/plugin/sw_flask/services/consumer.py @@ -22,6 +22,7 @@ if __name__ == '__main__': config.service_name = 'consumer' config.logging_level = 'DEBUG' + config.flask_collect_http_params = True agent.start() from flask import Flask, jsonify diff --git a/tests/plugin/sw_flask/test_flask.py b/tests/plugin/sw_flask/test_flask.py index 81874514..79827f58 100644 --- a/tests/plugin/sw_flask/test_flask.py +++ b/tests/plugin/sw_flask/test_flask.py @@ -30,7 +30,7 @@ def setUpClass(cls): 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)