)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1eb6822e01bf352fc636f862e832d8eb2de9519d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f28530cc_85ae76c2","updated":"2023-10-02 16:10:21.000000000","message":"recheck\n\nhttps://bugs.launchpad.net/swift/+bug/2028175","commit_id":"d82a23c5dbc17fbed230006bd97df7df9b723f87"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5a63c164_911b3235","updated":"2023-10-27 22:21:58.000000000","message":"I think there\u0027s still some things going on in this change that I don\u0027t understand.\n\nBut even with my gaps, I could imagine us trying to build this into a cloud-qa env and tweaking the prometheus collector to try and get a feel for how this is going to go and gather some input from SRE.  Good idea to spike here - let\u0027s figure out next steps.","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"}],"doc/source/metrics/labels.rst":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1197efd4b7c59b3373717c1068fa5b20aa191c62","unresolved":true,"context_lines":[{"line_number":1,"context_line":":orphan:"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"Labeled Metrics"},{"line_number":4,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":6,"id":"b5473c52_f977c15c","line":1,"updated":"2024-01-23 18:54:07.000000000","message":"I should get this into some doc tree.","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":".. warning::"},{"line_number":23,"context_line":"   Enabling labeled metrics will likely cause a dramatic increase in the number"},{"line_number":24,"context_line":"   of distinct metrics time series. Ensure your metrics pipeline is prepared."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Here, we will try to enumerate a number of common labels and their meanings,"},{"line_number":27,"context_line":"which may be used when building graphs or relabeling metrics."}],"source_content_type":"text/x-rst","patch_set":6,"id":"e36e0adc_14780b0d","line":24,"updated":"2023-10-27 22:21:58.000000000","message":"haha!  Are WE prepared?!","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1197efd4b7c59b3373717c1068fa5b20aa191c62","unresolved":true,"context_lines":[{"line_number":43,"context_line":"   ``policy_index`` The storage policy index associated with the metric."},{"line_number":44,"context_line":"   ``device``       The device name associated with the metric. This will"},{"line_number":45,"context_line":"                    likely be most useful if device names are unique"},{"line_number":46,"context_line":"                    throughout the cluster."},{"line_number":47,"context_line":"   \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Note that metrics should *not* be labeled with ``object`` names -- the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ee3eccd2_8a320bef","line":46,"updated":"2024-01-23 18:54:07.000000000","message":"Oh man, this isn\u0027t nearly complete enough -- I thought I at least included `method`...\n\nAnd then I was going to leave a comment about how it should maybe be `http.request.method` to be more in line with something like https://opentelemetry.io/docs/specs/semconv/http/http-metrics/","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":43,"context_line":"   ``policy_index`` The storage policy index associated with the metric."},{"line_number":44,"context_line":"   ``device``       The device name associated with the metric. This will"},{"line_number":45,"context_line":"                    likely be most useful if device names are unique"},{"line_number":46,"context_line":"                    throughout the cluster."},{"line_number":47,"context_line":"   \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Note that metrics should *not* be labeled with ``object`` names -- the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7205328d_a4b2fead","line":46,"updated":"2023-10-27 22:21:58.000000000","message":"We have 10\u0027s of K of devices in our cluster; and 10\u0027s of K of containers - as a product 100M may be a pretty big coefficient for \"all metrics\"","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":49,"context_line":"Note that metrics should *not* be labeled with ``object`` names -- the"},{"line_number":50,"context_line":"cardinality of objects is expected to be so high as to be problematic."},{"line_number":51,"context_line":"Some operators may even need to drop ``container`` labels to keep metric"},{"line_number":52,"context_line":"cardinalities reasonable."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"``proxy-server`` Labels"},{"line_number":55,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"2cb14340_9dba07de","line":52,"updated":"2023-10-27 22:21:58.000000000","message":"as well as device maybe - is that something we do in the collector?","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"}],"swift/common/middleware/proxy_logging.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":350,"context_line":"            stat_type \u003d req.environ.get(\u0027swift.source\u0027)"},{"line_number":351,"context_line":"        return stat_type"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def statsd_metric_name(self, req, status_int, method):"},{"line_number":354,"context_line":"        stat_type \u003d self.get_metric_name_type(req)"},{"line_number":355,"context_line":"        if stat_type is None:"},{"line_number":356,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":6,"id":"693fd269_1f07f521","side":"PARENT","line":353,"updated":"2023-10-27 22:21:58.000000000","message":"this method is un-used","commit_id":"f0f0b0af20340fee790f1db3fd8c25af89921b56"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1197efd4b7c59b3373717c1068fa5b20aa191c62","unresolved":true,"context_lines":[{"line_number":110,"context_line":"                \u0027{transaction_id} {headers} {request_time} {source} \u0027"},{"line_number":111,"context_line":"                \u0027{log_info} {start_time} {end_time} {policy_index}\u0027))"},{"line_number":112,"context_line":"        # The salt is only used in StrAnonymizer. This class requires bytes,"},{"line_number":113,"context_line":"        # convert it now to prevent useless convertion later."},{"line_number":114,"context_line":"        self.anonymization_method \u003d conf.get(\u0027log_anonymization_method\u0027, \u0027md5\u0027)"},{"line_number":115,"context_line":"        self.anonymization_salt \u003d conf.get(\u0027log_anonymization_salt\u0027, \u0027\u0027)"},{"line_number":116,"context_line":"        self.log_hdrs \u003d config_true_value(conf.get("}],"source_content_type":"text/x-python","patch_set":6,"id":"daa20ba2_1d6b64da","line":113,"range":{"start_line":113,"start_character":10,"end_line":113,"end_character":24},"updated":"2024-01-23 18:54:07.000000000","message":"Offtopic -- nope: https://github.com/openstack/swift/blob/2.32.0/swift/common/utils/__init__.py#L577","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1197efd4b7c59b3373717c1068fa5b20aa191c62","unresolved":true,"context_lines":[{"line_number":329,"context_line":"            \u0027status\u0027: status_int,"},{"line_number":330,"context_line":"        }"},{"line_number":331,"context_line":"        if replacements[\u0027account\u0027]:"},{"line_number":332,"context_line":"            labels[\u0027account\u0027] \u003d replacements[\u0027account\u0027]"},{"line_number":333,"context_line":"        if replacements[\u0027container\u0027]:"},{"line_number":334,"context_line":"            labels[\u0027container\u0027] \u003d replacements[\u0027container\u0027]"},{"line_number":335,"context_line":"        if labels[\u0027server_type\u0027] \u003d\u003d \u0027object\u0027 and policy_index is not None and \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"89b85ff2_540187b6","line":332,"range":{"start_line":332,"start_character":32,"end_line":332,"end_character":55},"updated":"2024-01-23 18:54:07.000000000","message":"Passing the `StrAnonymizer` here isn\u0027t actually going to do what I was thinking it would. I *intended* that it should emit the anonymized form if configured for anonymization, but that\u0027s not really how the anonymizer stuff works; it\u0027s configured by default for MD5 with no salt, but the operator needs to update the `log_msg_template` to say `.anonymized` in places.","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c3effacab1376068233f9660173e103c6449736f","unresolved":true,"context_lines":[{"line_number":331,"context_line":"        if replacements[\u0027account\u0027]:"},{"line_number":332,"context_line":"            labels[\u0027account\u0027] \u003d replacements[\u0027account\u0027]"},{"line_number":333,"context_line":"        if replacements[\u0027container\u0027]:"},{"line_number":334,"context_line":"            labels[\u0027container\u0027] \u003d replacements[\u0027container\u0027]"},{"line_number":335,"context_line":"        if labels[\u0027server_type\u0027] \u003d\u003d \u0027object\u0027 and policy_index is not None and \\"},{"line_number":336,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"},{"line_number":337,"context_line":"            labels[\u0027policy_index\u0027] \u003d policy_index"}],"source_content_type":"text/x-python","patch_set":6,"id":"097a6e91_b93c8cb0","line":334,"updated":"2024-01-09 22:19:39.000000000","message":"the cardinality here is scary; maybe make this configurable?","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":334,"context_line":"            labels[\u0027container\u0027] \u003d replacements[\u0027container\u0027]"},{"line_number":335,"context_line":"        if labels[\u0027server_type\u0027] \u003d\u003d \u0027object\u0027 and policy_index is not None and \\"},{"line_number":336,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"},{"line_number":337,"context_line":"            labels[\u0027policy_index\u0027] \u003d policy_index"},{"line_number":338,"context_line":"        if labels[\u0027server_type\u0027] is not None:"},{"line_number":339,"context_line":"            if labels[\u0027server_type\u0027] \u003d\u003d \u0027object\u0027 and \u0027policy_index\u0027 in labels:"},{"line_number":340,"context_line":"                self.access_logger.timing("}],"source_content_type":"text/x-python","patch_set":6,"id":"e9267953_ebf4e9b3","line":337,"updated":"2023-10-27 22:21:58.000000000","message":"here policy_index is just a label; that\u0027s awesome.","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":344,"context_line":"                    legacy_format\u003d["},{"line_number":345,"context_line":"                        \u0027{server_type}.{method}.{status}.timing\u0027,"},{"line_number":346,"context_line":"                        (\u0027{server_type}.policy.{policy_index}.{method}\u0027"},{"line_number":347,"context_line":"                         \u0027.{status}.timing\u0027),"},{"line_number":348,"context_line":"                    ])"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"                xfer_fmts \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"494bdb35_3396be98","line":347,"updated":"2023-10-27 22:21:58.000000000","message":"lol, i did NOT notice that legacy_format takes a list\n\nI think the parens are maybe not needed\n\nalso surprisngly, this new call site in this diff isn\u0027t *that* close to the legacy metric format where you could just \"eyeball it\" and say \"oh yeah this is the same\" - and it won\u0027t be because one is a `\u0027.\u0027.join([])` and the other is a `\u0027.\u0027.join(\u0027{%s}\u0027 % e for e in [])`","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1197efd4b7c59b3373717c1068fa5b20aa191c62","unresolved":true,"context_lines":[{"line_number":353,"context_line":"                     \u0027.{status}.xfer\u0027),"},{"line_number":354,"context_line":"                ]"},{"line_number":355,"context_line":"                self.access_logger.update_stats("},{"line_number":356,"context_line":"                    \u0027swift_proxy_request_body_bytes\u0027,"},{"line_number":357,"context_line":"                    bytes_received,"},{"line_number":358,"context_line":"                    labels\u003dlabels,"},{"line_number":359,"context_line":"                    legacy_format\u003dxfer_fmts)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ee2602e_3d297408","line":356,"range":{"start_line":356,"start_character":41,"end_line":356,"end_character":45},"updated":"2024-01-23 18:54:07.000000000","message":"Maybe better as `swift_proxy_request_size_bytes`? I\u0027m trying to think ahead a little -- I want to add *another* stat that\u0027s like this one, but that\u0027s useful as a real-time-ish counter so I can approximate point-in-time bandwidth. I *think* `swift_proxy_request_body_bytes` makes more sense for that new stat?\n\nNote that *this* stat still seems useful if we look at it as a series of observations for a histogram, similar to what operators should be doing with timings. Then you can see changes over time to the sizes of objects that are getting uploaded.","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":469,"context_line":"            acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":470,"context_line":"                                self.anonymization_salt)"},{"line_number":471,"context_line":"            cont \u003d StrAnonymizer(cont, self.anonymization_method,"},{"line_number":472,"context_line":"                                 self.anonymization_salt)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"            # Log timing information for time-to-first-byte (GET requests only)"},{"line_number":475,"context_line":"            ttfb \u003d 0.0"}],"source_content_type":"text/x-python","patch_set":6,"id":"033ac695_2ec320a1","line":472,"updated":"2023-10-27 22:21:58.000000000","message":"oh that\u0027s neat - good call\n\nI had trouble tracking down self.anonymization_method, it\u0027s not a callable \"method\"","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":484,"context_line":"                if acc:"},{"line_number":485,"context_line":"                    labels[\u0027account\u0027] \u003d acc"},{"line_number":486,"context_line":"                if cont:"},{"line_number":487,"context_line":"                    labels[\u0027container\u0027] \u003d cont"},{"line_number":488,"context_line":"                if labels[\u0027server_type\u0027] \u003d\u003d \u0027object\u0027 and \\"},{"line_number":489,"context_line":"                        policy_index is not None and \\"},{"line_number":490,"context_line":"                        POLICIES.get_by_index(policy_index) is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"bb2ee347_49e508e1","line":487,"updated":"2023-10-27 22:21:58.000000000","message":"N.B. the even tho `str(None) \u003d\u003d \u0027None\u0027`\n\n    \u003e\u003e\u003e StrAnonymizer(None, \u0027md5\u0027, \u0027salt\u0027)\n    \u0027\u0027\n\nso the Falsy check here is legit.\n\n... wait?  where do we use .anonymized?\n\n    \u003e\u003e\u003e StrAnonymizer(\u0027a-super-secret-account\u0027, \u0027md5\u0027, \u0027salt\u0027)\n    \u0027a-super-secret-account\u0027\n    \u003e\u003e\u003e StrAnonymizer(\u0027a-super-secret-account\u0027, \u0027md5\u0027, \u0027salt\u0027).anonymized\n    \u0027{SMD5}ab693fe94a95eb54777b40c4c10947b4\u0027","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":505,"context_line":"                        legacy_format \u003d (\u0027{server_type}.policy.{policy_index}.\u0027"},{"line_number":506,"context_line":"                                         \u0027{method}.{status}.first-byte.timing\u0027)"},{"line_number":507,"context_line":"                        self.access_logger.timing("},{"line_number":508,"context_line":"                            \u0027swift_proxy_per_policy_ttfb\u0027,"},{"line_number":509,"context_line":"                            ttfb * 1000,"},{"line_number":510,"context_line":"                            labels\u003dlabels,"},{"line_number":511,"context_line":"                            legacy_format\u003dlegacy_format)"}],"source_content_type":"text/x-python","patch_set":6,"id":"be9f53d7_3ce74d5b","line":508,"updated":"2023-10-27 22:21:58.000000000","message":"why would we habe a separate \"per_policy\" ttfb - that\u0027s what we have labels for!?","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"}],"test/unit/common/middleware/test_proxy_logging.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":255,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"},{"line_number":256,"context_line":"                                             4 + 7),"},{"line_number":257,"context_line":"                                            (\u0027object.policy.0.GET.321.xfer\u0027,"},{"line_number":258,"context_line":"                                             4 + 7)],"},{"line_number":259,"context_line":"                                           app)"},{"line_number":260,"context_line":"                else:"},{"line_number":261,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"}],"source_content_type":"text/x-python","patch_set":6,"id":"6b5ae26f_d802e114","side":"PARENT","line":258,"updated":"2023-10-27 22:21:58.000000000","message":"so this was asserting on the aggregation","commit_id":"f0f0b0af20340fee790f1db3fd8c25af89921b56"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":163,"context_line":"        if isinstance(legacy_format, str):"},{"line_number":164,"context_line":"            legacy_format \u003d [legacy_format]"},{"line_number":165,"context_line":"        for fmt_str in legacy_format:"},{"line_number":166,"context_line":"            yield fmt_str.format(**labels), usc[0][1], usc[1]"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":169,"context_line":"        got_metrics_values_and_kwargs \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"a7ecd846_396cf99e","line":166,"updated":"2023-10-27 22:21:58.000000000","message":"this sort of feels like something that would belong on the FakeStatsdClient?\n\n    self.assertEqual([(\u0027metric.foo\u0027, 3)], self.logger.statsd_client.get_legacy_stats()\n    self.assertEqual([(\u0027metric#foo\u0027, 3)], self.logger.statsd_client.get_stats())\n        \nOr something?  Maybe I\u0027m missing it.","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":168,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":169,"context_line":"        got_metrics_values_and_kwargs \u003d ["},{"line_number":170,"context_line":"            m for usc in app.access_logger.statsd_client.calls[\u0027update_stats\u0027]"},{"line_number":171,"context_line":"            for m in self.legacyMetricsFromCall(usc)]"},{"line_number":172,"context_line":"        exp_metrics_values_and_kwargs \u003d [(emv[0], emv[1], {})"},{"line_number":173,"context_line":"                                         for emv in exp_metrics_and_values]"},{"line_number":174,"context_line":"        self.assertEqual(sorted(got_metrics_values_and_kwargs),"}],"source_content_type":"text/x-python","patch_set":6,"id":"231d5fa6_56236f1b","line":171,"updated":"2023-10-27 22:21:58.000000000","message":"i\u0027m not normally a fan of nested comprehension\n\nfor update_stats_calls in statsd_client.calls:\n    for m in legacy_metric_from_call(update_stats_call):\n        metric_and_values.append(m)\n        \n... again, there migth be a re-usable form worth building into FakeStatsdClient","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":178,"context_line":"            self.assertIn("},{"line_number":179,"context_line":"                ((\u0027proxy-server.%s:%s|c\u0027 % (metric, value)).encode(),"},{"line_number":180,"context_line":"                 (\u0027host\u0027, 8125)),"},{"line_number":181,"context_line":"                app.access_logger.statsd_client.sendto_calls)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_logger_statsd_prefix(self):"},{"line_number":184,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":6,"id":"e77a4c4d_6423ad23","line":181,"updated":"2023-10-27 22:21:58.000000000","message":"so this method only works with `label_mode \u003d \u0027disabled\u0027` - i guess that is what the legacymetricsFromCall is for... or something...","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":271,"context_line":"                        (\u0027%s.GET.321.xfer\u0027 % exp_type, 4),"},{"line_number":272,"context_line":"                        (\u0027%s.GET.321.xfer\u0027 % exp_type, 7),"},{"line_number":273,"context_line":"                        (\u0027object.policy.0.GET.321.xfer\u0027, 4),"},{"line_number":274,"context_line":"                        (\u0027object.policy.0.GET.321.xfer\u0027, 7),"},{"line_number":275,"context_line":"                    ], app)"},{"line_number":276,"context_line":"                else:"},{"line_number":277,"context_line":"                    self.assertUpdateStats(["}],"source_content_type":"text/x-python","patch_set":6,"id":"68e88f1c_d5e12aeb","line":274,"updated":"2023-10-27 22:21:58.000000000","message":"and this is asserting in the calls?\n\nOr is this was you were talking about the the in/out bytes being combined?  Are they seperate here!?  The metric names still look the same.","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":397,"context_line":"            \u0027/v1/a/c/o/p/\u0027: \u0027object\u0027,"},{"line_number":398,"context_line":"            \u0027/v1/a/c/o/p/p2\u0027: \u0027object\u0027,"},{"line_number":399,"context_line":"        }"},{"line_number":400,"context_line":"        self.logger.statsd_client.label_mode \u003d \u0027signalfx\u0027"},{"line_number":401,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":402,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":403,"context_line":"                # GET"}],"source_content_type":"text/x-python","patch_set":6,"id":"dcd17570_09839e0b","line":400,"updated":"2023-10-27 22:21:58.000000000","message":"is signalfx our favorite?","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":422,"context_line":"                    ])"},{"line_number":423,"context_line":"                elif exp_type \u003d\u003d \u0027container\u0027:"},{"line_number":424,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":425,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":426,"context_line":"                        b\u0027container\u003dc\u0027,"},{"line_number":427,"context_line":"                        b\u0027method\u003dGET\u0027,"},{"line_number":428,"context_line":"                        b\u0027server_type\u003dcontainer\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"be82b0d2_015aaf64","line":425,"updated":"2023-10-27 22:21:58.000000000","message":"was I wrong to expect this to be anonymized unless we do some mocking?","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7a70bbe88d93fe871f43bf6ed5d39b58ca0c11cb","unresolved":true,"context_lines":[{"line_number":438,"context_line":"                        b\u0027status\u003d321\u0027,"},{"line_number":439,"context_line":"                    ])"},{"line_number":440,"context_line":"                # Note that in a labeled world, object only gets the one stat,"},{"line_number":441,"context_line":"                # which includes policy info"},{"line_number":442,"context_line":"                self.assertEqual(["},{"line_number":443,"context_line":"                    msg for msg, addr in"},{"line_number":444,"context_line":"                    self.logger.statsd_client.sendto_calls"}],"source_content_type":"text/x-python","patch_set":6,"id":"624b1ea8_c2c9ff27","line":441,"updated":"2023-10-27 22:21:58.000000000","message":"yay!","commit_id":"1e6f86951a30320a944d6b3bd327e4a85a6aa68c"}]}
