)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"878c5086_52b48853","updated":"2025-06-10 17:46:37.000000000","message":"seems like a reasonably faithful translation of the new coop-token metrics into the modern labeled format; seems to have some advantage over adding new legacy metrics.\n\nI don\u0027t think the abstraction is right for passing op_type \u0026 account/container anymore; it\u0027s starting to look like concrete classes should just pass in w/e extra labels they want to their CooperativeCachePopulator base class and get the new `event:backend_req` (or `event:cache_served`) metrics w/ those \"extra labels\"\n\nI like how phrasing the new counters as labeled metrics is forcing us to think more about what metrics we\u0027re actually emitting - is there a metric for every response served from a CooperativeCachePopulator, and sometimes those are from a backend request and sometimes they\u0027re from cache?  So why do we still sometimes emit a second metric for `lack_retires` - should that be it\u0027s own *event* or just a label on an event that was served from a backend_resp?\n\nI think we\u0027re starting to see some gaps in the labeled metrics testing helpers - I think we should close those sooner than later; maybe in a pre-req patch.","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c4bbb6d6_5ec4ce82","updated":"2025-06-17 22:17:22.000000000","message":"\u003e I like how phrasing the new counters as labeled metrics is forcing us to think more about what metrics we\u0027re actually emitting\n\nI love labeled metrics so much - it makes it so much more clear what\u0027s actually happening and the relevant context we should report.  We\u0027re so close to a single counter for every call to `fetch_data` - I think we should push harder to deliver *better* metrics rather than \"just\" a \"faithful translation of the existing legacy formatted metrics\"\n\nI wonder what @jhuo@nvidia.com thinks of this new/improved/streamlined telemetry?","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dc63ac186e7ae737357845da93f0620db22363ac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"05392e9e_93bfcdbd","updated":"2025-07-15 19:13:28.000000000","message":"The new labeled metrics support looks great, thanks for adding it!\n\n``-1`` only because I think it\u0027s missing the label ``labels[\u0027token\u0027]`` in some places.","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"9c46c6f5af744c003e0c13a54c2e730423531fc9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"953b408b_52508554","updated":"2025-06-25 15:16:49.000000000","message":"recheck","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"0b4ae2a1222134d0a9dc0361f220bf7419c92a96","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"0eac690d_a2ee52b7","updated":"2025-07-22 22:09:38.000000000","message":"LGTM, will get it squashed after the password failure is gone.","commit_id":"6933fae4981fc12a5238666b2738ddeb43a9de9a"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ef5dc2cfb2a37205cb4dbf53186c900813b7521a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f95b3650_7371a294","updated":"2025-07-23 01:26:09.000000000","message":"I got this patch squashed, thanks!","commit_id":"c7d0b7ccb5019cf6f6d81998e2b3eb8b84aa9895"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":1554,"context_line":"                 cache_key, cache_ttl, avg_backend_fetch_time, num_tokens\u003d3,"},{"line_number":1555,"context_line":"                 account\u003dNone, container\u003dNone):"},{"line_number":1556,"context_line":"        self._logger \u003d logger"},{"line_number":1557,"context_line":"        self._statsd \u003d statsd"},{"line_number":1558,"context_line":"        self.labels \u003d {"},{"line_number":1559,"context_line":"            \u0027resource\u0027: \u0027shard_updating\u0027,"},{"line_number":1560,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":1,"id":"d5e938d0_ef91844d","line":1557,"updated":"2025-06-10 17:46:37.000000000","message":"I bet we eventually end up having a name/interface for an object that has logger and statsd attributes; so you can just pass an `app` instead of a `(app.logger, app.statsd)`","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":1554,"context_line":"                 cache_key, cache_ttl, avg_backend_fetch_time, num_tokens\u003d3,"},{"line_number":1555,"context_line":"                 account\u003dNone, container\u003dNone):"},{"line_number":1556,"context_line":"        self._logger \u003d logger"},{"line_number":1557,"context_line":"        self._statsd \u003d statsd"},{"line_number":1558,"context_line":"        self.labels \u003d {"},{"line_number":1559,"context_line":"            \u0027resource\u0027: \u0027shard_updating\u0027,"},{"line_number":1560,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":1,"id":"89e99470_f2575397","line":1557,"in_reply_to":"d5e938d0_ef91844d","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":1557,"context_line":"        self._statsd \u003d statsd"},{"line_number":1558,"context_line":"        self.labels \u003d {"},{"line_number":1559,"context_line":"            \u0027resource\u0027: \u0027shard_updating\u0027,"},{"line_number":1560,"context_line":"        }"},{"line_number":1561,"context_line":"        if account is not None:"},{"line_number":1562,"context_line":"            self.labels[\u0027account\u0027] \u003d account"},{"line_number":1563,"context_line":"        if container is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d17ec1cc_dad8f9d3","line":1560,"updated":"2025-06-10 17:46:37.000000000","message":"seems kind of specific for a Generic sounding class?","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":1557,"context_line":"        self._statsd \u003d statsd"},{"line_number":1558,"context_line":"        self.labels \u003d {"},{"line_number":1559,"context_line":"            \u0027resource\u0027: \u0027shard_updating\u0027,"},{"line_number":1560,"context_line":"        }"},{"line_number":1561,"context_line":"        if account is not None:"},{"line_number":1562,"context_line":"            self.labels[\u0027account\u0027] \u003d account"},{"line_number":1563,"context_line":"        if container is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d4e65f39_84dba270","line":1560,"in_reply_to":"d17ec1cc_dad8f9d3","updated":"2025-06-17 15:23:33.000000000","message":"indeed, changed to labels parameter","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":1561,"context_line":"        if account is not None:"},{"line_number":1562,"context_line":"            self.labels[\u0027account\u0027] \u003d account"},{"line_number":1563,"context_line":"        if container is not None:"},{"line_number":1564,"context_line":"            self.labels[\u0027container\u0027] \u003d container"},{"line_number":1565,"context_line":"        self._op_type \u003d op_type"},{"line_number":1566,"context_line":"        self._infocache \u003d infocache"},{"line_number":1567,"context_line":"        self._memcache \u003d memcache"}],"source_content_type":"text/x-python","patch_set":1,"id":"3939c227_a89d3973","line":1564,"updated":"2025-06-10 17:46:37.000000000","message":"maybe just pass in labels?","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"        if account is not None:"},{"line_number":1562,"context_line":"            self.labels[\u0027account\u0027] \u003d account"},{"line_number":1563,"context_line":"        if container is not None:"},{"line_number":1564,"context_line":"            self.labels[\u0027container\u0027] \u003d container"},{"line_number":1565,"context_line":"        self._op_type \u003d op_type"},{"line_number":1566,"context_line":"        self._infocache \u003d infocache"},{"line_number":1567,"context_line":"        self._memcache \u003d memcache"}],"source_content_type":"text/x-python","patch_set":1,"id":"e68f888b_8be5a570","line":1564,"in_reply_to":"3939c227_a89d3973","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":1562,"context_line":"            self.labels[\u0027account\u0027] \u003d account"},{"line_number":1563,"context_line":"        if container is not None:"},{"line_number":1564,"context_line":"            self.labels[\u0027container\u0027] \u003d container"},{"line_number":1565,"context_line":"        self._op_type \u003d op_type"},{"line_number":1566,"context_line":"        self._infocache \u003d infocache"},{"line_number":1567,"context_line":"        self._memcache \u003d memcache"},{"line_number":1568,"context_line":"        self._cache_key \u003d cache_key"}],"source_content_type":"text/x-python","patch_set":1,"id":"41a0ea4e_0d172a46","line":1565,"updated":"2025-06-10 17:46:37.000000000","message":"maybe this should be a label as well","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":1562,"context_line":"            self.labels[\u0027account\u0027] \u003d account"},{"line_number":1563,"context_line":"        if container is not None:"},{"line_number":1564,"context_line":"            self.labels[\u0027container\u0027] \u003d container"},{"line_number":1565,"context_line":"        self._op_type \u003d op_type"},{"line_number":1566,"context_line":"        self._infocache \u003d infocache"},{"line_number":1567,"context_line":"        self._memcache \u003d memcache"},{"line_number":1568,"context_line":"        self._cache_key \u003d cache_key"}],"source_content_type":"text/x-python","patch_set":1,"id":"10bb61da_224fdfb6","line":1565,"in_reply_to":"41a0ea4e_0d172a46","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":1552,"context_line":"                 cache_key, cache_ttl, avg_backend_fetch_time, num_tokens\u003d3,"},{"line_number":1553,"context_line":"                 labels\u003dNone):"},{"line_number":1554,"context_line":"        self._logger \u003d app.logger"},{"line_number":1555,"context_line":"        self._statsd \u003d app.statsd"},{"line_number":1556,"context_line":"        self._labels \u003d labels"},{"line_number":1557,"context_line":"        self._infocache \u003d infocache"},{"line_number":1558,"context_line":"        self._memcache \u003d memcache"}],"source_content_type":"text/x-python","patch_set":2,"id":"8128bbc3_09e19bc1","line":1555,"updated":"2025-06-17 22:17:22.000000000","message":"I personally like that this is an AttributeError if your app hasn\u0027t been rigged up for labeled metrics.  Create the future you want to see!","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":1552,"context_line":"                 cache_key, cache_ttl, avg_backend_fetch_time, num_tokens\u003d3,"},{"line_number":1553,"context_line":"                 labels\u003dNone):"},{"line_number":1554,"context_line":"        self._logger \u003d app.logger"},{"line_number":1555,"context_line":"        self._statsd \u003d app.statsd"},{"line_number":1556,"context_line":"        self._labels \u003d labels"},{"line_number":1557,"context_line":"        self._infocache \u003d infocache"},{"line_number":1558,"context_line":"        self._memcache \u003d memcache"}],"source_content_type":"text/x-python","patch_set":2,"id":"b0e6d7d0_0fcaf14b","line":1555,"in_reply_to":"8128bbc3_09e19bc1","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":1685,"context_line":"                \u0027token\u0027: \u0027token_disabled\u0027,"},{"line_number":1686,"context_line":"                \u0027status\u0027: self.backend_resp.status_int,"},{"line_number":1687,"context_line":"            }"},{"line_number":1688,"context_line":"            self._statsd.increment(\u0027swift_token\u0027, labels\u003dlabels)"},{"line_number":1689,"context_line":""},{"line_number":1690,"context_line":"            return data"},{"line_number":1691,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"4e2e571d_bfcd2737","line":1688,"updated":"2025-06-17 22:17:22.000000000","message":"... well except here - this is obviously a guard return so we\u0027d want to keep this increment here.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"                \u0027token\u0027: \u0027token_disabled\u0027,"},{"line_number":1686,"context_line":"                \u0027status\u0027: self.backend_resp.status_int,"},{"line_number":1687,"context_line":"            }"},{"line_number":1688,"context_line":"            self._statsd.increment(\u0027swift_token\u0027, labels\u003dlabels)"},{"line_number":1689,"context_line":""},{"line_number":1690,"context_line":"            return data"},{"line_number":1691,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"a3497756_bbf05c91","line":1688,"in_reply_to":"4e2e571d_bfcd2737","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":1699,"context_line":"        req_served_from_cache \u003d False"},{"line_number":1700,"context_line":"        if not total_requests:"},{"line_number":1701,"context_line":"            # Couldn\u0027t connect to the memcache to increment the token key"},{"line_number":1702,"context_line":"            data \u003d self._query_backend_and_set_cache()"},{"line_number":1703,"context_line":"        elif total_requests \u003c\u003d self._num_tokens:"},{"line_number":1704,"context_line":"            # Acquired a cooperative token, go fetching data from backend and"},{"line_number":1705,"context_line":"            # set the data in memcache."}],"source_content_type":"text/x-python","patch_set":2,"id":"901ed6af_5ce5fe11","line":1702,"updated":"2025-06-17 22:17:22.000000000","message":"I guess this ends up being a `no_token` case after the fact - I don\u0027t know if \"can\u0027t incr token counter\" is a common enough failure mode to differentiate it from the other `no_token` situations (like timeout waiting for memcache to populate) but it seems like it\u0027d be kind of cheap to make a `token\u003dincr_error` label or just add a `set_cache_state\u003d...` label.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":1699,"context_line":"        req_served_from_cache \u003d False"},{"line_number":1700,"context_line":"        if not total_requests:"},{"line_number":1701,"context_line":"            # Couldn\u0027t connect to the memcache to increment the token key"},{"line_number":1702,"context_line":"            data \u003d self._query_backend_and_set_cache()"},{"line_number":1703,"context_line":"        elif total_requests \u003c\u003d self._num_tokens:"},{"line_number":1704,"context_line":"            # Acquired a cooperative token, go fetching data from backend and"},{"line_number":1705,"context_line":"            # set the data in memcache."}],"source_content_type":"text/x-python","patch_set":2,"id":"ce95b7f5_b7836555","line":1702,"in_reply_to":"901ed6af_5ce5fe11","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":1708,"context_line":"            labels \u003d {"},{"line_number":1709,"context_line":"                **self._labels,"},{"line_number":1710,"context_line":"                \u0027event\u0027: \u0027backend_reqs\u0027,"},{"line_number":1711,"context_line":"                \u0027token\u0027: \u0027with_token\u0027,"},{"line_number":1712,"context_line":"                \u0027status\u0027: self.backend_resp.status_int,"},{"line_number":1713,"context_line":"            }"},{"line_number":1714,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a933aa9_f547a756","line":1711,"updated":"2025-06-17 22:17:22.000000000","message":"maybe the token label should just always be:\n\n```\n\u0027token\u0027: \u0027with_token\u0027 if self.token_acquired else \u0027no_token\u0027\n```","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":1708,"context_line":"            labels \u003d {"},{"line_number":1709,"context_line":"                **self._labels,"},{"line_number":1710,"context_line":"                \u0027event\u0027: \u0027backend_reqs\u0027,"},{"line_number":1711,"context_line":"                \u0027token\u0027: \u0027with_token\u0027,"},{"line_number":1712,"context_line":"                \u0027status\u0027: self.backend_resp.status_int,"},{"line_number":1713,"context_line":"            }"},{"line_number":1714,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"09f5ab4f_5db494af","line":1711,"in_reply_to":"5a933aa9_f547a756","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":1719,"context_line":"                # memcache set successful, it can remove all cooperative tokens"},{"line_number":1720,"context_line":"                #  of this token session."},{"line_number":1721,"context_line":"                self._memcache.delete(self._token_key)"},{"line_number":1722,"context_line":"                labels[\u0027event\u0027] \u003d \u0027done_token\u0027"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"            self._statsd.increment(\u0027swift_token\u0027, labels\u003dlabels)"},{"line_number":1725,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f63c34c_b331d2e0","line":1722,"updated":"2025-06-17 22:17:22.000000000","message":"I don\u0027t know if `event\u003ddone_token` is the right affordance here, I think the `status` label should go with an `event\u003dbackend_req` - I feel like this is an additional annotation that says \"and we set memcache and cleared the token counter\"\n\nmaybe just an orthogonal label like `set_cache_state\u003d...` where the happy path is `set_cache_state\u003dset` which indicates memcache was populated and the token was cleanly closed.\n\nIf we see a bunch of `event\u003dbackend_req` with `set_cache_state\u003derror` I think that\u0027s more obviously a problem than a bunch of `token\u003dwith_token` with `event\u003dbackend_reqs` instead of `event\u003ddone_token`.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":1719,"context_line":"                # memcache set successful, it can remove all cooperative tokens"},{"line_number":1720,"context_line":"                #  of this token session."},{"line_number":1721,"context_line":"                self._memcache.delete(self._token_key)"},{"line_number":1722,"context_line":"                labels[\u0027event\u0027] \u003d \u0027done_token\u0027"},{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"            self._statsd.increment(\u0027swift_token\u0027, labels\u003dlabels)"},{"line_number":1725,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ade374ab_4bc92300","line":1722,"in_reply_to":"7f63c34c_b331d2e0","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":1743,"context_line":""},{"line_number":1744,"context_line":"        if not self.token_acquired and not req_served_from_cache:"},{"line_number":1745,"context_line":"            # Total number of requests equals to \u0027cache_served\u0027 plus"},{"line_number":1746,"context_line":"            # \u0027backend_reqs.with_token\u0027 and \u0027backend_reqs.no_token\u0027."},{"line_number":1747,"context_line":"            labels \u003d {"},{"line_number":1748,"context_line":"                **self._labels,"},{"line_number":1749,"context_line":"                \u0027event\u0027: \u0027backend_reqs\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"abdd1ad9_6714c658","line":1746,"updated":"2025-06-17 22:17:22.000000000","message":"I\u0027m not sure it\u0027s helpful for comments to still reference the legacy format metrics - plus what about `done_token.with_token`?","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":1743,"context_line":""},{"line_number":1744,"context_line":"        if not self.token_acquired and not req_served_from_cache:"},{"line_number":1745,"context_line":"            # Total number of requests equals to \u0027cache_served\u0027 plus"},{"line_number":1746,"context_line":"            # \u0027backend_reqs.with_token\u0027 and \u0027backend_reqs.no_token\u0027."},{"line_number":1747,"context_line":"            labels \u003d {"},{"line_number":1748,"context_line":"                **self._labels,"},{"line_number":1749,"context_line":"                \u0027event\u0027: \u0027backend_reqs\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"97a38e66_7bf5595e","line":1746,"in_reply_to":"abdd1ad9_6714c658","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":1751,"context_line":"                \u0027status\u0027: self.backend_resp.status_int,"},{"line_number":1752,"context_line":"            }"},{"line_number":1753,"context_line":"            self._statsd.increment(\u0027swift_token\u0027, labels\u003dlabels)"},{"line_number":1754,"context_line":""},{"line_number":1755,"context_line":"        return data"},{"line_number":1756,"context_line":""},{"line_number":1757,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"91d57eca_665592fa","line":1754,"updated":"2025-06-17 22:17:22.000000000","message":"I wonder what would happen if you tried to have a single `self._statsd.increment` call at the bottom of this method right before we return `data` so it\u0027s obvious that only one stat ever gets emitted for each call to `fetch_data` and the only variable is what labels are associated with the `swift_token` counter?","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":1751,"context_line":"                \u0027status\u0027: self.backend_resp.status_int,"},{"line_number":1752,"context_line":"            }"},{"line_number":1753,"context_line":"            self._statsd.increment(\u0027swift_token\u0027, labels\u003dlabels)"},{"line_number":1754,"context_line":""},{"line_number":1755,"context_line":"        return data"},{"line_number":1756,"context_line":""},{"line_number":1757,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8fd091d1_b0c9929e","line":1754,"in_reply_to":"91d57eca_665592fa","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dc63ac186e7ae737357845da93f0620db22363ac","unresolved":true,"context_lines":[{"line_number":1550,"context_line":""},{"line_number":1551,"context_line":"    def __init__(self, app, infocache, memcache,"},{"line_number":1552,"context_line":"                 cache_key, cache_ttl, avg_backend_fetch_time, num_tokens\u003d3,"},{"line_number":1553,"context_line":"                 labels\u003dNone):"},{"line_number":1554,"context_line":"        self._logger \u003d app.logger"},{"line_number":1555,"context_line":"        self._statsd \u003d app.statsd"},{"line_number":1556,"context_line":"        self._labels \u003d labels or {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"86ccdb89_2a7c486b","line":1553,"updated":"2025-07-15 19:13:28.000000000","message":"to add docstring for the new parameter ``labels``","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4efc58f281a2087bbd953a87bf961f6ef0fba390","unresolved":false,"context_lines":[{"line_number":1550,"context_line":""},{"line_number":1551,"context_line":"    def __init__(self, app, infocache, memcache,"},{"line_number":1552,"context_line":"                 cache_key, cache_ttl, avg_backend_fetch_time, num_tokens\u003d3,"},{"line_number":1553,"context_line":"                 labels\u003dNone):"},{"line_number":1554,"context_line":"        self._logger \u003d app.logger"},{"line_number":1555,"context_line":"        self._statsd \u003d app.statsd"},{"line_number":1556,"context_line":"        self._labels \u003d labels or {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"a3064d0b_8ff9c668","line":1553,"in_reply_to":"86ccdb89_2a7c486b","updated":"2025-07-22 19:59:54.000000000","message":"Acknowledged","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dc63ac186e7ae737357845da93f0620db22363ac","unresolved":true,"context_lines":[{"line_number":1694,"context_line":"            self.set_cache_state \u003d \u0027inc_error\u0027"},{"line_number":1695,"context_line":""},{"line_number":1696,"context_line":"        req_served_from_cache \u003d False"},{"line_number":1697,"context_line":"        labels \u003d {"},{"line_number":1698,"context_line":"            **self._labels,"},{"line_number":1699,"context_line":"        }"},{"line_number":1700,"context_line":"        if not total_requests:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ce403ca_1e708886","line":1697,"updated":"2025-07-15 19:13:28.000000000","message":"how about moving this initialization of ``labels`` to be after L1675? \nthen L1679 to L1684 will just be\n```\n            labels[\u0027event\u0027] \u003d \u0027backend_reqs\u0027\n            labels[\u0027token\u0027] \u003d \u0027token_disabled\u0027\n            labels[\u0027status\u0027] \u003d self.backend_resp.status_int\n```","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4efc58f281a2087bbd953a87bf961f6ef0fba390","unresolved":false,"context_lines":[{"line_number":1694,"context_line":"            self.set_cache_state \u003d \u0027inc_error\u0027"},{"line_number":1695,"context_line":""},{"line_number":1696,"context_line":"        req_served_from_cache \u003d False"},{"line_number":1697,"context_line":"        labels \u003d {"},{"line_number":1698,"context_line":"            **self._labels,"},{"line_number":1699,"context_line":"        }"},{"line_number":1700,"context_line":"        if not total_requests:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9e199c74_6f11f5d1","line":1697,"in_reply_to":"9ce403ca_1e708886","updated":"2025-07-22 19:59:54.000000000","message":"Acknowledged","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dc63ac186e7ae737357845da93f0620db22363ac","unresolved":true,"context_lines":[{"line_number":1707,"context_line":"            data \u003d self._query_backend_and_set_cache()"},{"line_number":1708,"context_line":"            labels[\u0027event\u0027] \u003d \u0027backend_reqs\u0027"},{"line_number":1709,"context_line":"            labels[\u0027status\u0027] \u003d self.backend_resp.status_int"},{"line_number":1710,"context_line":""},{"line_number":1711,"context_line":"            if self.set_cache_state \u003d\u003d \u0027set\u0027:"},{"line_number":1712,"context_line":"                # Since the successful finish of one whole cooperative token"},{"line_number":1713,"context_line":"                # session only depends on a single successful request. So when"}],"source_content_type":"text/x-python","patch_set":3,"id":"d6af0f9b_b21d9c84","line":1710,"updated":"2025-07-15 19:13:28.000000000","message":"do we need to add below label? some backend requests were issued with token, and some backend requests were issued without token, the original stats have ``with_token`` to indicate this.\n```\n           labels[\u0027token\u0027] \u003d \u0027with_token\u0027 or just \u0027used\u0027\n```","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"04cb1df06b3915a880813d07710004320b8aad39","unresolved":false,"context_lines":[{"line_number":1707,"context_line":"            data \u003d self._query_backend_and_set_cache()"},{"line_number":1708,"context_line":"            labels[\u0027event\u0027] \u003d \u0027backend_reqs\u0027"},{"line_number":1709,"context_line":"            labels[\u0027status\u0027] \u003d self.backend_resp.status_int"},{"line_number":1710,"context_line":""},{"line_number":1711,"context_line":"            if self.set_cache_state \u003d\u003d \u0027set\u0027:"},{"line_number":1712,"context_line":"                # Since the successful finish of one whole cooperative token"},{"line_number":1713,"context_line":"                # session only depends on a single successful request. So when"}],"source_content_type":"text/x-python","patch_set":3,"id":"8d7ce341_df725cb0","line":1710,"in_reply_to":"d6af0f9b_b21d9c84","updated":"2025-07-22 17:30:51.000000000","message":"it\u0027s added in line 1740","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dc63ac186e7ae737357845da93f0620db22363ac","unresolved":true,"context_lines":[{"line_number":1715,"context_line":"                # memcache set successful, it can remove all cooperative tokens"},{"line_number":1716,"context_line":"                #  of this token session."},{"line_number":1717,"context_line":"                self._memcache.delete(self._token_key)"},{"line_number":1718,"context_line":""},{"line_number":1719,"context_line":"        else:"},{"line_number":1720,"context_line":"            # No token acquired, it means that there are requests in-flight"},{"line_number":1721,"context_line":"            # which will fetch data form the backend servers and update them in"}],"source_content_type":"text/x-python","patch_set":3,"id":"7d166f5b_d1811bd6","line":1718,"updated":"2025-07-15 19:13:28.000000000","message":"``\u0027token.%s.done_token_reqs\u0027 % self._op_type`` is removed, it\u0027s used to indicate the cache set is successful and cache key was deleted. should we also add a new label\n\n```\n    labels[\u0027token\u0027] \u003d \u0027done\u0027  # reuse the same label and update it from \u0027used\u0027 to \u0027done\u0027\n```","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"04cb1df06b3915a880813d07710004320b8aad39","unresolved":false,"context_lines":[{"line_number":1715,"context_line":"                # memcache set successful, it can remove all cooperative tokens"},{"line_number":1716,"context_line":"                #  of this token session."},{"line_number":1717,"context_line":"                self._memcache.delete(self._token_key)"},{"line_number":1718,"context_line":""},{"line_number":1719,"context_line":"        else:"},{"line_number":1720,"context_line":"            # No token acquired, it means that there are requests in-flight"},{"line_number":1721,"context_line":"            # which will fetch data form the backend servers and update them in"}],"source_content_type":"text/x-python","patch_set":3,"id":"86c71ccc_b6032ea5","line":1718,"in_reply_to":"7d166f5b_d1811bd6","updated":"2025-07-22 17:30:51.000000000","message":"\u0027done\u0027 will be ``labels[\u0027token\u0027] \u003d+ \u0027with_token\u0027`` \u0026\u0026 `set_cache_state \u003d\u003d set```","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dc63ac186e7ae737357845da93f0620db22363ac","unresolved":true,"context_lines":[{"line_number":1734,"context_line":"        if not self.token_acquired and not req_served_from_cache:"},{"line_number":1735,"context_line":"            # Total number of requests equals to \u0027cache_served\u0027 plus"},{"line_number":1736,"context_line":"            # \u0027backend_reqs\u0027 \u0027with_token\u0027 and \u0027backend_reqs\u0027 \u0027no_token\u0027."},{"line_number":1737,"context_line":"            labels[\u0027event\u0027] \u003d \u0027backend_reqs\u0027"},{"line_number":1738,"context_line":"            labels[\u0027status\u0027] \u003d self.backend_resp.status_int"},{"line_number":1739,"context_line":""},{"line_number":1740,"context_line":"        labels[\u0027token\u0027] \u003d \u0027with_token\u0027 if self.token_acquired else \u0027no_token\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7e08e246_c7d00a33","line":1737,"updated":"2025-07-15 19:13:28.000000000","message":"do we need to add below label?\n```\n           labels[\u0027token\u0027] \u003d \u0027no_token\u0027 or just \u0027no\u0027\n```","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"04cb1df06b3915a880813d07710004320b8aad39","unresolved":false,"context_lines":[{"line_number":1734,"context_line":"        if not self.token_acquired and not req_served_from_cache:"},{"line_number":1735,"context_line":"            # Total number of requests equals to \u0027cache_served\u0027 plus"},{"line_number":1736,"context_line":"            # \u0027backend_reqs\u0027 \u0027with_token\u0027 and \u0027backend_reqs\u0027 \u0027no_token\u0027."},{"line_number":1737,"context_line":"            labels[\u0027event\u0027] \u003d \u0027backend_reqs\u0027"},{"line_number":1738,"context_line":"            labels[\u0027status\u0027] \u003d self.backend_resp.status_int"},{"line_number":1739,"context_line":""},{"line_number":1740,"context_line":"        labels[\u0027token\u0027] \u003d \u0027with_token\u0027 if self.token_acquired else \u0027no_token\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"2e2ee14d_f635da0e","line":1737,"in_reply_to":"7e08e246_c7d00a33","updated":"2025-07-22 17:30:51.000000000","message":"it\u0027s added in line 1740","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":184,"context_line":"            labels[\u0027container\u0027] \u003d container"},{"line_number":185,"context_line":"        super().__init__("},{"line_number":186,"context_line":"            ctrl.app, infocache, memcache, cache_key, cache_ttl,"},{"line_number":187,"context_line":"            avg_backend_fetch_time, num_tokens, labels\u003dlabels"},{"line_number":188,"context_line":"        )"},{"line_number":189,"context_line":"        self.ctrl \u003d ctrl"},{"line_number":190,"context_line":"        self.account \u003d account"}],"source_content_type":"text/x-python","patch_set":2,"id":"38eaa17f_6665bad3","line":187,"updated":"2025-06-17 22:17:22.000000000","message":"I think the custom labels is a lot cleaner interface for the generic class","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            labels[\u0027container\u0027] \u003d container"},{"line_number":185,"context_line":"        super().__init__("},{"line_number":186,"context_line":"            ctrl.app, infocache, memcache, cache_key, cache_ttl,"},{"line_number":187,"context_line":"            avg_backend_fetch_time, num_tokens, labels\u003dlabels"},{"line_number":188,"context_line":"        )"},{"line_number":189,"context_line":"        self.ctrl \u003d ctrl"},{"line_number":190,"context_line":"        self.account \u003d account"}],"source_content_type":"text/x-python","patch_set":2,"id":"587c5f8c_ecf804ed","line":187,"in_reply_to":"38eaa17f_6665bad3","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dc63ac186e7ae737357845da93f0620db22363ac","unresolved":true,"context_lines":[{"line_number":176,"context_line":"        num_tokens \u003d ctrl.app.namespace_cache_tokens_per_session"},{"line_number":177,"context_line":"        op_type \u003d \u0027shard_updating\u0027"},{"line_number":178,"context_line":"        labels \u003d {"},{"line_number":179,"context_line":"            \u0027resource\u0027: op_type,"},{"line_number":180,"context_line":"        }"},{"line_number":181,"context_line":"        if account is not None:"},{"line_number":182,"context_line":"            labels[\u0027account\u0027] \u003d account"}],"source_content_type":"text/x-python","patch_set":3,"id":"7b5fd303_3a71953b","line":179,"updated":"2025-07-15 19:13:28.000000000","message":"``op_type`` is only used once here, we can just use the string in place\n```\n            \u0027resource\u0027: \u0027shard_updating\u0027,\n```","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4efc58f281a2087bbd953a87bf961f6ef0fba390","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        num_tokens \u003d ctrl.app.namespace_cache_tokens_per_session"},{"line_number":177,"context_line":"        op_type \u003d \u0027shard_updating\u0027"},{"line_number":178,"context_line":"        labels \u003d {"},{"line_number":179,"context_line":"            \u0027resource\u0027: op_type,"},{"line_number":180,"context_line":"        }"},{"line_number":181,"context_line":"        if account is not None:"},{"line_number":182,"context_line":"            labels[\u0027account\u0027] \u003d account"}],"source_content_type":"text/x-python","patch_set":3,"id":"614c9af4_ed5c74d3","line":179,"in_reply_to":"7b5fd303_3a71953b","updated":"2025-07-22 19:59:54.000000000","message":"Acknowledged","commit_id":"2295ac9e5f3eacdf122b1ee56d8936b6cc102efe"}],"swift/proxy/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":200,"context_line":"    \"\"\"WSGI application for the proxy server.\"\"\""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def __init__(self, conf, logger\u003dNone, account_ring\u003dNone,"},{"line_number":203,"context_line":"                 container_ring\u003dNone):"},{"line_number":204,"context_line":"        # This is for the sake of tests which instantiate an Application"},{"line_number":205,"context_line":"        # directly rather than via loadapp()."},{"line_number":206,"context_line":"        self._pipeline_final_app \u003d self"}],"source_content_type":"text/x-python","patch_set":1,"id":"63aca806_38b35573","line":203,"updated":"2025-06-10 17:46:37.000000000","message":"maybe room to add a `statsd\u003dNone` kwarg?","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    \"\"\"WSGI application for the proxy server.\"\"\""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def __init__(self, conf, logger\u003dNone, account_ring\u003dNone,"},{"line_number":203,"context_line":"                 container_ring\u003dNone):"},{"line_number":204,"context_line":"        # This is for the sake of tests which instantiate an Application"},{"line_number":205,"context_line":"        # directly rather than via loadapp()."},{"line_number":206,"context_line":"        self._pipeline_final_app \u003d self"}],"source_content_type":"text/x-python","patch_set":1,"id":"39e047b8_55dacab2","line":203,"in_reply_to":"63aca806_38b35573","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":212,"context_line":"                                     statsd_tail_prefix\u003d\u0027proxy-server\u0027)"},{"line_number":213,"context_line":"        else:"},{"line_number":214,"context_line":"            self.logger \u003d logger"},{"line_number":215,"context_line":"        self.statsd \u003d get_labeled_statsd_client(conf, self.logger)"},{"line_number":216,"context_line":"        self.backend_user_agent \u003d \u0027proxy-server %s\u0027 % os.getpid()"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        swift_dir \u003d conf.get(\u0027swift_dir\u0027, \u0027/etc/swift\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b6fda3a2_3db65620","line":215,"updated":"2025-06-10 17:46:37.000000000","message":"`self.statsd \u003d statsd or get_labeled_statsd_client` ???","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                                     statsd_tail_prefix\u003d\u0027proxy-server\u0027)"},{"line_number":213,"context_line":"        else:"},{"line_number":214,"context_line":"            self.logger \u003d logger"},{"line_number":215,"context_line":"        self.statsd \u003d get_labeled_statsd_client(conf, self.logger)"},{"line_number":216,"context_line":"        self.backend_user_agent \u003d \u0027proxy-server %s\u0027 % os.getpid()"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        swift_dir \u003d conf.get(\u0027swift_dir\u0027, \u0027/etc/swift\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"be987dcc_ecdfeff9","line":215,"in_reply_to":"b6fda3a2_3db65620","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"}],"test/debug_logger.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        Hook into base class primitive to track all \"counter\" metrics"},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        self.counters[metric] +\u003d value"},{"line_number":97,"context_line":"        return super()._update_stats(metric, value, *args, **kwargs)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def get_stats_labels_increment_counts(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"c1ba57e6_ddabd9e7","line":96,"updated":"2025-06-17 22:17:22.000000000","message":"you could potentially also do the book keeping inline by checking if labels in kwargs","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        Hook into base class primitive to track all \"counter\" metrics"},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        self.counters[metric] +\u003d value"},{"line_number":97,"context_line":"        return super()._update_stats(metric, value, *args, **kwargs)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def get_stats_labels_increment_counts(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6203ba70_ba64870c","line":96,"in_reply_to":"c1ba57e6_ddabd9e7","updated":"2025-06-24 15:22:26.000000000","message":"Good point, inline seems better","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":97,"context_line":"        return super()._update_stats(metric, value, *args, **kwargs)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def get_stats_labels_increment_counts(self):"},{"line_number":100,"context_line":"        stats \u003d {}"},{"line_number":101,"context_line":"        for call in self.calls[\u0027increment\u0027]:"},{"line_number":102,"context_line":"            labels \u003d call[1].get(\u0027labels\u0027, {})"},{"line_number":103,"context_line":"            stat_labels \u003d (call[0], frozenset(labels.items()))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ec0fc93_1cc37260","line":100,"updated":"2025-06-17 22:17:22.000000000","message":"probably a little more idiomatic to use a `defaultdict(int)` here","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        return super()._update_stats(metric, value, *args, **kwargs)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def get_stats_labels_increment_counts(self):"},{"line_number":100,"context_line":"        stats \u003d {}"},{"line_number":101,"context_line":"        for call in self.calls[\u0027increment\u0027]:"},{"line_number":102,"context_line":"            labels \u003d call[1].get(\u0027labels\u0027, {})"},{"line_number":103,"context_line":"            stat_labels \u003d (call[0], frozenset(labels.items()))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9b1622a9_8982d817","line":100,"in_reply_to":"7ec0fc93_1cc37260","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def get_stats_labels_increment_counts(self):"},{"line_number":100,"context_line":"        stats \u003d {}"},{"line_number":101,"context_line":"        for call in self.calls[\u0027increment\u0027]:"},{"line_number":102,"context_line":"            labels \u003d call[1].get(\u0027labels\u0027, {})"},{"line_number":103,"context_line":"            stat_labels \u003d (call[0], frozenset(labels.items()))"},{"line_number":104,"context_line":"            if stats.get(stat_labels) is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"99abbff5_fe000b31","line":101,"updated":"2025-06-17 22:17:22.000000000","message":"we\u0027d recently had some problems with counters that use update_stats or decrement\n\n946621: tests: Remove BaseFakeStatsdClient.get_increment_counts | https://review.opendev.org/c/openstack/swift/+/946621\n\n... probably worth considering if we *really* want an interface for labeled counters that only considers calls to increment.  Personally, I don\u0027t.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def get_stats_labels_increment_counts(self):"},{"line_number":100,"context_line":"        stats \u003d {}"},{"line_number":101,"context_line":"        for call in self.calls[\u0027increment\u0027]:"},{"line_number":102,"context_line":"            labels \u003d call[1].get(\u0027labels\u0027, {})"},{"line_number":103,"context_line":"            stat_labels \u003d (call[0], frozenset(labels.items()))"},{"line_number":104,"context_line":"            if stats.get(stat_labels) is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"db87cc7c_39bc4f82","line":101,"in_reply_to":"99abbff5_fe000b31","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        stats \u003d {}"},{"line_number":101,"context_line":"        for call in self.calls[\u0027increment\u0027]:"},{"line_number":102,"context_line":"            labels \u003d call[1].get(\u0027labels\u0027, {})"},{"line_number":103,"context_line":"            stat_labels \u003d (call[0], frozenset(labels.items()))"},{"line_number":104,"context_line":"            if stats.get(stat_labels) is None:"},{"line_number":105,"context_line":"                stats[stat_labels] \u003d 0"},{"line_number":106,"context_line":"            stats[stat_labels] +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"b62e5e88_b5920ba3","line":103,"updated":"2025-06-17 22:17:22.000000000","message":"instead of `call[0]` (i.e. `call.args`) I think you should use the metric name `call[0][0]` (i.e. just the `metric` arg)","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        stats \u003d {}"},{"line_number":101,"context_line":"        for call in self.calls[\u0027increment\u0027]:"},{"line_number":102,"context_line":"            labels \u003d call[1].get(\u0027labels\u0027, {})"},{"line_number":103,"context_line":"            stat_labels \u003d (call[0], frozenset(labels.items()))"},{"line_number":104,"context_line":"            if stats.get(stat_labels) is None:"},{"line_number":105,"context_line":"                stats[stat_labels] \u003d 0"},{"line_number":106,"context_line":"            stats[stat_labels] +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9ebe8c_6e1bd4ef","line":103,"in_reply_to":"b62e5e88_b5920ba3","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3032,"context_line":"    def _get_stats_labels_increment(self):"},{"line_number":3033,"context_line":"        stats \u003d {}"},{"line_number":3034,"context_line":"        for call in self.statsd.calls[\u0027increment\u0027]:"},{"line_number":3035,"context_line":"            stat_labels \u003d str(call)"},{"line_number":3036,"context_line":"            if stats.get(stat_labels) is None:"},{"line_number":3037,"context_line":"                stats[stat_labels] \u003d 0"},{"line_number":3038,"context_line":"            stats[stat_labels] +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"800cef2d_7e4a4122","line":3035,"updated":"2025-06-10 17:46:37.000000000","message":"that\u0027s one way to make a dict a hashable key ...\n\nOn order python\u0027s I\u0027d doubt the order of these labels is as stable as you might hope it is; dictionary keys are *technically* unordered - but python has been steadily making that shit more stable; so it\u0027s possible this will \"just work\" and it\u0027s only \"gross\" instead of \"going to break\"","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3032,"context_line":"    def _get_stats_labels_increment(self):"},{"line_number":3033,"context_line":"        stats \u003d {}"},{"line_number":3034,"context_line":"        for call in self.statsd.calls[\u0027increment\u0027]:"},{"line_number":3035,"context_line":"            stat_labels \u003d str(call)"},{"line_number":3036,"context_line":"            if stats.get(stat_labels) is None:"},{"line_number":3037,"context_line":"                stats[stat_labels] \u003d 0"},{"line_number":3038,"context_line":"            stats[stat_labels] +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"f9c9f8bc_edfa357d","line":3035,"in_reply_to":"800cef2d_7e4a4122","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3036,"context_line":"            if stats.get(stat_labels) is None:"},{"line_number":3037,"context_line":"                stats[stat_labels] \u003d 0"},{"line_number":3038,"context_line":"            stats[stat_labels] +\u003d 1"},{"line_number":3039,"context_line":"        return stats"},{"line_number":3040,"context_line":""},{"line_number":3041,"context_line":"    def test_populator_num_tokens_zero(self):"},{"line_number":3042,"context_line":"        populator \u003d self.MockCachePopulator("}],"source_content_type":"text/x-python","patch_set":1,"id":"37d1661c_5c16d374","line":3039,"updated":"2025-06-10 17:46:37.000000000","message":"doesn\u0027t a `debug_statsd_client`/`FakeLabeledStatsdClient` already have some helpers for collecting counters?  We shouldn\u0027t have to reimplement this on every class that wants to use/assert-counters with a labeled statsd client.\n\nhttps://github.com/NVIDIA/swift/blob/master/test/debug_logger.py#L84-L101","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3036,"context_line":"            if stats.get(stat_labels) is None:"},{"line_number":3037,"context_line":"                stats[stat_labels] \u003d 0"},{"line_number":3038,"context_line":"            stats[stat_labels] +\u003d 1"},{"line_number":3039,"context_line":"        return stats"},{"line_number":3040,"context_line":""},{"line_number":3041,"context_line":"    def test_populator_num_tokens_zero(self):"},{"line_number":3042,"context_line":"        populator \u003d self.MockCachePopulator("}],"source_content_type":"text/x-python","patch_set":1,"id":"51a6a784_812c9103","line":3039,"in_reply_to":"37d1661c_5c16d374","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3061,"context_line":"        self.assertEqual(self.memcache.del_calls, [])"},{"line_number":3062,"context_line":"        stats \u003d self._get_stats_labels_increment()"},{"line_number":3063,"context_line":"        self.assertEqual({"},{"line_number":3064,"context_line":"            \"((\u0027swift_token\u0027,), {\u0027labels\u0027: {\""},{"line_number":3065,"context_line":"            \"\u0027resource\u0027: \u0027shard_updating\u0027, \""},{"line_number":3066,"context_line":"            \"\u0027event\u0027: \u0027backend_reqs\u0027, \""},{"line_number":3067,"context_line":"            \"\u0027token\u0027: \u0027token_disabled\u0027, \""}],"source_content_type":"text/x-python","patch_set":1,"id":"268a8e45_0f634790","line":3064,"updated":"2025-06-10 17:46:37.000000000","message":"why is `(\u0027swift_token\u0027,)` a tuple?  Is this just the call to increments \"args\" - isn\u0027t the first (only?) arg to increment always just `metric`?","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3061,"context_line":"        self.assertEqual(self.memcache.del_calls, [])"},{"line_number":3062,"context_line":"        stats \u003d self._get_stats_labels_increment()"},{"line_number":3063,"context_line":"        self.assertEqual({"},{"line_number":3064,"context_line":"            \"((\u0027swift_token\u0027,), {\u0027labels\u0027: {\""},{"line_number":3065,"context_line":"            \"\u0027resource\u0027: \u0027shard_updating\u0027, \""},{"line_number":3066,"context_line":"            \"\u0027event\u0027: \u0027backend_reqs\u0027, \""},{"line_number":3067,"context_line":"            \"\u0027token\u0027: \u0027token_disabled\u0027, \""}],"source_content_type":"text/x-python","patch_set":1,"id":"b51b431d_f96c3df4","line":3064,"in_reply_to":"268a8e45_0f634790","updated":"2025-06-17 15:23:33.000000000","message":"it seems to be because of the *args parameter","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3066,"context_line":"            \"\u0027event\u0027: \u0027backend_reqs\u0027, \""},{"line_number":3067,"context_line":"            \"\u0027token\u0027: \u0027token_disabled\u0027, \""},{"line_number":3068,"context_line":"            \"\u0027op_type\u0027: \u0027updating_shard\u0027, \""},{"line_number":3069,"context_line":"            \"\u0027status\u0027: 200}})\": 1"},{"line_number":3070,"context_line":"        }, stats)"},{"line_number":3071,"context_line":""},{"line_number":3072,"context_line":"    def test_first_request_with_token(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"26429c2c_4b923728","line":3069,"updated":"2025-06-10 17:46:37.000000000","message":"isn\u0027t the key *just* `{(metric, labels): 1}` why the `{labels: {}}` indirection?  Is there some OTHER kwarg to increment that could create a new/different counter for the same metric+labels key?","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3066,"context_line":"            \"\u0027event\u0027: \u0027backend_reqs\u0027, \""},{"line_number":3067,"context_line":"            \"\u0027token\u0027: \u0027token_disabled\u0027, \""},{"line_number":3068,"context_line":"            \"\u0027op_type\u0027: \u0027updating_shard\u0027, \""},{"line_number":3069,"context_line":"            \"\u0027status\u0027: 200}})\": 1"},{"line_number":3070,"context_line":"        }, stats)"},{"line_number":3071,"context_line":""},{"line_number":3072,"context_line":"    def test_first_request_with_token(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bbc91a4c_ef074954","line":3069,"in_reply_to":"26429c2c_4b923728","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3103,"context_line":"            \"\u0027event\u0027: \u0027done_token\u0027, \""},{"line_number":3104,"context_line":"            \"\u0027token\u0027: \u0027with_token\u0027, \""},{"line_number":3105,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3106,"context_line":"            \"\u0027status\u0027: 200}})\": 1,"},{"line_number":3107,"context_line":"        }, stats)"},{"line_number":3108,"context_line":""},{"line_number":3109,"context_line":"    def test_first_request_with_token_with_encoder(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"6ef20d54_9b63cbb5","line":3106,"updated":"2025-06-10 17:46:37.000000000","message":"wait... is this a STRING?","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3103,"context_line":"            \"\u0027event\u0027: \u0027done_token\u0027, \""},{"line_number":3104,"context_line":"            \"\u0027token\u0027: \u0027with_token\u0027, \""},{"line_number":3105,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3106,"context_line":"            \"\u0027status\u0027: 200}})\": 1,"},{"line_number":3107,"context_line":"        }, stats)"},{"line_number":3108,"context_line":""},{"line_number":3109,"context_line":"    def test_first_request_with_token_with_encoder(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"2bce4cab_75466d12","line":3106,"in_reply_to":"6ef20d54_9b63cbb5","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3140,"context_line":"            \"\u0027event\u0027: \u0027done_token\u0027, \""},{"line_number":3141,"context_line":"            \"\u0027token\u0027: \u0027with_token\u0027, \""},{"line_number":3142,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3143,"context_line":"            \"\u0027status\u0027: 200}})\": 1,"},{"line_number":3144,"context_line":"        }, stats)"},{"line_number":3145,"context_line":""},{"line_number":3146,"context_line":"    def test_following_request_with_token(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"28ee7456_f9459323","line":3143,"updated":"2025-06-10 17:46:37.000000000","message":"there\u0027s a handful of assertions that are actually interesting - where we see two legacy metrics get replaced with a single labeled metric.","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3140,"context_line":"            \"\u0027event\u0027: \u0027done_token\u0027, \""},{"line_number":3141,"context_line":"            \"\u0027token\u0027: \u0027with_token\u0027, \""},{"line_number":3142,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3143,"context_line":"            \"\u0027status\u0027: 200}})\": 1,"},{"line_number":3144,"context_line":"        }, stats)"},{"line_number":3145,"context_line":""},{"line_number":3146,"context_line":"    def test_following_request_with_token(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f39823d_371d2fb1","line":3143,"in_reply_to":"28ee7456_f9459323","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3337,"context_line":"            \"\u0027token\u0027: \u0027no_token\u0027, \""},{"line_number":3338,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3339,"context_line":"            \"\u0027status\u0027: 200}})\": 1"},{"line_number":3340,"context_line":"        }, stats)"},{"line_number":3341,"context_line":""},{"line_number":3342,"context_line":"    def test_fetch_data_req_lacks_enough_retries(self):"},{"line_number":3343,"context_line":"        # Test the request which doesn\u0027t acquire the token, then keep sleeping"}],"source_content_type":"text/x-python","patch_set":1,"id":"13dfb5d2_554bd456","line":3340,"updated":"2025-06-10 17:46:37.000000000","message":"ok, and `lack_retries` isn\u0027t emitted in this case because it\u0027s a special failure mode for \u0027event: backend_req, token: no_token` where we ALSO didn\u0027t get to make some `N` memcache get requests because of hub starvation...","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3337,"context_line":"            \"\u0027token\u0027: \u0027no_token\u0027, \""},{"line_number":3338,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3339,"context_line":"            \"\u0027status\u0027: 200}})\": 1"},{"line_number":3340,"context_line":"        }, stats)"},{"line_number":3341,"context_line":""},{"line_number":3342,"context_line":"    def test_fetch_data_req_lacks_enough_retries(self):"},{"line_number":3343,"context_line":"        # Test the request which doesn\u0027t acquire the token, then keep sleeping"}],"source_content_type":"text/x-python","patch_set":1,"id":"5aa3bb2a_fa876b08","line":3340,"in_reply_to":"13dfb5d2_554bd456","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3400,"context_line":"            \"\u0027event\u0027: \u0027backend_reqs\u0027, \""},{"line_number":3401,"context_line":"            \"\u0027token\u0027: \u0027no_token\u0027, \""},{"line_number":3402,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3403,"context_line":"            \"\u0027status\u0027: 200}})\": 1"},{"line_number":3404,"context_line":"        }, stats)"},{"line_number":3405,"context_line":""},{"line_number":3406,"context_line":"    def test_get_token_connection_error(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"127c6b43_682446aa","line":3403,"updated":"2025-06-10 17:46:37.000000000","message":"and here we have a backend_req/no_token that also hits special case `lack_retries`\n\nit doesn\u0027t really feel like `lack_retires` should be it\u0027s own counter - it\u0027s \"just\" another special-case of `backend_req` (a subset of no_token)\n\nmaybe, we should just count `event:backend_req`?  The ones we \"expect\" are `token:with_token` ... but you can subdivide `token!\u003dwith_token` into `token\u003dno_token` or `token\u003dlack_retries` if you want...","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3400,"context_line":"            \"\u0027event\u0027: \u0027backend_reqs\u0027, \""},{"line_number":3401,"context_line":"            \"\u0027token\u0027: \u0027no_token\u0027, \""},{"line_number":3402,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027, \""},{"line_number":3403,"context_line":"            \"\u0027status\u0027: 200}})\": 1"},{"line_number":3404,"context_line":"        }, stats)"},{"line_number":3405,"context_line":""},{"line_number":3406,"context_line":"    def test_get_token_connection_error(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3d9132a9_00c7b563","line":3403,"in_reply_to":"127c6b43_682446aa","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":3630,"context_line":"            \"\u0027event\u0027: \u0027cache_served\u0027, \""},{"line_number":3631,"context_line":"            \"\u0027token\u0027: \u0027no_token\u0027, \""},{"line_number":3632,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027}})\": 97,"},{"line_number":3633,"context_line":"        }, stats)"},{"line_number":3634,"context_line":""},{"line_number":3635,"context_line":"        self.assertEqual("},{"line_number":3636,"context_line":"            self.memcache.incr_calls,"}],"source_content_type":"text/x-python","patch_set":1,"id":"a8afea01_df919764","line":3633,"updated":"2025-06-10 17:46:37.000000000","message":"another sort of interesting assertion change: 3 counters become 2 counters... \n\nin this case it seems that all `done_token_reqs` were `with_token`","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":3630,"context_line":"            \"\u0027event\u0027: \u0027cache_served\u0027, \""},{"line_number":3631,"context_line":"            \"\u0027token\u0027: \u0027no_token\u0027, \""},{"line_number":3632,"context_line":"            \"\u0027op_type\u0027: \u0027test\u0027}})\": 97,"},{"line_number":3633,"context_line":"        }, stats)"},{"line_number":3634,"context_line":""},{"line_number":3635,"context_line":"        self.assertEqual("},{"line_number":3636,"context_line":"            self.memcache.incr_calls,"}],"source_content_type":"text/x-python","patch_set":1,"id":"83d0fe3b_f3e7dc5f","line":3633,"in_reply_to":"a8afea01_df919764","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, logger, statsd):"},{"line_number":143,"context_line":"        self.logger \u003d logger"},{"line_number":144,"context_line":"        self.statsd \u003d statsd"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class TestUTC(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"017f2281_dbfd647a","line":144,"updated":"2025-06-17 22:17:22.000000000","message":"this is nice!","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, logger, statsd):"},{"line_number":143,"context_line":"        self.logger \u003d logger"},{"line_number":144,"context_line":"        self.statsd \u003d statsd"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class TestUTC(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"52f8be67_2aafb031","line":144,"in_reply_to":"017f2281_dbfd647a","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":3069,"context_line":"                (\u0027resource\u0027, \u0027updating_shard\u0027),"},{"line_number":3070,"context_line":"                (\u0027event\u0027, \u0027backend_reqs\u0027),"},{"line_number":3071,"context_line":"                (\u0027token\u0027, \u0027token_disabled\u0027),"},{"line_number":3072,"context_line":"                (\u0027status\u0027, 200)})): 1,"},{"line_number":3073,"context_line":"        }, stats)"},{"line_number":3074,"context_line":""},{"line_number":3075,"context_line":"    def test_first_request_with_token(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"0ff07ef0_66f622cf","line":3072,"updated":"2025-06-17 22:17:22.000000000","message":"this is still a bit messy.\n\n1) I think the first element of the tuple should just be the `metric` arg/name itself - not a single element tuple\n2) I think the second element of the tuple is a confusingly spelled literal; over in `debug_logger` we have the much more straight forward `frozenset(labels.items())` - I think `frozenset({\u0027example\u0027: \u0027label\u0027, \u0027dict\u0027: \u0027literal\u0027}.items())` would read better than the frozenset of tuples literal.\n\nHowever the BEST way express this might be a custom class\n\n```\nself.assertEqual({\n    Metric(\u0027swift_token\u0027, resource\u003d\u0027updating_shard\u0027, ..., status\u003d200): 1,\n}, self.statsd.get_labeled_stats_counts())\n```\n\nsomething like:\n\n```\nclass Metric:\n    def __init__(self, metric, **labels):\n        self.metric \u003d metric\n        self.labels \u003d frozenset(labels.items())\n    def astuple(self):\n        return (self.metric, self.labels)\n    def __eq__(self, other):\n        return self.astuple() \u003d\u003d other.astuple()\n    def __hash__(self):\n        return hash(self.astuple())\n```\n\n... but maybe we could add that later with some fanciness in `__eq__` that allows conforming tuples to be considered \"equal\" to matching `Metric`.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":3069,"context_line":"                (\u0027resource\u0027, \u0027updating_shard\u0027),"},{"line_number":3070,"context_line":"                (\u0027event\u0027, \u0027backend_reqs\u0027),"},{"line_number":3071,"context_line":"                (\u0027token\u0027, \u0027token_disabled\u0027),"},{"line_number":3072,"context_line":"                (\u0027status\u0027, 200)})): 1,"},{"line_number":3073,"context_line":"        }, stats)"},{"line_number":3074,"context_line":""},{"line_number":3075,"context_line":"    def test_first_request_with_token(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"768758cb_c43db75d","line":3072,"in_reply_to":"0ff07ef0_66f622cf","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":3416,"context_line":"                (\u0027resource\u0027, \"test\"),"},{"line_number":3417,"context_line":"                (\u0027event\u0027, \u0027backend_reqs\u0027),"},{"line_number":3418,"context_line":"                (\u0027token\u0027, \u0027no_token\u0027),"},{"line_number":3419,"context_line":"                (\u0027status\u0027, 200)})): 1,"},{"line_number":3420,"context_line":"        }, stats)"},{"line_number":3421,"context_line":""},{"line_number":3422,"context_line":"    def test_get_token_connection_error(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fb0bc42e_3e92cf4a","line":3419,"updated":"2025-06-17 22:17:22.000000000","message":"I don\u0027t think this situation should generate TWO `swift_token#event\u003dbackend_reqs` - only ONE `event\u003dbacked_reqs` actually happens - and that `backend_req` was a result of the special-case `no_token` where we also happened to `lack_retries`\n\nI think any `event\u003dbackend_req` and `token!\u003dwith_token` is sort of bad; but the current implementation wants to say that `token\u003dlack_retries` is some kind of \"worse\" than `token\u003dno_token` - that\u0027s no reason to double count the `event\u003dbackend_req` NOR emit a `event\u003dbackend_reqs` w/o a `status\u003d` label.\n\nInstead of emitting a `lack_reties` stat we need to find a way to plumb the status/knowledge of WHY `_sleep_on_memcache` returns None so that when we emit the `event\u003dbackend_reqs` stat we can fill in the `token` label correctly.\n\n... since we\u0027re doing OOP I\u0027d suggest using state on the object like `self.memcache_retry_counter` to decide when we emit the `backend_reqs` metric if this was particularly bad `no_token` situation.  But, since the existing `num_waits` counter is doing double duty as control flow; it may be less invasive to just set an explicit `self.lack_retries` boolean sort of like `token_acquired`.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":3416,"context_line":"                (\u0027resource\u0027, \"test\"),"},{"line_number":3417,"context_line":"                (\u0027event\u0027, \u0027backend_reqs\u0027),"},{"line_number":3418,"context_line":"                (\u0027token\u0027, \u0027no_token\u0027),"},{"line_number":3419,"context_line":"                (\u0027status\u0027, 200)})): 1,"},{"line_number":3420,"context_line":"        }, stats)"},{"line_number":3421,"context_line":""},{"line_number":3422,"context_line":"    def test_get_token_connection_error(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"62d2905d_a79ff3b6","line":3419,"in_reply_to":"fb0bc42e_3e92cf4a","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":3504,"context_line":"                (\u0027event\u0027, \u0027backend_reqs\u0027),"},{"line_number":3505,"context_line":"                (\u0027token\u0027, \u0027with_token\u0027),"},{"line_number":3506,"context_line":"                (\u0027status\u0027, 200)})): 1,"},{"line_number":3507,"context_line":"        }, stats)"},{"line_number":3508,"context_line":""},{"line_number":3509,"context_line":"    def test_get_token_data_set_connection_errors(self):"},{"line_number":3510,"context_line":"        # Test the request which couldn\u0027t acquire the token due to memcached"}],"source_content_type":"text/x-python","patch_set":2,"id":"18bd303b_498dfdc7","line":3507,"updated":"2025-06-17 22:17:22.000000000","message":"wow, so this is actually a kind of error situation - we did the `event\u003dbackend_req` and got a `status\u003d200` response, but the `token\u003dwith_token` instead of `token\u003ddone_token` indicates a memcache set error.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":3504,"context_line":"                (\u0027event\u0027, \u0027backend_reqs\u0027),"},{"line_number":3505,"context_line":"                (\u0027token\u0027, \u0027with_token\u0027),"},{"line_number":3506,"context_line":"                (\u0027status\u0027, 200)})): 1,"},{"line_number":3507,"context_line":"        }, stats)"},{"line_number":3508,"context_line":""},{"line_number":3509,"context_line":"    def test_get_token_data_set_connection_errors(self):"},{"line_number":3510,"context_line":"        # Test the request which couldn\u0027t acquire the token due to memcached"}],"source_content_type":"text/x-python","patch_set":2,"id":"52b9d81d_8fe6e328","line":3507,"in_reply_to":"18bd303b_498dfdc7","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":3654,"context_line":"            ((\u0027swift_token\u0027,), frozenset({"},{"line_number":3655,"context_line":"                (\u0027resource\u0027, \u0027test\u0027),"},{"line_number":3656,"context_line":"                (\u0027event\u0027, \u0027cache_served\u0027),"},{"line_number":3657,"context_line":"                (\u0027token\u0027, \u0027no_token\u0027)})): 97"},{"line_number":3658,"context_line":"        }, stats)"},{"line_number":3659,"context_line":""},{"line_number":3660,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"44fb3869_37402613","line":3657,"updated":"2025-06-17 22:17:22.000000000","message":"97 `event\u003dcache_served` and 3 `event\u003dbackend_req` makes total sense because we made 100 requests w/ default `num_tokens\u003d3`","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":3654,"context_line":"            ((\u0027swift_token\u0027,), frozenset({"},{"line_number":3655,"context_line":"                (\u0027resource\u0027, \u0027test\u0027),"},{"line_number":3656,"context_line":"                (\u0027event\u0027, \u0027cache_served\u0027),"},{"line_number":3657,"context_line":"                (\u0027token\u0027, \u0027no_token\u0027)})): 97"},{"line_number":3658,"context_line":"        }, stats)"},{"line_number":3659,"context_line":""},{"line_number":3660,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"bffc354a_33c03d38","line":3657,"in_reply_to":"44fb3869_37402613","updated":"2025-06-24 15:22:26.000000000","message":"Acknowledged","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":2575,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":2576,"context_line":"        }"},{"line_number":2577,"context_line":"        with mock.patch(\u0027swift.common.statsd_client.LabeledStatsdClient\u0027,"},{"line_number":2578,"context_line":"                        FakeLabeledStatsdClient):"},{"line_number":2579,"context_line":"            self.app \u003d proxy_server.Application("},{"line_number":2580,"context_line":"                conf,"},{"line_number":2581,"context_line":"                logger\u003dself.logger,"}],"source_content_type":"text/x-python","patch_set":1,"id":"786f6be6_eea30826","line":2578,"updated":"2025-06-10 17:46:37.000000000","message":"should we just start plumbing `statsd\u003dNone` and `self.statsd \u003d statsd or get_statsd` into our applications same as we do today for logging so that we can just say what we want explicitly `self.statsd \u003d debug_statsd()` and don\u0027t have to monkey match the common.StatsdClient class during `__init__`?","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":2575,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":2576,"context_line":"        }"},{"line_number":2577,"context_line":"        with mock.patch(\u0027swift.common.statsd_client.LabeledStatsdClient\u0027,"},{"line_number":2578,"context_line":"                        FakeLabeledStatsdClient):"},{"line_number":2579,"context_line":"            self.app \u003d proxy_server.Application("},{"line_number":2580,"context_line":"                conf,"},{"line_number":2581,"context_line":"                logger\u003dself.logger,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abc9d71_62b5ef62","line":2578,"in_reply_to":"786f6be6_eea30826","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8c93e6ac51ed04853524c5f0163af06e308820c0","unresolved":true,"context_lines":[{"line_number":4439,"context_line":"                        \u0027op_type\u0027: \u0027shard_updating\u0027,"},{"line_number":4440,"context_line":"                        \u0027status\u0027: 200"},{"line_number":4441,"context_line":"                    }}"},{"line_number":4442,"context_line":"                )]})"},{"line_number":4443,"context_line":"            self.assertEqual([], self.app.logger.log_dict[\u0027set_statsd_prefix\u0027])"},{"line_number":4444,"context_line":"            info_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":4445,"context_line":"            self.assertIn("}],"source_content_type":"text/x-python","patch_set":1,"id":"0384ff46_e0f05497","line":4442,"updated":"2025-06-10 17:46:37.000000000","message":"it would be nice if the debug labeled statsd client had a \"counters\" attribute that worked with labels... maybe something with a \n\n```\nassertEqual(stats, {\n    (\u0027metric\u0027, frozenset(labels.items())): 1\n})\n```\n\n... looking kind of interface?\n\nOr maybe even a custom `Labels()` object that implement\u0027s it\u0027s own `__hash__` function using frozenset or something similar...","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c6410eff541beb3bb13aed2e330a381c909647c5","unresolved":false,"context_lines":[{"line_number":4439,"context_line":"                        \u0027op_type\u0027: \u0027shard_updating\u0027,"},{"line_number":4440,"context_line":"                        \u0027status\u0027: 200"},{"line_number":4441,"context_line":"                    }}"},{"line_number":4442,"context_line":"                )]})"},{"line_number":4443,"context_line":"            self.assertEqual([], self.app.logger.log_dict[\u0027set_statsd_prefix\u0027])"},{"line_number":4444,"context_line":"            info_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":4445,"context_line":"            self.assertIn("}],"source_content_type":"text/x-python","patch_set":1,"id":"705854c3_559bea63","line":4442,"in_reply_to":"0384ff46_e0f05497","updated":"2025-06-17 15:23:33.000000000","message":"Acknowledged","commit_id":"facccdebb6b1b55d63999c5af5755eef56095d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b2f74cd12b629600f67c1538b977bec42cc6754","unresolved":true,"context_lines":[{"line_number":5682,"context_line":"                        \u0027status\u0027: 200"},{"line_number":5683,"context_line":"                    }}"},{"line_number":5684,"context_line":"                )]})"},{"line_number":5685,"context_line":"            self.assertEqual([], self.app.logger.log_dict[\u0027set_statsd_prefix\u0027])"},{"line_number":5686,"context_line":"            info_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":5687,"context_line":"            self.assertIn("},{"line_number":5688,"context_line":"                \u0027Caching updating shards for shard-updating-v2/a/c (3 shards)\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"401c7543_172a133c","line":5685,"updated":"2025-06-17 22:17:22.000000000","message":"this module pretty consistently is trading an assert on `stats_counts` for an assert on `statsd.calls`\n\n... it\u0027s not obvious to me using method call tracking is a better assertion than the new `get_labeled_stats_counts` helper.","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1c1d50032f4ee056ed87d9d751dc33fb3fa93a00","unresolved":false,"context_lines":[{"line_number":5682,"context_line":"                        \u0027status\u0027: 200"},{"line_number":5683,"context_line":"                    }}"},{"line_number":5684,"context_line":"                )]})"},{"line_number":5685,"context_line":"            self.assertEqual([], self.app.logger.log_dict[\u0027set_statsd_prefix\u0027])"},{"line_number":5686,"context_line":"            info_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":5687,"context_line":"            self.assertIn("},{"line_number":5688,"context_line":"                \u0027Caching updating shards for shard-updating-v2/a/c (3 shards)\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2d55c912_0683bd60","line":5685,"in_reply_to":"401c7543_172a133c","updated":"2025-06-24 15:22:26.000000000","message":"Changed to use stats_counts","commit_id":"cfcebc15b296b6d5f1dd8230be7ba1e239d2afe1"}]}
