)]}'
{"osprofiler/drivers/jaeger.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"838a8b7f1ad80cabd8479699b60c962553a4aad1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        config \u003d jaeger_client.Config(cfg, service_name\u003dservice_name)"},{"line_number":58,"context_line":"        self.tracer \u003d config.initialize_tracer()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        self.spans \u003d collections.deque()"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_0b393ad5","line":60,"updated":"2018-05-16 13:43:07.000000000","message":"I might be wrong, but what will happen if there are 2 threads running in parallel? \nProfiler itself is thread-local, but the driver is shared across threads, meaning that parallel spans may mix. Right?","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"838a8b7f1ad80cabd8479699b60c962553a4aad1","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            # Span error tag and log"},{"line_number":101,"context_line":"            if payload[\"info\"].get(\"etype\") is not None:"},{"line_number":102,"context_line":"                span.set_tag(\"error\", True)"},{"line_number":103,"context_line":"                span.log_kv({\"error.kind\": payload[\"info\"][\"etype\"]})"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"            span.finish(finish_time\u003dtime.time())"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_e82644ce","line":103,"updated":"2018-05-16 13:43:07.000000000","message":"just curious, why log_kv and not set_tag here?","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"07a027fd8cf870331d89606fa2d7472743643ed6","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            # Span error tag and log"},{"line_number":101,"context_line":"            if payload[\"info\"].get(\"etype\") is not None:"},{"line_number":102,"context_line":"                span.set_tag(\"error\", True)"},{"line_number":103,"context_line":"                span.log_kv({\"error.kind\": payload[\"info\"][\"etype\"]})"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"            span.finish(finish_time\u003dtime.time())"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_d3fe706a","line":103,"in_reply_to":"5f7c97a3_28096fdc","updated":"2018-05-18 08:14:23.000000000","message":"Thank you for the explanation. Later this can be extended with `message` attribute since it looks important too.","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"8c2a2da3837197bf5b5b1f471ca9e1f6056a6fd9","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            # Span error tag and log"},{"line_number":101,"context_line":"            if payload[\"info\"].get(\"etype\") is not None:"},{"line_number":102,"context_line":"                span.set_tag(\"error\", True)"},{"line_number":103,"context_line":"                span.log_kv({\"error.kind\": payload[\"info\"][\"etype\"]})"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"            span.finish(finish_time\u003dtime.time())"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_28096fdc","line":103,"in_reply_to":"5f7c97a3_e82644ce","updated":"2018-05-18 06:56:11.000000000","message":"\u003e just curious, why log_kv and not set_tag here?\n\nBecause log and tag are a little bit different.\n\nEasy explanation: `error` and `error.kind` is log fields. While other field such as `http.path` is a span tag. That what OpenTracng semantic convention called [1].\n\n\nA little deep explanation: `log` and `tag` are not the same in both meaning and implementation. You can take a look at `Log` and `Tag` class in this [2] file.\n\n[1] https://github.com/opentracing/specification/blob/master/semantic_conventions.md#log-fields-table\n[2] https://github.com/jaegertracing/jaeger-client-python/blob/master/jaeger_client/thrift_gen/jaeger/ttypes.py","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"838a8b7f1ad80cabd8479699b60c962553a4aad1","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        return \"Please use Jaeger Tracing UI for this task.\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def list_traces(self, fields\u003dNone):"},{"line_number":111,"context_line":"        return \"Please use Jaeger Tracing UI for this task.\""},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def list_error_traces(self):"},{"line_number":114,"context_line":"        return \"Please use Jaeger Tracing UI for this task.\""}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_8b330aab","line":111,"updated":"2018-05-16 13:43:07.000000000","message":"this function has to return empty list or raise an exception; currently the command fails without explanation:\n\n  File \"/opt/stack/osprofiler/osprofiler/cmd/commands.py\", line 180, in list\n    row \u003d [trace[field] for field in fields]\nTypeError: string indices must be integers, not str","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"8c2a2da3837197bf5b5b1f471ca9e1f6056a6fd9","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        return \"Please use Jaeger Tracing UI for this task.\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def list_traces(self, fields\u003dNone):"},{"line_number":111,"context_line":"        return \"Please use Jaeger Tracing UI for this task.\""},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def list_error_traces(self):"},{"line_number":114,"context_line":"        return \"Please use Jaeger Tracing UI for this task.\""}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_e8129709","line":111,"in_reply_to":"5f7c97a3_8b330aab","updated":"2018-05-18 06:56:11.000000000","message":"\u003e this function has to return empty list or raise an exception;\n \u003e currently the command fails without explanation:\n \u003e \n \u003e File \"/opt/stack/osprofiler/osprofiler/cmd/commands.py\", line 180,\n \u003e in list\n \u003e row \u003d [trace[field] for field in fields]\n \u003e TypeError: string indices must be integers, not str\n\nYes, thank you for this catch.","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"838a8b7f1ad80cabd8479699b60c962553a4aad1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        tags \u003d {}"},{"line_number":125,"context_line":"        info \u003d payload[\"info\"]"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if info.get(\"db\"):"},{"line_number":128,"context_line":"            # DB calls"},{"line_number":129,"context_line":"            tags[\"db.statement\"] \u003d info[\"db\"][\"statement\"]"},{"line_number":130,"context_line":"            tags[\"db.params\"] \u003d jsonutils.dumps(info[\"db\"][\"params\"])"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_ab9cc669","line":127,"updated":"2018-05-16 13:43:07.000000000","message":"does it make sense to adopt OpenTracing tags convention? \nhttps://github.com/opentracing/specification/blob/master/semantic_conventions.md#standard-span-tags-and-log-fields\n \nand make automatic dict flattening for the rest of attributes?","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"8c2a2da3837197bf5b5b1f471ca9e1f6056a6fd9","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        tags \u003d {}"},{"line_number":125,"context_line":"        info \u003d payload[\"info\"]"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if info.get(\"db\"):"},{"line_number":128,"context_line":"            # DB calls"},{"line_number":129,"context_line":"            tags[\"db.statement\"] \u003d info[\"db\"][\"statement\"]"},{"line_number":130,"context_line":"            tags[\"db.params\"] \u003d jsonutils.dumps(info[\"db\"][\"params\"])"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_8820c34b","line":127,"in_reply_to":"5f7c97a3_ab9cc669","updated":"2018-05-18 06:56:11.000000000","message":"It really depends.\nI\u0027m happy to use dict flattening (because it does not affect our data/information, just some field name), but follow OpenTracing convention may be a good choice too.","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"}],"osprofiler/profiler.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"672756c36ce0d7bd72e1b7e0c92152bff735394d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"def shorten_uuid(uuid_id):"},{"line_number":53,"context_line":"    \"\"\"Convert from uuid4 to 64 bit id for OpenTracing\"\"\""},{"line_number":54,"context_line":"    # FIXME(tovin07): Does anyone have another better idea for this?"},{"line_number":55,"context_line":"    short_id \u003d uuid.UUID(uuid_id).int \u0026 (1 \u003c\u003c 64) - 1"},{"line_number":56,"context_line":"    return short_id"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_e97b2f78","line":55,"updated":"2017-07-17 13:56:13.000000000","message":"would be nice to work with uuid object and not to parse it back to int","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"652446248a1069329a715f88092ae186617da214","unresolved":false,"context_lines":[{"line_number":52,"context_line":"def shorten_uuid(uuid_id):"},{"line_number":53,"context_line":"    \"\"\"Convert from uuid4 to 64 bit id for OpenTracing\"\"\""},{"line_number":54,"context_line":"    # FIXME(tovin07): Does anyone have another better idea for this?"},{"line_number":55,"context_line":"    short_id \u003d uuid.UUID(uuid_id).int \u0026 (1 \u003c\u003c 64) - 1"},{"line_number":56,"context_line":"    return short_id"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_702fed3e","line":55,"in_reply_to":"1f1a1f67_e97b2f78","updated":"2017-07-18 00:59:07.000000000","message":"yes, I hope that too.\nHowever, all current OpenTracing tracer work with 64 bit int for now. That\u0027s sad!","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"672756c36ce0d7bd72e1b7e0c92152bff735394d","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        timestamp \u003d time.time()"},{"line_number":422,"context_line":"        kwargs \u003d {"},{"line_number":423,"context_line":"            \"trace_id\": shorten_uuid(self.get_base_id()),"},{"line_number":424,"context_line":"            \"parent_id\": shorten_uuid(self.get_parent_id()),"},{"line_number":425,"context_line":"            \"span_id\": shorten_uuid(self.get_id()),"},{"line_number":426,"context_line":"            \"operation_name\": self._name[-1],"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_09678bbf","line":423,"updated":"2017-07-17 13:56:13.000000000","message":"finally a right name for a Trace ID!","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"652446248a1069329a715f88092ae186617da214","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        timestamp \u003d time.time()"},{"line_number":422,"context_line":"        kwargs \u003d {"},{"line_number":423,"context_line":"            \"trace_id\": shorten_uuid(self.get_base_id()),"},{"line_number":424,"context_line":"            \"parent_id\": shorten_uuid(self.get_parent_id()),"},{"line_number":425,"context_line":"            \"span_id\": shorten_uuid(self.get_id()),"},{"line_number":426,"context_line":"            \"operation_name\": self._name[-1],"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_b018e51d","line":423,"in_reply_to":"1f1a1f67_09678bbf","updated":"2017-07-18 00:59:07.000000000","message":"yup, and the right name for a span too","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"838a8b7f1ad80cabd8479699b60c962553a4aad1","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        self._name \u003d collections.deque()"},{"line_number":361,"context_line":"        self._host \u003d socket.gethostname()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def get_shorten_id(self, uuid_id):"},{"line_number":364,"context_line":"        \"\"\"Return shorten id of a uuid that will be used in OpenTracing drivers"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :param uuid_id: A string of uuid that was generated by uuidutils"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_6b78ee8e","line":363,"updated":"2018-05-16 13:43:07.000000000","message":"not used except test","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"34cbb0772d6d6df72fb7993d49cb452491ed2ac9","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        self._name \u003d collections.deque()"},{"line_number":361,"context_line":"        self._host \u003d socket.gethostname()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def get_shorten_id(self, uuid_id):"},{"line_number":364,"context_line":"        \"\"\"Return shorten id of a uuid that will be used in OpenTracing drivers"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :param uuid_id: A string of uuid that was generated by uuidutils"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_8d29ccf3","line":363,"in_reply_to":"5f7c97a3_6b78ee8e","updated":"2018-05-17 08:56:56.000000000","message":"please disregard this - the function is used in openstack CLI.","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"8c2a2da3837197bf5b5b1f471ca9e1f6056a6fd9","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        self._name \u003d collections.deque()"},{"line_number":361,"context_line":"        self._host \u003d socket.gethostname()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def get_shorten_id(self, uuid_id):"},{"line_number":364,"context_line":"        \"\"\"Return shorten id of a uuid that will be used in OpenTracing drivers"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :param uuid_id: A string of uuid that was generated by uuidutils"}],"source_content_type":"text/x-python","patch_set":25,"id":"5f7c97a3_08d27335","line":363,"in_reply_to":"5f7c97a3_8d29ccf3","updated":"2018-05-18 06:56:11.000000000","message":"Yep, this method is used by OpenStack CLI.","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"}],"osprofiler/tracers/base.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"672756c36ce0d7bd72e1b7e0c92152bff735394d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            return tracer(*args, **kwargs)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class Tracer(opentracing.Tracer):"},{"line_number":37,"context_line":"    \"\"\"Base Tracer class."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    This class is base class for all tracer that can be used to work with"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_494343b0","line":36,"updated":"2017-07-17 13:56:13.000000000","message":"Shouldn\u0027t the Tracer replace Notifier driver?\n\nCurrent driver is used for 2 things: to send notifications and to generate reports. From pure tracing perspective only notification part is important, the reporting is usually done in special software (like Jaeger). \n\nI would probably try to introduce this new Tracer driver and make it independent from \"old\" Driver (e.g. have separate configuration option, etc.)","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"652446248a1069329a715f88092ae186617da214","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            return tracer(*args, **kwargs)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class Tracer(opentracing.Tracer):"},{"line_number":37,"context_line":"    \"\"\"Base Tracer class."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    This class is base class for all tracer that can be used to work with"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_b0c6a567","line":36,"in_reply_to":"1f1a1f67_494343b0","updated":"2017-07-18 00:59:07.000000000","message":"\u003e Shouldn\u0027t the Tracer replace Notifier driver?\n\nMaybe or maybe not, because they are not the same in all perspectives.\n---\n\u003e Current driver is used for 2 things: to send notifications and to generate reports. From pure tracing perspective only notification part is important, the reporting is usually done in special software (like Jaeger).\n\nTotally agree with that!\n---\n\u003e I would probably try to introduce this new Tracer driver and make it independent from \"old\" Driver (e.g. have separate configuration option, etc.)\n\nYes, actually we have to separate them.","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"672756c36ce0d7bd72e1b7e0c92152bff735394d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1f1a1f67_8475c2cd","line":54,"updated":"2017-07-17 13:56:13.000000000","message":"should inject() and extract() functions also be overridden? \n\ne.g. now we serialize profiler state into RPC context manually (the code is copy-pasted across all projects), but looks like OpenTracing drivers can do the same for us","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"652446248a1069329a715f88092ae186617da214","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1f1a1f67_f0953d41","line":54,"in_reply_to":"1f1a1f67_8475c2cd","updated":"2017-07-18 00:59:07.000000000","message":"Yes, we should.","commit_id":"8d8b72fe1aa85ae54b81ddb72917b0f3b2baf200"}],"test-requirements.txt":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"6d06140a7fe7b06ca708ea7b6b15687c94c3dc06","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# For Jaeger Tracing"},{"line_number":27,"context_line":"jaeger-client\u003e\u003d3.8.0 # Apache-2.0"},{"line_number":28,"context_line":"futures;python_version\u003d\u003d\u00272.7\u0027 # PSF"}],"source_content_type":"text/plain","patch_set":18,"id":"9f6a8fd7_8c178952","line":28,"range":{"start_line":28,"start_character":30,"end_line":28,"end_character":35},"updated":"2018-04-27 00:59:08.000000000","message":"This change from BSD to PSF last year.\nThe patch to update: https://review.openstack.org/#/c/564653/","commit_id":"2568055f08e67584f256b44bbf0659bf5c186299"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"838a8b7f1ad80cabd8479699b60c962553a4aad1","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# For Jaeger Tracing"},{"line_number":27,"context_line":"jaeger-client # Apache-2.0"},{"line_number":28,"context_line":"futures;python_version\u003d\u003d\u00272.7\u0027 or python_version\u003d\u003d\u00272.6\u0027 # PSF"}],"source_content_type":"text/plain","patch_set":25,"id":"5f7c97a3_abbda602","line":28,"updated":"2018-05-16 13:43:07.000000000","message":"why `futures` is needed as dependency?","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"8c2a2da3837197bf5b5b1f471ca9e1f6056a6fd9","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# For Jaeger Tracing"},{"line_number":27,"context_line":"jaeger-client # Apache-2.0"},{"line_number":28,"context_line":"futures;python_version\u003d\u003d\u00272.7\u0027 or python_version\u003d\u003d\u00272.6\u0027 # PSF"}],"source_content_type":"text/plain","patch_set":25,"id":"5f7c97a3_c8b47bf5","line":28,"in_reply_to":"5f7c97a3_abbda602","updated":"2018-05-18 06:56:11.000000000","message":"\u003e why `futures` is needed as dependency?\n\nin my local environment, when I run tox, it will throw exception about this library. Therefore, I add it.\n\n`futures` is required by jaeger-client, but just curious why it is not installed automatic when I run tox.\n\nLet me check it again.","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"07a027fd8cf870331d89606fa2d7472743643ed6","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# For Jaeger Tracing"},{"line_number":27,"context_line":"jaeger-client # Apache-2.0"},{"line_number":28,"context_line":"futures;python_version\u003d\u003d\u00272.7\u0027 or python_version\u003d\u003d\u00272.6\u0027 # PSF"}],"source_content_type":"text/plain","patch_set":25,"id":"5f7c97a3_535340e3","line":28,"in_reply_to":"5f7c97a3_c8b47bf5","updated":"2018-05-18 08:14:23.000000000","message":"yes, `futures` is really needed to use jaeger on Python 2.7","commit_id":"5725f72f9d88e16b84cfbf5ca8a33dd1ac8ba873"}]}
