)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add labeled metrics to proxy-logging"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Modified code to use native labeled metrics API based on Tim Burke\u0027s"},{"line_number":10,"context_line":"patch for proxy-logging. Thanks Tim."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"47ca5a1f_e680a7db","line":10,"range":{"start_line":9,"start_character":57,"end_line":10,"end_character":36},"updated":"2024-07-12 12:30:31.000000000","message":"we can refer to a \"related change.\" 😊\n\nAnd then add a tag\n\n```\nRelated-Change: I115ffb1dc601652a979895d7944e011b951a91c1\n```","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add labeled metrics to proxy-logging"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Modified code to use native labeled metrics API based on Tim Burke\u0027s"},{"line_number":10,"context_line":"patch for proxy-logging. Thanks Tim."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"19067137_ff1338e0","line":10,"range":{"start_line":9,"start_character":57,"end_line":10,"end_character":36},"in_reply_to":"47ca5a1f_e680a7db","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-07-11 09:35:45 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add labeled metrics to proxy-logging"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Modified code to use native labeled metrics API based on Tim Burke\u0027s"},{"line_number":10,"context_line":"patch for proxy-logging. Thanks Tim."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"cfba48a0_cfeef369","line":7,"updated":"2024-07-12 12:30:31.000000000","message":"IIUC this isn\u0027t only replicating the existing metrics in a labeled form, but also adding metrics... could you add something here about the new metrics that are emitted (i.e. by InputProxy)","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-07-11 09:35:45 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add labeled metrics to proxy-logging"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Modified code to use native labeled metrics API based on Tim Burke\u0027s"},{"line_number":10,"context_line":"patch for proxy-logging. Thanks Tim."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3cc8e00e_bb970043","line":7,"in_reply_to":"aab8e713_706c04de","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-07-11 09:35:45 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add labeled metrics to proxy-logging"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Modified code to use native labeled metrics API based on Tim Burke\u0027s"},{"line_number":10,"context_line":"patch for proxy-logging. Thanks Tim."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"aab8e713_706c04de","line":7,"in_reply_to":"cfba48a0_cfeef369","updated":"2024-07-16 01:29:41.000000000","message":"Can we pull those changes out to a follow-on change?  It\u0027s totally orthogonal to the immediate need for SRE to get their hands on configuring labeled metrics and replacing existing graphs.","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"3c663f76_56b05ac0","updated":"2024-07-12 12:30:31.000000000","message":"-1 because I think the conf is broken, unless I am misunderstanding where we\u0027re at with the log_ prefix","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"4688f76e_6382d1c6","updated":"2024-07-16 01:29:41.000000000","message":"the new labeled metrics for proxy-logging timing and count seem to work\n\nI would prefer you move the InputProxy wrapping and resp iterator byte tracking into a follow-on patch so we can focus on the mechanics and configuration of turning on labeled metrics and replacing some existing graphs\n\nThen we can add new metrics and graphs that knock peoples socks off!","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"57e25a55_27138633","updated":"2024-08-02 16:46:16.000000000","message":"Follow up to address a couple of my comments: https://review.opendev.org/c/openstack/swift/+/925619 sq? proxy-logging helper methods refactor\n\nI tested this functionally in an vsaio and saw labeled metrics emitted in dogstatsd and librato formats according to my config. I also checked that statsd_emit_legacy behaved as expected.\n\nI ought to spend more time in the unit tests. I\u0027d like to think we could unravel some of the conditional assertion paths.","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c09e45471f068a768cc1f8d30822b386bae9ec1d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"4041c502_25d3aa5a","updated":"2024-08-02 16:26:58.000000000","message":"I found some draft comments from forever ago; probably not relevent - I want to review today and I can close them up if they no longer apply.","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ac22598fb7704230bdf2b9cfb889f98816cf6e6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"c1c1544d_83bd0afb","updated":"2024-07-31 19:19:12.000000000","message":"Verified with nv-fork OTEL and the patch seems to work with statsd reciever and a prometheus exporter","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c54459095c2016952fabc832d4b2a304ffbf80ea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"1cd7bd99_5c8b4aac","updated":"2024-08-05 15:49:18.000000000","message":"I tested this functionally in my vsaio with statsd_expoter -\u003e prometheus and dogstatsd format. I could filter stats by labels etc","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e07190b79cdd40f0ea3d7b227dd74a463364144e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"58a8dc9c_146fafd8","updated":"2024-08-07 04:58:31.000000000","message":"not sure why we alway wrap the acc and cont as annonStr\u0027s in the __call__. As far as I can tell we never pass the stats through a logging formatter so we\u0027d never be able to use the .anonyimized method.\n\nWhen we do need to have that handy, it\u0027s all dealt with in the log_message where it actaully gets logged. (which has nothing to do with metrics).\n\nUnless of course we want to oneday support anonymising metric labels.. but in that case we\u0027d just choose to not emit those labels I\u0027d suspect.","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1c1dd956c48f04b58b582c1be443cc5b29b1b075","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"fbed637c_5c09eab0","updated":"2024-08-07 04:58:51.000000000","message":"ops forgot the vote score","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce1117eadafb0309bc6d3ac7e8a42363d3fc5aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"1bb21641_cb52a5d0","updated":"2024-09-09 13:07:35.000000000","message":"I had some unpublished comments.","commit_id":"09900db616b35782a7b8615ba2982cad9e3f5364"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"d4855ae9c8aae7dd8955d95d1ac3e3eb263980e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"5898c66d_64aec8ea","updated":"2024-09-10 16:51:26.000000000","message":"recheck","commit_id":"6fefda865f61bef3e117b89bd65d1d31bcbf676b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"c5f689c0_ad6575d4","updated":"2025-03-20 15:24:50.000000000","message":"We\u0027ve been carrying this in prod for some time and benefitting from labeled metrics. It all looks behaviourally correct. There\u0027s some stuff I \u0027d prefer changing as cleanup and I have pushed a follow up patches with suggestions. See https://review.opendev.org/c/openstack/swift/+/945116\n\nApart from a few other apparently unnecessary changes, my biggest hesitation is the change to parsing the access_log_* options which caused me to stop and ponder all the ramifications when in fact it isn\u0027t absolutely necessary.","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b462bd8c7f9587fdfa675d453f1d7a41fa68ea37","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"29440a9b_eeffdc8d","updated":"2025-03-20 16:59:40.000000000","message":"ccess_","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"31a5bf5f_fb6d0731","in_reply_to":"29440a9b_eeffdc8d","updated":"2025-03-25 18:30:59.000000000","message":"oops. unintended nonsense comment.","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"1ec41d9c_f94167b9","updated":"2025-04-04 14:42:48.000000000","message":"I spent a lot of time reviewing the *long*  test and splitting it up before realising that maybe there\u0027s also the same coverage already in separate tests?!?\n\nI suspect there is some de-duplicating of tests needed. Anyway, there may be some useful stuff in [1] but it\u0027s not the finished product.\n\nI think we\u0027re inheriting some sub-optimal test patterns from the existing code, I suggested a different test helper in [1]\n\nAlso note in [1] how I used mock\u0027s side_effect to simplify some shared test setup.\n\nThere seems to be a general lack of the timing labeled metrics assertions vs the update_stats aassertions.\n\n[1] https://review.opendev.org/c/openstack/swift/+/946345","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3731f975a34ffef1a3b120109bd3f124fa2cfaca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"d093284f_a2728e29","updated":"2025-04-03 18:50:23.000000000","message":"recheck","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a57c58cf59c6bfba5ae81816abe9778afc55ede3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"3312cf17_5cfd1d7e","updated":"2025-04-03 23:28:07.000000000","message":"we should get in the habit of adding new labeled metrics to some docs, the reason that the legacy metrics docs aren\u0027t orphans is because the admin guide provides a toc under the \"Reporting Metrics to StatsD\" section\n\n```\n-.. toctree::\n-   metrics/account_auditor\n-   metrics/account_reaper\n-   metrics/account_server\n-   metrics/account_replicator\n-   metrics/container_auditor\n-   metrics/container_replicator\n-   metrics/container_server\n-   metrics/container_sync\n-   metrics/container_updater\n-   metrics/object_auditor\n-   metrics/object_expirer\n-   metrics/object_reconstructor\n-   metrics/object_replicator\n-   metrics/object_server\n-   metrics/object_updater\n-   metrics/proxy_server\n-\n```\n\nEven if you remove that they *still* don\u0027t get reported as \"orphans\" because they \n are *included* in the metrics/all.rst file - which itself happens to be an orphan but it\u0027s ok because it\u0027s labeled as such since it\u0027s just duplicating data anyway.\n \nProbably eventually the whole \"reporting metrics to statsd\" section of the admin guide should be replaced and route to both `metrics/legacy/...` and `metrics/labeled/...` - which may deserve their own prose on how to configure them that we can update with best practices as we eventually migrate swift more towards labeled metrics.","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":45,"id":"13372d17_c082b340","updated":"2025-04-09 16:01:46.000000000","message":"I think this is in good shape but there\u0027s a few issues with the tests that I\u0027d like to see addressed before merging:\n\n- don\u0027t use mock.ANY unless necessary \n- fill in the gaps where assertLabeledUpdates is called but not assertLabeledTiming. I don\u0027t think this needs to become too verbose if we re-use a single exp_labels dict in each test.\n- remove unused test helper method","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9dcb7449251f1ab5c3f385a87fe571ca2b72c5a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":45,"id":"9693bc5b_c461a8cc","updated":"2025-04-09 14:00:17.000000000","message":"rebased on master and fixed a couple of tests that broke with https://review.opendev.org/c/openstack/swift/+/946349 coming onto master (they were passing labels as a positional arg)","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bfa531764527c9b90c99dc60e583a78c4f484aa7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":48,"id":"33260738_0638dd6e","updated":"2025-04-11 13:26:38.000000000","message":"I added some more test coverage in https://review.opendev.org/c/openstack/swift/+/946996 which I am happy to be a follow up patch.","commit_id":"10deeb5e164260b9dcdc69a8bc9eb8c423726b7e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1e10163171d935299c2fa15661c49010d887378f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":48,"id":"912c91a0_29a3ab73","updated":"2025-04-11 13:11:14.000000000","message":"I replaced a couple more mock.ANY usages","commit_id":"10deeb5e164260b9dcdc69a8bc9eb8c423726b7e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e03c2933822e5dead10d4a0a1732ec9292052b63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":50,"id":"f1270c00_5cfe6036","updated":"2025-04-23 16:18:38.000000000","message":"removing my +2 pending discussion of the label name ``type``","commit_id":"7788ea0d82ea4a8b34b6bab47756468733528907"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"70d4f09a061ef24b6858db03cc23f5f6d4cad001","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":53,"id":"d2f2a10f_8bf4ab8c","updated":"2025-05-15 09:12:23.000000000","message":"ok, I\u0027m back to +2.\n\nI have been educated that SRE can choose to ignore labels in otel collector, so if the container cardinality proves to be too high then just ignore those labels.","commit_id":"ccf85e8e8a2ede228d7c8ba9d665edb8f64717ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5dc5ca465adcb3919a4e6068a52e045db507c56b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":55,"id":"07c40406_dc7776ef","updated":"2025-05-20 19:27:06.000000000","message":"recheck\n\nSome nova/neutron error, I guess? I see a couple 500s in the apache logs like\n```\n158.69.71.201 - - [20/May/2025:17:44:58 +0000] \"GET /compute/v2.1/servers/detail?name\u003dcinder_server1 HTTP/1.1\" 500 803 \"-\" \"openstacksdk/4.5.0 keystoneauth1/5.11.0 python-requests/2.32.3 CPython/3.10.12\"\n158.69.71.201 - - [20/May/2025:17:44:58 +0000] \"GET /networking/v2.0/ports?device_id\u003ddac392dc-78b1-4cbf-920c-2001213cb06d HTTP/1.1\" 500 803 \"-\" \"python-neutronclient\"\n```\nNova produces a decent traceback that goes down to nuetronclient:\n```\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi Traceback (most recent call last):\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/openstack/wsgi.py\", line 731, in wrapped\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     return f(*args, **kwargs)\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/validation/__init__.py\", line 286, in wrapper\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     return func(*args, **kwargs)\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/validation/__init__.py\", line 286, in wrapper\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     return func(*args, **kwargs)\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/validation/__init__.py\", line 286, in wrapper\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     return func(*args, **kwargs)\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   [Previous line repeated 2 more times]\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/openstack/compute/servers.py\", line 142, in detail\nMay 20 17:49:58.463254 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     servers \u003d self._get_servers(req, is_detail\u003dTrue)\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/openstack/compute/servers.py\", line 342, in _get_servers\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     response \u003d self._view_builder.detail(\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/openstack/compute/views/servers.py\", line 521, in detail\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     self._add_security_grps(request, list(servers_dict[\"servers\"]),\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/api/openstack/compute/views/servers.py\", line 767, in _add_security_grps\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     security_group_api.get_instances_security_groups_bindings(\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/security_group_api.py\", line 528, in get_instances_security_groups_bindings\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ports \u003d _get_ports_from_server_list(servers, neutron)\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/security_group_api.py\", line 477, in _get_ports_from_server_list\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ports.extend(neutron.list_ports(**search_opts).get(\u0027ports\u0027))\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/neutron.py\", line 196, in wrapper\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ret \u003d obj(*args, **kwargs)\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 815, in list_ports\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     return self.list(\u0027ports\u0027, self.ports_path, retrieve_all,\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/neutron.py\", line 196, in wrapper\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ret \u003d obj(*args, **kwargs)\nMay 20 17:49:58.464598 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 372, in list\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     for r in self._pagination(collection, path, **params):\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 387, in _pagination\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     res \u003d self.get(path, params\u003dparams)\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/neutron.py\", line 196, in wrapper\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ret \u003d obj(*args, **kwargs)\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 356, in get\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     return self.retry_request(\"GET\", action, body\u003dbody,\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/neutron.py\", line 196, in wrapper\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ret \u003d obj(*args, **kwargs)\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 333, in retry_request\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     return self.do_request(method, action, body\u003dbody,\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/neutron.py\", line 196, in wrapper\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ret \u003d obj(*args, **kwargs)\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 297, in do_request\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     self._handle_fault_response(status_code, replybody, resp)\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/new/nova/nova/network/neutron.py\", line 196, in wrapper\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     ret \u003d obj(*args, **kwargs)\nMay 20 17:49:58.465418 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 272, in _handle_fault_response\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     exception_handler_v20(status_code, error_body)\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi   File \"/opt/stack/data/venv/lib/python3.10/site-packages/neutronclient/v2_0/client.py\", line 90, in exception_handler_v20\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi     raise client_exc(message\u003derror_message,\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi neutronclient.common.exceptions.InternalServerError: \u003c!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003chtml\u003e\u003chead\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003ctitle\u003e500 Internal Server Error\u003c/title\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003c/head\u003e\u003cbody\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003ch1\u003eInternal Server Error\u003c/h1\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003cp\u003eThe server encountered an internal error or\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi misconfiguration and was unable to complete\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi your request.\u003c/p\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003cp\u003ePlease contact the server administrator at\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi  webmaster@localhost to inform them of the time this error occurred,\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi  and the actions you performed just before this error.\u003c/p\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003cp\u003eMore information about this error may be available\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi in the server error log.\u003c/p\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003chr\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003caddress\u003eApache/2.4.52 (Ubuntu) Server at 158.69.71.201 Port 80\u003c/address\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \u003c/body\u003e\u003c/html\u003e\nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \nMay 20 17:49:58.466525 np0040835506 devstack@n-api.service[170467]: ERROR nova.api.openstack.wsgi \nMay 20 17:49:58.467547 np0040835506 devstack@n-api.service[170467]: INFO nova.api.openstack.wsgi [None req-de5bd111-6408-45a5-b2fb-f2a480408ab9 cinder_grenade cinder_grenade] HTTP exception thrown: Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible.\nMay 20 17:49:58.467547 np0040835506 devstack@n-api.service[170467]: \u003cclass \u0027neutronclient.common.exceptions.InternalServerError\u0027\u003e\nMay 20 17:49:58.467547 np0040835506 devstack@n-api.service[170467]: DEBUG nova.api.openstack.wsgi [None req-de5bd111-6408-45a5-b2fb-f2a480408ab9 cinder_grenade cinder_grenade] Returning 500 to user: Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible.\n```\nNeutron doesn\u0027t show any 500s AFAICT, but has some pipe errors that might be related:\n```\nMay 20 17:44:38.915738 np0040835506 devstack@neutron-api.service[75841]: INFO oslo.messaging._drivers.impl_rabbit [-] A recoverable connection/channel error occurred, trying to reconnect: [Errno 104] Connection reset by peer\nMay 20 17:44:38.916616 np0040835506 devstack@neutron-api.service[75841]: Tue May 20 17:44:38 2025 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /networking/v2.0/ports?device_id\u003ddac392dc-78b1-4cbf-920c-2001213cb06d (ip 158.69.71.201) !!!\nMay 20 17:44:38.919968 np0040835506 devstack@neutron-api.service[75841]: INFO oslo.messaging._drivers.impl_rabbit [-] A recoverable connection/channel error occurred, trying to reconnect: Server unexpectedly closed connection\nMay 20 17:44:38.920134 np0040835506 devstack@neutron-api.service[75841]: Tue May 20 17:44:38 2025 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /networking/v2.0/ports?device_id\u003ddac392dc-78b1-4cbf-920c-2001213cb06d (ip 158.69.71.201) !!!\n```","commit_id":"8df07b9917912ada421a9287b92284e35d84625f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0a4e3514518942630b5d2946f2669c65bad0d907","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"d03c33f9_1023d869","updated":"2025-05-21 13:56:22.000000000","message":"recheck","commit_id":"82b19644795ea8c14b5077ab46f0fbd4855bdd70"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cd978cea897aa18c51f9602af2ff524ec053c6ec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"219c9cfa_1ca8b05b","updated":"2025-05-21 09:34:37.000000000","message":"recheck\n\n```\nTASK [run-grenade : Run grenade]\n2025-05-20 21:35:40.355548 | controller | Creating /opt/stack/logs....\n2025-05-20 21:35:40.381312 | controller | Running in summary mode:\n2025-05-20 21:35:40.381358 | controller |   Full logs found at \u003d\u003e /opt/stack/logs/grenade.sh.log.2025-05-20-213540\n2025-05-20 21:35:40.381384 | controller |   Summary logs at \u003d\u003e /opt/stack/logs/grenade.sh.log.2025-05-20-213540.2025-05-20-213540.summary\n2025-05-20 21:35:40.418884 | controller | 2025-05-20 21:35:40.418 | grenade.sh log /opt/stack/logs/grenade.sh.log.2025-05-20-213540\n2025-05-20 21:35:42.713090 | controller | 2025-05-20 21:35:42.712 | Caching downloaded images\n2025-05-20 21:35:42.798264 | controller | 2025-05-20 21:35:42.798 | Running base smoke test\n2025-05-20 21:46:09.860597 | controller | 2025-05-20 21:46:09.859 | Running resource phase: early_create\n2025-05-20 21:46:34.996061 | controller | 2025-05-20 21:46:34.995 | Running resource phase: create\n2025-05-20 21:50:25.556771 | controller | 2025-05-20 21:50:25.556 | Running resource phase: verify pre-upgrade\n2025-05-20 21:50:56.289594 | controller | 2025-05-20 21:50:56.289 | Saving current state information\n2025-05-20 21:51:11.597122 | controller | 2025-05-20 21:51:11.596 | Shutting down all services on base devstack...\n2025-05-20 21:51:54.418061 | controller | 2025-05-20 21:51:54.417 | Running resource phase: verify_noapi pre-upgrade\n2025-05-20 21:52:02.206037 | controller | 2025-05-20 21:52:02.205 | Preparing the target devstack environment\n2025-05-20 21:52:05.469887 | controller | 2025-05-20 21:52:05.469 | Installing package prerequisites\n2025-05-20 21:52:37.727104 | controller | 2025-05-20 21:52:37.726 | Upgrading keystone...\n2025-05-20 21:53:19.883107 | controller | 2025-05-20 21:53:19.882 | Upgrading placement...\n2025-05-20 21:53:45.126006 | controller | 2025-05-20 21:53:45.125 | Upgrading swift...\n2025-05-20 21:54:15.220077 | controller | 2025-05-20 21:54:15.219 | Upgrading glance...\n2025-05-20 21:54:44.725748 | controller | 2025-05-20 21:54:44.725 | Upgrading neutron...\n2025-05-20 21:55:38.278082 | controller | 2025-05-20 21:55:38.277 | Upgrading nova...\n2025-05-20 21:56:52.577631 | controller | 2025-05-20 21:56:52.577 | Upgrading cinder...\n2025-05-20 21:57:34.406124 | controller | 2025-05-20 21:57:34.405 | Running upgrade-tempest\n2025-05-20 21:58:07.181178 | controller | 2025-05-20 21:58:07.180 | Running resource phase: verify post-upgrade\n2025-05-20 21:59:15.671960 | controller | 2025-05-20 21:59:15.671 | Dumping new databases\n2025-05-21 00:11:00.388916 | RUN END RESULT_TIMED_OUT: [untrusted : opendev.org/openstack/grenade/playbooks/grenade.yaml@master]\n2025-05-21 00:11:00.396636 | POST-RUN START: [untrusted : opendev.org/openstack/grenade/playbooks/post.yaml@master]\n```","commit_id":"82b19644795ea8c14b5077ab46f0fbd4855bdd70"}],"swift/common/middleware/proxy_logging.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"02f0379d164db5ead56340c6ed0416e1b9861952","unresolved":true,"context_lines":[{"line_number":534,"context_line":"                    if self.statsd_emit_xfer_bytes and \\"},{"line_number":535,"context_line":"                            labels[\u0027server_type\u0027] is not None:"},{"line_number":536,"context_line":"                        self.access_logger.update_stats("},{"line_number":537,"context_line":"                            \u0027swift_proxy_response_body_output_bytes\u0027,"},{"line_number":538,"context_line":"                            bytes_sent,"},{"line_number":539,"context_line":"                            labels\u003dlabels,"},{"line_number":540,"context_line":"                        )"}],"source_content_type":"text/x-python","patch_set":9,"id":"b392345d_32e44f72","line":537,"range":{"start_line":537,"start_character":29,"end_line":537,"end_character":67},"updated":"2024-06-28 18:38:52.000000000","message":"Right; this will be a frequently-updating counter, distinct from the existing `swift_proxy_response_body_bytes` metric which might find better use as a histogram.","commit_id":"2ccdcc708daabbacb91a655a36941232af6da22b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"480b0e9953a3fb9943c36a5a8397cd4d188e2e75","unresolved":false,"context_lines":[{"line_number":534,"context_line":"                    if self.statsd_emit_xfer_bytes and \\"},{"line_number":535,"context_line":"                            labels[\u0027server_type\u0027] is not None:"},{"line_number":536,"context_line":"                        self.access_logger.update_stats("},{"line_number":537,"context_line":"                            \u0027swift_proxy_response_body_output_bytes\u0027,"},{"line_number":538,"context_line":"                            bytes_sent,"},{"line_number":539,"context_line":"                            labels\u003dlabels,"},{"line_number":540,"context_line":"                        )"}],"source_content_type":"text/x-python","patch_set":9,"id":"b66a12f4_ec0fae7d","line":537,"range":{"start_line":537,"start_character":29,"end_line":537,"end_character":67},"in_reply_to":"b392345d_32e44f72","updated":"2024-07-11 16:31:33.000000000","message":"Acknowledged","commit_id":"2ccdcc708daabbacb91a655a36941232af6da22b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"02f0379d164db5ead56340c6ed0416e1b9861952","unresolved":true,"context_lines":[{"line_number":537,"context_line":"                            \u0027swift_proxy_response_body_output_bytes\u0027,"},{"line_number":538,"context_line":"                            bytes_sent,"},{"line_number":539,"context_line":"                            labels\u003dlabels,"},{"line_number":540,"context_line":"                        )"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"                    yield chunk"},{"line_number":543,"context_line":"            except GeneratorExit:  # generator was closed before we finished"}],"source_content_type":"text/x-python","patch_set":9,"id":"477c414f_222d7210","line":540,"updated":"2024-06-28 18:38:52.000000000","message":"I suspect adding the stat packet on every chunk will noticeably hurt performance and we\u0027d be happier emitting every 10-100 chunks, though I admit I have no measurements to back up my claim.\n\nMaybe `statsd_emit_xfer_bytes` would be better as a config option for how often to emit? Not sure whether that would be better measured in bytes or seconds.","commit_id":"2ccdcc708daabbacb91a655a36941232af6da22b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"752fd6b06fcffda0452a9b881adef8277d80bac1","unresolved":true,"context_lines":[{"line_number":537,"context_line":"                            \u0027swift_proxy_response_body_output_bytes\u0027,"},{"line_number":538,"context_line":"                            bytes_sent,"},{"line_number":539,"context_line":"                            labels\u003dlabels,"},{"line_number":540,"context_line":"                        )"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"                    yield chunk"},{"line_number":543,"context_line":"            except GeneratorExit:  # generator was closed before we finished"}],"source_content_type":"text/x-python","patch_set":9,"id":"6fd76c5a_edca0b3c","line":540,"in_reply_to":"477c414f_222d7210","updated":"2024-07-02 15:59:30.000000000","message":"Good point, Tim. Changing the config option to be in bytes or seconds","commit_id":"2ccdcc708daabbacb91a655a36941232af6da22b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"480b0e9953a3fb9943c36a5a8397cd4d188e2e75","unresolved":false,"context_lines":[{"line_number":537,"context_line":"                            \u0027swift_proxy_response_body_output_bytes\u0027,"},{"line_number":538,"context_line":"                            bytes_sent,"},{"line_number":539,"context_line":"                            labels\u003dlabels,"},{"line_number":540,"context_line":"                        )"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"                    yield chunk"},{"line_number":543,"context_line":"            except GeneratorExit:  # generator was closed before we finished"}],"source_content_type":"text/x-python","patch_set":9,"id":"f5942742_a72a11da","line":540,"in_reply_to":"6fd76c5a_edca0b3c","updated":"2024-07-11 16:31:33.000000000","message":"Acknowledged","commit_id":"2ccdcc708daabbacb91a655a36941232af6da22b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":145,"context_line":"                    \u0027log_statsd_default_sample_rate\u0027,"},{"line_number":146,"context_line":"                    \u0027log_statsd_sample_rate_factor\u0027,"},{"line_number":147,"context_line":"                    \u0027log_statsd_metric_prefix\u0027,"},{"line_number":148,"context_line":"                    \u0027log_statsd_label_mode\u0027,"},{"line_number":149,"context_line":"                    \u0027log_statsd_emit_legacy\u0027):"},{"line_number":150,"context_line":"            value \u003d conf.get(\u0027access_\u0027 + key, conf.get(key, None))"},{"line_number":151,"context_line":"            if value:"}],"source_content_type":"text/x-python","patch_set":10,"id":"0efd61ba_d32a632b","line":148,"updated":"2024-07-12 12:30:31.000000000","message":"The new conf options do not have the ``log_`` prefix.\n\nI reverted these changes and no tests failed.\n\nSuggested fix:\n\n```\ndiff --git a/swift/common/middleware/proxy_logging.py b/swift/common/middleware/proxy_logging.py\nindex 10722782d..f492ab0bd 100644\n--- a/swift/common/middleware/proxy_logging.py\n+++ b/swift/common/middleware/proxy_logging.py\n@@ -145,8 +145,8 @@ class ProxyLoggingMiddleware(object):\n                     \u0027log_statsd_default_sample_rate\u0027,\n                     \u0027log_statsd_sample_rate_factor\u0027,\n                     \u0027log_statsd_metric_prefix\u0027,\n-                    \u0027log_statsd_label_mode\u0027,\n-                    \u0027log_statsd_emit_legacy\u0027):\n+                    \u0027statsd_label_mode\u0027,\n+                    \u0027statsd_emit_legacy\u0027):\n             value \u003d conf.get(\u0027access_\u0027 + key, conf.get(key, None))\n             if value:\n                 access_log_conf[key] \u003d value\ndiff --git a/test/unit/common/middleware/test_proxy_logging.py b/test/unit/common/middleware/test_proxy_logging.py\nindex e10cb9d51..b93d71692 100644\n--- a/test/unit/common/middleware/test_proxy_logging.py\n+++ b/test/unit/common/middleware/test_proxy_logging.py\n@@ -1619,6 +1619,24 @@ class TestProxyLogging(unittest.TestCase):\n         handler \u003d get_logger.handler4logger[app.access_logger.logger]\n         self.assertEqual(SysLogHandler.LOG_LOCAL7, handler.facility)\n\n+    def test_conf_statsd_label_mode(self):\n+        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), {})\n+        self.assertEqual(\u0027disabled\u0027,\n+                         app.access_logger.logger.statsd_client.label_mode)\n+\n+        conf \u003d {\u0027statsd_label_mode\u0027: \u0027graphite\u0027}\n+        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), conf)\n+        self.assertEqual(\u0027graphite\u0027,\n+                         app.access_logger.logger.statsd_client.label_mode)\n+\n+    def test_conf_statsd_emit_legacy(self):\n+        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), {})\n+        self.assertTrue(app.access_logger.logger.statsd_client.emit_legacy)\n+\n+        conf \u003d {\u0027statsd_emit_legacy\u0027: \u0027no\u0027}\n+        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), conf)\n+        self.assertFalse(app.access_logger.logger.statsd_client.emit_legacy)\n+\n     def test_filter(self):\n         factory \u003d proxy_logging.filter_factory({})\n         self.assertTrue(callable(factory))\n```","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                    \u0027log_statsd_default_sample_rate\u0027,"},{"line_number":146,"context_line":"                    \u0027log_statsd_sample_rate_factor\u0027,"},{"line_number":147,"context_line":"                    \u0027log_statsd_metric_prefix\u0027,"},{"line_number":148,"context_line":"                    \u0027log_statsd_label_mode\u0027,"},{"line_number":149,"context_line":"                    \u0027log_statsd_emit_legacy\u0027):"},{"line_number":150,"context_line":"            value \u003d conf.get(\u0027access_\u0027 + key, conf.get(key, None))"},{"line_number":151,"context_line":"            if value:"}],"source_content_type":"text/x-python","patch_set":10,"id":"eb9b0c41_1d73199d","line":148,"in_reply_to":"0efd61ba_d32a632b","updated":"2024-07-16 01:29:41.000000000","message":"this patch no longer applies for me.  It looks like it these tests and fix have already been squashed in.","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":414,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":415,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":416,"context_line":"        labels \u003d {"},{"line_number":417,"context_line":"            \u0027server_type\u0027: self.get_metric_name_type(req),"},{"line_number":418,"context_line":"            \u0027method\u0027: (method if method in self.valid_methods"},{"line_number":419,"context_line":"                       else \u0027BAD_METHOD\u0027),"},{"line_number":420,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":10,"id":"b3679fe0_d9c3bd9f","line":417,"updated":"2024-07-12 12:30:31.000000000","message":"``resource_type`` might be a better label for [object|container|account]","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":414,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":415,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":416,"context_line":"        labels \u003d {"},{"line_number":417,"context_line":"            \u0027server_type\u0027: self.get_metric_name_type(req),"},{"line_number":418,"context_line":"            \u0027method\u0027: (method if method in self.valid_methods"},{"line_number":419,"context_line":"                       else \u0027BAD_METHOD\u0027),"},{"line_number":420,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":10,"id":"cef24959_80b0a7fc","line":417,"in_reply_to":"0face550_a9836d60","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":414,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":415,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":416,"context_line":"        labels \u003d {"},{"line_number":417,"context_line":"            \u0027server_type\u0027: self.get_metric_name_type(req),"},{"line_number":418,"context_line":"            \u0027method\u0027: (method if method in self.valid_methods"},{"line_number":419,"context_line":"                       else \u0027BAD_METHOD\u0027),"},{"line_number":420,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":10,"id":"0face550_a9836d60","line":417,"in_reply_to":"b3679fe0_d9c3bd9f","updated":"2024-07-16 01:29:41.000000000","message":"I think we were trying (?) to follow following the convention from our SRE\u0027s parsing of the existing non-labled metrics:\n\n```\n      - match: ^(internal|subrequest|inventory-ic)*(\\.)*proxy-server\\.(account|container|object|\\w+)\\.([A-Z_]*)\\.([0-9]{3})\\.timing\n        match_type: regex\n        name: \"ss_proxy_server_timing\"\n        labels:\n          hostname: \"s8k-pdx01-k10-obj-16.nsv.pdx01.nvmetal.net$2$1\"\n          uuid: \"\"\n          type: \"$3\"\n          method: \"$4\"\n          status: \"$5\"\n```\n\nalthough it looks like they just use \"type\" anyway?  which might be appropriate and unambigous for a `swift_proxy_request_timing` metric.","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":428,"context_line":"                policy_index is not None and \\"},{"line_number":429,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"},{"line_number":430,"context_line":"            labels[\u0027policy\u0027] \u003d policy_index"},{"line_number":431,"context_line":"        return labels"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def __call__(self, env, start_response):"},{"line_number":434,"context_line":"        if self.req_already_logged(env):"}],"source_content_type":"text/x-python","patch_set":10,"id":"809126b7_9615fa85","line":431,"updated":"2024-07-12 12:30:31.000000000","message":"nit: please move this method above it\u0027s first call site (at line 362)\n\nupdate: NM, I see it\u0027s below the methods it calls 😐","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                policy_index is not None and \\"},{"line_number":429,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"},{"line_number":430,"context_line":"            labels[\u0027policy\u0027] \u003d policy_index"},{"line_number":431,"context_line":"        return labels"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def __call__(self, env, start_response):"},{"line_number":434,"context_line":"        if self.req_already_logged(env):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fe616119_0506d4fc","line":431,"in_reply_to":"809126b7_9615fa85","updated":"2024-07-16 01:29:41.000000000","message":"`statsd_metric_labels` is called on\n\nL362\nL458\nL511\n\nit\u0027s defined on L421\n\nthe callsite in L362 is inside `log_request` which is only called from `__call__` in an `iter_response` closure\n\nit seems like `get_metric_name_type` `statsd_metric_name` `statsd_metric_name_policy` and `statsd_metric_labels` could have reasonably all been defined above `log_request` but originally it was just easier to peel the method extraction off the bottom:\n\n20089: Adds first-byte latency timings for GET requests. | https://review.opendev.org/c/openstack/swift/+/20089\n\nprobably not worth it impose unrelated code movement in this change.","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":364,"context_line":"            acc\u003dreplacements[\u0027account\u0027],"},{"line_number":365,"context_line":"            cont\u003dreplacements[\u0027container\u0027],"},{"line_number":366,"context_line":"            policy_index\u003dpolicy_index)"},{"line_number":367,"context_line":"        if labels[\u0027server_type\u0027] is not None:"},{"line_number":368,"context_line":"            self.access_logger.timing("},{"line_number":369,"context_line":"                \u0027swift_proxy_request_timing\u0027,"},{"line_number":370,"context_line":"                (end_time - start_time) * 1000,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bb48ca8b_1a9c8761","line":367,"updated":"2024-07-12 12:30:31.000000000","message":"this check is repeated every time self.statsd_metric_labels is called, so you could just have self.statsd_metric_labels return None - BUT I don\u0027t think the server_type can ever be None?","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            acc\u003dreplacements[\u0027account\u0027],"},{"line_number":365,"context_line":"            cont\u003dreplacements[\u0027container\u0027],"},{"line_number":366,"context_line":"            policy_index\u003dpolicy_index)"},{"line_number":367,"context_line":"        if labels[\u0027server_type\u0027] is not None:"},{"line_number":368,"context_line":"            self.access_logger.timing("},{"line_number":369,"context_line":"                \u0027swift_proxy_request_timing\u0027,"},{"line_number":370,"context_line":"                (end_time - start_time) * 1000,"}],"source_content_type":"text/x-python","patch_set":11,"id":"c5d5c6f1_2ba190cd","line":367,"in_reply_to":"8b110441_67ab4d0e","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":364,"context_line":"            acc\u003dreplacements[\u0027account\u0027],"},{"line_number":365,"context_line":"            cont\u003dreplacements[\u0027container\u0027],"},{"line_number":366,"context_line":"            policy_index\u003dpolicy_index)"},{"line_number":367,"context_line":"        if labels[\u0027server_type\u0027] is not None:"},{"line_number":368,"context_line":"            self.access_logger.timing("},{"line_number":369,"context_line":"                \u0027swift_proxy_request_timing\u0027,"},{"line_number":370,"context_line":"                (end_time - start_time) * 1000,"}],"source_content_type":"text/x-python","patch_set":11,"id":"8b110441_67ab4d0e","line":367,"in_reply_to":"bb48ca8b_1a9c8761","updated":"2024-07-16 01:29:41.000000000","message":"i change this to `if True` and all tests pass - i have no idea what\u0027s going on here; but at least it\u0027s limited to new labeled metrics.  When I functionally tested I was getting the new labeled metrics when I turned on `statsd_label_mode \u003d dogstatsd`","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"70245c8b036398f96570bcd51c915adf29ecab98","unresolved":true,"context_lines":[{"line_number":146,"context_line":"                    \u0027log_statsd_sample_rate_factor\u0027,"},{"line_number":147,"context_line":"                    \u0027log_statsd_metric_prefix\u0027,"},{"line_number":148,"context_line":"                    \u0027statsd_label_mode\u0027,"},{"line_number":149,"context_line":"                    \u0027statsd_emit_legacy\u0027):"},{"line_number":150,"context_line":"            value \u003d conf.get(\u0027access_\u0027 + key, conf.get(key, None))"},{"line_number":151,"context_line":"            if value:"},{"line_number":152,"context_line":"                access_log_conf[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":12,"id":"0b9ff86d_4b371ba0","line":149,"updated":"2024-07-15 17:04:00.000000000","message":"this still doesn\u0027t seem to have any test coverage in test_proxy_logging.py\n\nI suggest adding the tests I left in my previous comment https://review.opendev.org/c/openstack/swift/+/917711/comment/0efd61ba_d32a632b/","commit_id":"a4c19cd279c1a0e0a6caa56e7e7e2993f2f8ea6c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                    \u0027log_statsd_sample_rate_factor\u0027,"},{"line_number":147,"context_line":"                    \u0027log_statsd_metric_prefix\u0027,"},{"line_number":148,"context_line":"                    \u0027statsd_label_mode\u0027,"},{"line_number":149,"context_line":"                    \u0027statsd_emit_legacy\u0027):"},{"line_number":150,"context_line":"            value \u003d conf.get(\u0027access_\u0027 + key, conf.get(key, None))"},{"line_number":151,"context_line":"            if value:"},{"line_number":152,"context_line":"                access_log_conf[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":12,"id":"31e9265a_cba00180","line":149,"in_reply_to":"0b9ff86d_4b371ba0","updated":"2024-07-16 01:29:41.000000000","message":"that diff no longer applies for me:\n\n```\nerror: patch failed: swift/common/middleware/proxy_logging.py:145\nerror: swift/common/middleware/proxy_logging.py: patch does not apply\nerror: patch failed: test/unit/common/middleware/test_proxy_logging.py:1619\nerror: test/unit/common/middleware/test_proxy_logging.py: patch does not apply\n```\n\nit looks like they got added?\n\n```\n(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one/swift$ grep test_conf_statsd_label_mode test/unit/common/middleware/test_proxy_logging.py\n    def test_conf_statsd_label_mode(self):\n```","commit_id":"a4c19cd279c1a0e0a6caa56e7e7e2993f2f8ea6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"64413a17668c1140ff8dc96ddb97779ba075215d","unresolved":true,"context_lines":[{"line_number":146,"context_line":"                    \u0027log_statsd_sample_rate_factor\u0027,"},{"line_number":147,"context_line":"                    \u0027log_statsd_metric_prefix\u0027,"},{"line_number":148,"context_line":"                    \u0027statsd_label_mode\u0027,"},{"line_number":149,"context_line":"                    \u0027statsd_emit_legacy\u0027):"},{"line_number":150,"context_line":"            value \u003d conf.get(\u0027access_\u0027 + key, conf.get(key, None))"},{"line_number":151,"context_line":"            if value:"},{"line_number":152,"context_line":"                access_log_conf[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":13,"id":"f6497100_da6f21fd","line":149,"updated":"2024-07-25 15:30:48.000000000","message":"over in this patch https://review.opendev.org/c/openstack/swift/+/922518 we\u0027re trying to deprecate the use of the ``access_`` and ``log _`` prefixes, so I don\u0027t think we want to allow ``access_statsd_label_mode`` or ``access_statsd_emit_legacy``.","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                    \u0027log_statsd_sample_rate_factor\u0027,"},{"line_number":147,"context_line":"                    \u0027log_statsd_metric_prefix\u0027,"},{"line_number":148,"context_line":"                    \u0027statsd_label_mode\u0027,"},{"line_number":149,"context_line":"                    \u0027statsd_emit_legacy\u0027):"},{"line_number":150,"context_line":"            value \u003d conf.get(\u0027access_\u0027 + key, conf.get(key, None))"},{"line_number":151,"context_line":"            if value:"},{"line_number":152,"context_line":"                access_log_conf[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":13,"id":"b1bf5e03_d28b9df2","line":149,"in_reply_to":"f6497100_da6f21fd","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c09e45471f068a768cc1f8d30822b386bae9ec1d","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        if statsd_emit_buffer_xfer_bytes_ms \u003c 0:"},{"line_number":163,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d -1"},{"line_number":164,"context_line":"        elif statsd_emit_buffer_xfer_bytes_ms \u003d\u003d 0:"},{"line_number":165,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d 0"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d ("},{"line_number":168,"context_line":"                statsd_emit_buffer_xfer_bytes_ms / 1000.0)"}],"source_content_type":"text/x-python","patch_set":13,"id":"0c878640_511777de","line":165,"updated":"2024-08-02 16:26:58.000000000","message":"this seems overly defensive - curious if there\u0027s something more nuanced going on here that you\u0027re worried about?","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce1117eadafb0309bc6d3ac7e8a42363d3fc5aa","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        if statsd_emit_buffer_xfer_bytes_ms \u003c 0:"},{"line_number":163,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d -1"},{"line_number":164,"context_line":"        elif statsd_emit_buffer_xfer_bytes_ms \u003d\u003d 0:"},{"line_number":165,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d 0"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d ("},{"line_number":168,"context_line":"                statsd_emit_buffer_xfer_bytes_ms / 1000.0)"}],"source_content_type":"text/x-python","patch_set":13,"id":"f9b6cd86_57b97c88","line":165,"in_reply_to":"0c878640_511777de","updated":"2024-09-09 13:07:35.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c09e45471f068a768cc1f8d30822b386bae9ec1d","unresolved":true,"context_lines":[{"line_number":165,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d 0"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d ("},{"line_number":168,"context_line":"                statsd_emit_buffer_xfer_bytes_ms / 1000.0)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def check_log_msg_template_validity(self):"},{"line_number":171,"context_line":"        replacements \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"32a8fbe6_a08707fb","line":168,"updated":"2024-08-02 16:26:58.000000000","message":"I think we have some precedent for using floats for config options that are supposed to be expressed in seconds.\n\ne.g.\n\n    get_requests_per_device_per_second \u003d 0.0\n    \nand SRE configures them as `0.2` to mean 200ms or whatever.","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce1117eadafb0309bc6d3ac7e8a42363d3fc5aa","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d 0"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            self.emit_buffer_xfer_bytes_sec \u003d ("},{"line_number":168,"context_line":"                statsd_emit_buffer_xfer_bytes_ms / 1000.0)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def check_log_msg_template_validity(self):"},{"line_number":171,"context_line":"        replacements \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"a7128cbb_f40235a6","line":168,"in_reply_to":"32a8fbe6_a08707fb","updated":"2024-09-09 13:07:35.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":447,"context_line":"        req \u003d Request(env)"},{"line_number":448,"context_line":"        method \u003d self.method_from_req(req)"},{"line_number":449,"context_line":"        acc, cont, obj \u003d None, None, None"},{"line_number":450,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":451,"context_line":"        if swift_path.startswith(\u0027/v1/\u0027):"},{"line_number":452,"context_line":"            _, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":453,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1daf655a_ceae757a","line":450,"updated":"2024-07-16 01:29:41.000000000","message":"this may not be set until you\u0027re in the response path","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        req \u003d Request(env)"},{"line_number":448,"context_line":"        method \u003d self.method_from_req(req)"},{"line_number":449,"context_line":"        acc, cont, obj \u003d None, None, None"},{"line_number":450,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":451,"context_line":"        if swift_path.startswith(\u0027/v1/\u0027):"},{"line_number":452,"context_line":"            _, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":453,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"}],"source_content_type":"text/x-python","patch_set":13,"id":"85b7a31b_a4da23c0","line":450,"in_reply_to":"1daf655a_ceae757a","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"92e3069c7c89a0a6b08cc4f31513aeb751884e9b","unresolved":true,"context_lines":[{"line_number":448,"context_line":"        method \u003d self.method_from_req(req)"},{"line_number":449,"context_line":"        acc, cont, obj \u003d None, None, None"},{"line_number":450,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":451,"context_line":"        if swift_path.startswith(\u0027/v1/\u0027):"},{"line_number":452,"context_line":"            _, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":453,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":454,"context_line":"                            self.anonymization_salt)"}],"source_content_type":"text/x-python","patch_set":13,"id":"d3f0f22b_ae4d9fc4","line":451,"range":{"start_line":451,"start_character":35,"end_line":451,"end_character":37},"updated":"2024-07-17 22:00:33.000000000","message":"Doesn\u0027t come up often in practice, but `/v1.0/` is a valid prefix for a swift request -- you should split then check the first piece with `swift.common.constraints.valid_api_version`","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        method \u003d self.method_from_req(req)"},{"line_number":449,"context_line":"        acc, cont, obj \u003d None, None, None"},{"line_number":450,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":451,"context_line":"        if swift_path.startswith(\u0027/v1/\u0027):"},{"line_number":452,"context_line":"            _, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":453,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":454,"context_line":"                            self.anonymization_salt)"}],"source_content_type":"text/x-python","patch_set":13,"id":"34bec464_afe3e332","line":451,"range":{"start_line":451,"start_character":35,"end_line":451,"end_character":37},"in_reply_to":"d3f0f22b_ae4d9fc4","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"92e3069c7c89a0a6b08cc4f31513aeb751884e9b","unresolved":true,"context_lines":[{"line_number":546,"context_line":"                        emit_bytes +\u003d len(chunk)"},{"line_number":547,"context_line":"                        now \u003d time.time()"},{"line_number":548,"context_line":"                        if self.emit_buffer_xfer_bytes_sec \u003d\u003d 0 or \\"},{"line_number":549,"context_line":"                                next_emit_time is None or \\"},{"line_number":550,"context_line":"                                next_emit_time \u003c\u003d now:"},{"line_number":551,"context_line":"                            self.access_logger.update_stats("},{"line_number":552,"context_line":"                                \u0027swift_proxy_response_body_output_bytes\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"e33381c3_9a7aa042","line":549,"updated":"2024-07-17 22:00:33.000000000","message":"We can drop this by initializing `next_emit_time \u003d 0`","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":546,"context_line":"                        emit_bytes +\u003d len(chunk)"},{"line_number":547,"context_line":"                        now \u003d time.time()"},{"line_number":548,"context_line":"                        if self.emit_buffer_xfer_bytes_sec \u003d\u003d 0 or \\"},{"line_number":549,"context_line":"                                next_emit_time is None or \\"},{"line_number":550,"context_line":"                                next_emit_time \u003c\u003d now:"},{"line_number":551,"context_line":"                            self.access_logger.update_stats("},{"line_number":552,"context_line":"                                \u0027swift_proxy_response_body_output_bytes\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"91f11b1b_98b2bf49","line":549,"in_reply_to":"e33381c3_9a7aa042","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"92e3069c7c89a0a6b08cc4f31513aeb751884e9b","unresolved":true,"context_lines":[{"line_number":564,"context_line":"            except Exception:"},{"line_number":565,"context_line":"                env[\u0027swift.proxy_logging_status\u0027] \u003d 500"},{"line_number":566,"context_line":"                raise"},{"line_number":567,"context_line":"            finally:"},{"line_number":568,"context_line":"                env.setdefault(\u0027swift.proxy_logging_status\u0027, wire_status_int)"},{"line_number":569,"context_line":"                status_int \u003d status_int_for_logging()"},{"line_number":570,"context_line":"                self.log_request("}],"source_content_type":"text/x-python","patch_set":13,"id":"c6d172fa_e88e06f6","line":567,"updated":"2024-07-17 22:00:33.000000000","message":"We need another emit in here, if `emit_bytes` is non-zero.","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":564,"context_line":"            except Exception:"},{"line_number":565,"context_line":"                env[\u0027swift.proxy_logging_status\u0027] \u003d 500"},{"line_number":566,"context_line":"                raise"},{"line_number":567,"context_line":"            finally:"},{"line_number":568,"context_line":"                env.setdefault(\u0027swift.proxy_logging_status\u0027, wire_status_int)"},{"line_number":569,"context_line":"                status_int \u003d status_int_for_logging()"},{"line_number":570,"context_line":"                self.log_request("}],"source_content_type":"text/x-python","patch_set":13,"id":"82dd2d82_de9cc609","line":567,"in_reply_to":"c6d172fa_e88e06f6","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                    \u0027statsd_emit_legacy\u0027):"},{"line_number":155,"context_line":"            value \u003d conf.get(key, None)"},{"line_number":156,"context_line":"            if value:"},{"line_number":157,"context_line":"                access_log_conf[key] \u003d value"},{"line_number":158,"context_line":"        self.access_logger \u003d logger or get_logger("},{"line_number":159,"context_line":"            access_log_conf,"},{"line_number":160,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"1b0ac61c_03dcbf4c","line":157,"updated":"2024-08-02 16:46:16.000000000","message":"It\u0027s unfortunate that proxy_logging has to be aware of changes to statsd options. I\u0027ve tried to get away from this over in the log_statsd* deprecation patch by providing a helper function in statsd_client.py to extract all statsd related options: https://review.opendev.org/c/openstack/swift/+/922518/9/swift/common/middleware/proxy_logging.py \n\nBut, for now, this is ok.","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce1117eadafb0309bc6d3ac7e8a42363d3fc5aa","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                    \u0027statsd_emit_legacy\u0027):"},{"line_number":155,"context_line":"            value \u003d conf.get(key, None)"},{"line_number":156,"context_line":"            if value:"},{"line_number":157,"context_line":"                access_log_conf[key] \u003d value"},{"line_number":158,"context_line":"        self.access_logger \u003d logger or get_logger("},{"line_number":159,"context_line":"            access_log_conf,"},{"line_number":160,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9d2c76eb_c76e6e2c","line":157,"in_reply_to":"1b0ac61c_03dcbf4c","updated":"2024-09-09 13:07:35.000000000","message":"is it even needed?  it\u0027s because if we pass in conf directly we might loose `access_log_statsd_host`???\n\nMaybe this code should go the other way and create a log_conf that overwrites all the `access_log_` prefixed values into `log_` prefixed values:\n\n```\nlog_conf \u003d dict(conf)\nlog_conf.update({\n    k[len(\u0027access_\u0027):] v\n    for k, v in conf\n    if k.startswith(\u0027access_log_\u0027)\n})\n```","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                    \u0027statsd_emit_legacy\u0027):"},{"line_number":155,"context_line":"            value \u003d conf.get(key, None)"},{"line_number":156,"context_line":"            if value:"},{"line_number":157,"context_line":"                access_log_conf[key] \u003d value"},{"line_number":158,"context_line":"        self.access_logger \u003d logger or get_logger("},{"line_number":159,"context_line":"            access_log_conf,"},{"line_number":160,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"2b8767ac_d99e95ba","line":157,"in_reply_to":"9d2c76eb_c76e6e2c","updated":"2024-09-10 15:35:18.000000000","message":"Acknowledged","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":385,"context_line":"            bad_path \u003d True"},{"line_number":386,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":387,"context_line":"            acc, cont, obj \u003d None, None, None"},{"line_number":388,"context_line":"        return acc, cont, obj"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def get_metric_name_type(self, req):"},{"line_number":391,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"}],"source_content_type":"text/x-python","patch_set":15,"id":"63fc69ad_2c592356","line":388,"updated":"2024-08-02 16:46:16.000000000","message":"It would be nice to avoid setting a boolean to indicate that an exception was raised\n\n```\n    def get_aco_from_path(self, swift_path):\n        try:\n            version, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)\n            if not valid_api_version(version):\n                raise ValueError\n        except ValueError:\n            version, acc, cont, obj \u003d None, None, None, None\n        return acc, cont, obj\n\n```\n\nsee https://review.opendev.org/c/openstack/swift/+/925619 sq? proxy-logging helper methods refactor","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94d9034b38adb04db0788d061e5a3148171559b2","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            bad_path \u003d True"},{"line_number":386,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":387,"context_line":"            acc, cont, obj \u003d None, None, None"},{"line_number":388,"context_line":"        return acc, cont, obj"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def get_metric_name_type(self, req):"},{"line_number":391,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"}],"source_content_type":"text/x-python","patch_set":15,"id":"8837578d_6fd5639e","line":388,"in_reply_to":"63fc69ad_2c592356","updated":"2024-08-06 15:13:58.000000000","message":"Done","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce1117eadafb0309bc6d3ac7e8a42363d3fc5aa","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            bad_path \u003d True"},{"line_number":386,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":387,"context_line":"            acc, cont, obj \u003d None, None, None"},{"line_number":388,"context_line":"        return acc, cont, obj"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def get_metric_name_type(self, req):"},{"line_number":391,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"}],"source_content_type":"text/x-python","patch_set":15,"id":"c2568410_104a4553","line":388,"in_reply_to":"63fc69ad_2c592356","updated":"2024-09-09 13:07:35.000000000","message":"Done","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":390,"context_line":"    def get_metric_name_type(self, req):"},{"line_number":391,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":392,"context_line":"        try:"},{"line_number":393,"context_line":"            version, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":394,"context_line":"            bad_path \u003d False"},{"line_number":395,"context_line":"        except ValueError:"},{"line_number":396,"context_line":"            bad_path \u003d True"}],"source_content_type":"text/x-python","patch_set":15,"id":"0eb2673e_b240c07e","line":393,"range":{"start_line":393,"start_character":61,"end_line":393,"end_character":62},"updated":"2024-08-02 16:46:16.000000000","message":"think we might want this to be 2 if we require version and at least account","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    def get_metric_name_type(self, req):"},{"line_number":391,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":392,"context_line":"        try:"},{"line_number":393,"context_line":"            version, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":394,"context_line":"            bad_path \u003d False"},{"line_number":395,"context_line":"        except ValueError:"},{"line_number":396,"context_line":"            bad_path \u003d True"}],"source_content_type":"text/x-python","patch_set":15,"id":"90c21a83_57ae67c9","line":393,"range":{"start_line":393,"start_character":61,"end_line":393,"end_character":62},"in_reply_to":"0eb2673e_b240c07e","updated":"2024-09-10 15:35:18.000000000","message":"Acknowledged","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":393,"context_line":"            version, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":394,"context_line":"            bad_path \u003d False"},{"line_number":395,"context_line":"        except ValueError:"},{"line_number":396,"context_line":"            bad_path \u003d True"},{"line_number":397,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":398,"context_line":"            stat_type \u003d req.environ.get(\u0027swift.source\u0027) or \u0027UNKNOWN\u0027"},{"line_number":399,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"92563c7d_db42472f","line":396,"updated":"2024-08-02 16:46:16.000000000","message":"this is *so* similar to ``get_aco_from_path``...how about:\n\n```\n    def get_metric_name_type(self, req):\n        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)\n        acc, cont, obj \u003d self.get_aco_from_path(swift_path)\n        if acc:\n            try:\n                stat_type \u003d [None, \u0027account\u0027, \u0027container\u0027,\n                             \u0027object\u0027][swift_path.strip(\u0027/\u0027).count(\u0027/\u0027)]\n            except IndexError:\n                stat_type \u003d \u0027object\u0027\n        else:\n            stat_type \u003d req.environ.get(\u0027swift.source\u0027) or \u0027UNKNOWN\u0027\n        return stat_type\n\n```\n\nsee https://review.opendev.org/c/openstack/swift/+/925619 sq? proxy-logging helper methods refactor","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94d9034b38adb04db0788d061e5a3148171559b2","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            version, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":394,"context_line":"            bad_path \u003d False"},{"line_number":395,"context_line":"        except ValueError:"},{"line_number":396,"context_line":"            bad_path \u003d True"},{"line_number":397,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":398,"context_line":"            stat_type \u003d req.environ.get(\u0027swift.source\u0027) or \u0027UNKNOWN\u0027"},{"line_number":399,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"4cb3e903_711250eb","line":396,"in_reply_to":"92563c7d_db42472f","updated":"2024-08-06 15:13:58.000000000","message":"Done","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce1117eadafb0309bc6d3ac7e8a42363d3fc5aa","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            version, acc, cont, obj \u003d split_path(swift_path, 1, 4, True)"},{"line_number":394,"context_line":"            bad_path \u003d False"},{"line_number":395,"context_line":"        except ValueError:"},{"line_number":396,"context_line":"            bad_path \u003d True"},{"line_number":397,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":398,"context_line":"            stat_type \u003d req.environ.get(\u0027swift.source\u0027) or \u0027UNKNOWN\u0027"},{"line_number":399,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"ebd63116_9ad9bbe4","line":396,"in_reply_to":"92563c7d_db42472f","updated":"2024-09-09 13:07:35.000000000","message":"Done","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":396,"context_line":"            bad_path \u003d True"},{"line_number":397,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":398,"context_line":"            stat_type \u003d req.environ.get(\u0027swift.source\u0027) or \u0027UNKNOWN\u0027"},{"line_number":399,"context_line":"        else:"},{"line_number":400,"context_line":"            try:"},{"line_number":401,"context_line":"                stat_type \u003d [None, \u0027account\u0027, \u0027container\u0027,"},{"line_number":402,"context_line":"                             \u0027object\u0027][swift_path.strip(\u0027/\u0027).count(\u0027/\u0027)]"}],"source_content_type":"text/x-python","patch_set":15,"id":"1296b6af_df790c84","line":399,"updated":"2024-08-02 16:46:16.000000000","message":"this looks like it is fixing a pre-existing bug, so should be broken out to a separate patch that we can probably merge sooner","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            bad_path \u003d True"},{"line_number":397,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":398,"context_line":"            stat_type \u003d req.environ.get(\u0027swift.source\u0027) or \u0027UNKNOWN\u0027"},{"line_number":399,"context_line":"        else:"},{"line_number":400,"context_line":"            try:"},{"line_number":401,"context_line":"                stat_type \u003d [None, \u0027account\u0027, \u0027container\u0027,"},{"line_number":402,"context_line":"                             \u0027object\u0027][swift_path.strip(\u0027/\u0027).count(\u0027/\u0027)]"}],"source_content_type":"text/x-python","patch_set":15,"id":"35a69848_81e5fa63","line":399,"in_reply_to":"1296b6af_df790c84","updated":"2024-09-10 15:35:18.000000000","message":"Acknowledged","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b6810fdfe40a9e12c292aebf09c6f17540e653c6","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            bad_path \u003d True"},{"line_number":397,"context_line":"        if bad_path or not valid_api_version(version):"},{"line_number":398,"context_line":"            stat_type \u003d req.environ.get(\u0027swift.source\u0027) or \u0027UNKNOWN\u0027"},{"line_number":399,"context_line":"        else:"},{"line_number":400,"context_line":"            try:"},{"line_number":401,"context_line":"                stat_type \u003d [None, \u0027account\u0027, \u0027container\u0027,"},{"line_number":402,"context_line":"                             \u0027object\u0027][swift_path.strip(\u0027/\u0027).count(\u0027/\u0027)]"}],"source_content_type":"text/x-python","patch_set":15,"id":"25eda37f_f1f2f608","line":399,"in_reply_to":"1296b6af_df790c84","updated":"2024-11-27 16:45:25.000000000","message":"Done","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":430,"context_line":"            return None"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":433,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":434,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":435,"context_line":"        if server_type is None:"},{"line_number":436,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":15,"id":"de1e695e_aa6d219f","line":433,"updated":"2024-08-02 16:46:16.000000000","message":"it feels like both times we call this we\u0027ve previously extracted acc and cont from the req and anonymized them...so I\u0027m wondering if that can\u0027t be done in this method i.e. just pass in the req","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":430,"context_line":"            return None"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":433,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":434,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":435,"context_line":"        if server_type is None:"},{"line_number":436,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":15,"id":"7c1073a7_cb25c3d7","line":433,"in_reply_to":"de1e695e_aa6d219f","updated":"2024-09-10 15:35:18.000000000","message":"It seems acc etc. was also needed for other code such as logging","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":432,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":433,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":434,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":435,"context_line":"        if server_type is None:"},{"line_number":436,"context_line":"            return None"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        labels \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"39a31455_b8aa98d0","line":435,"updated":"2024-08-02 16:46:16.000000000","message":"This is the only case where None is returned\n\nI\u0027m not sure I yet understand if this is possible, or what kind of request path would get is here\n\nEdit: for get_metric_name_type to return None we\u0027d need a valid path with a valid api version but no contained \u0027/\u0027, so \u0027/v1\u0027 or \u0027v1\u0027. I\u0027m thinking that\nthe ``split_path(swift_path, 1, 4, True)`` in ``get_metric_name_type`` should be ``split_path(swift_path, 2, 4, True)``","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":432,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":433,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":434,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":435,"context_line":"        if server_type is None:"},{"line_number":436,"context_line":"            return None"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        labels \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"a47f8cb9_1140f432","line":435,"in_reply_to":"39a31455_b8aa98d0","updated":"2024-09-10 15:35:18.000000000","message":"it seems that log_request doesn\u0027t require account, also the effect seems to be same here as account would be None anyway","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":462,"context_line":"        req \u003d Request(env)"},{"line_number":463,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":464,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(swift_path)"},{"line_number":465,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":466,"context_line":"                            self.anonymization_salt)"},{"line_number":467,"context_line":"        cont \u003d StrAnonymizer(cont, self.anonymization_method,"},{"line_number":468,"context_line":"                             self.anonymization_salt)"}],"source_content_type":"text/x-python","patch_set":15,"id":"a24a1f16_d2b5398e","line":465,"updated":"2024-08-02 16:46:16.000000000","message":"ok, it is safe to pass None to StrAnonymizer, although it wasn\u0027t tested","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94d9034b38adb04db0788d061e5a3148171559b2","unresolved":false,"context_lines":[{"line_number":462,"context_line":"        req \u003d Request(env)"},{"line_number":463,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":464,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(swift_path)"},{"line_number":465,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":466,"context_line":"                            self.anonymization_salt)"},{"line_number":467,"context_line":"        cont \u003d StrAnonymizer(cont, self.anonymization_method,"},{"line_number":468,"context_line":"                             self.anonymization_salt)"}],"source_content_type":"text/x-python","patch_set":15,"id":"82c8b9b9_d6dcb85d","line":465,"in_reply_to":"a24a1f16_d2b5398e","updated":"2024-08-06 15:13:58.000000000","message":"Done","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":465,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":466,"context_line":"                            self.anonymization_salt)"},{"line_number":467,"context_line":"        cont \u003d StrAnonymizer(cont, self.anonymization_method,"},{"line_number":468,"context_line":"                             self.anonymization_salt)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"        input_proxy \u003d InputProxy(env[\u0027wsgi.input\u0027])"},{"line_number":471,"context_line":"        env[\u0027wsgi.input\u0027] \u003d input_proxy"}],"source_content_type":"text/x-python","patch_set":15,"id":"74e67638_5b822c8c","line":468,"updated":"2024-08-02 16:46:16.000000000","message":"I\u0027d prefer to have this new code block closer to where acc, cont are used","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e07190b79cdd40f0ea3d7b227dd74a463364144e","unresolved":true,"context_lines":[{"line_number":465,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":466,"context_line":"                            self.anonymization_salt)"},{"line_number":467,"context_line":"        cont \u003d StrAnonymizer(cont, self.anonymization_method,"},{"line_number":468,"context_line":"                             self.anonymization_salt)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"        input_proxy \u003d InputProxy(env[\u0027wsgi.input\u0027])"},{"line_number":471,"context_line":"        env[\u0027wsgi.input\u0027] \u003d input_proxy"}],"source_content_type":"text/x-python","patch_set":15,"id":"7b2d59a3_4f765755","line":468,"in_reply_to":"74e67638_5b822c8c","updated":"2024-08-07 04:58:31.000000000","message":"Why do we anonymize these here anyway. As far as I understand it, we basically create an anonymized strings that have a .anonymized method so when users define their `log_msg_template` they could use `{object.anonymized}` to make sure the object in the log line gets anonymized.\n\nI dont think we ever pass this acc and cont (when it\u0027s in the labels) through a formatter to take advantage of this, further, these will then become anonymized string objects later when we call  log_message. So not sure theis is strictly required at this point.","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        acc \u003d StrAnonymizer(acc, self.anonymization_method,"},{"line_number":466,"context_line":"                            self.anonymization_salt)"},{"line_number":467,"context_line":"        cont \u003d StrAnonymizer(cont, self.anonymization_method,"},{"line_number":468,"context_line":"                             self.anonymization_salt)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"        input_proxy \u003d InputProxy(env[\u0027wsgi.input\u0027])"},{"line_number":471,"context_line":"        env[\u0027wsgi.input\u0027] \u003d input_proxy"}],"source_content_type":"text/x-python","patch_set":15,"id":"0d1fc8ba_4a8f9db0","line":468,"in_reply_to":"7b2d59a3_4f765755","updated":"2024-09-10 15:35:18.000000000","message":"Good point. A previous comment from Tim had similar opinion","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":509,"context_line":"            policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":510,"context_line":"            labels \u003d self.statsd_metric_labels("},{"line_number":511,"context_line":"                req, method, status_int\u003dwire_status_int,"},{"line_number":512,"context_line":"                acc\u003dacc, cont\u003dcont, policy_index\u003dpolicy_index)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"            # Log timing information for time-to-first-byte (GET requests only)"},{"line_number":515,"context_line":"            ttfb \u003d 0.0"}],"source_content_type":"text/x-python","patch_set":15,"id":"8acf800f_ee1c8255","line":512,"updated":"2024-08-02 16:46:16.000000000","message":"why did this pulled out of the ``if method \u003d\u003d \u0027GET\u0027`` condition?\n\nhmmm, I wonder if there is more usage planned in a later patch?\n\nfor now, it looks an odd change to make","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":509,"context_line":"            policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":510,"context_line":"            labels \u003d self.statsd_metric_labels("},{"line_number":511,"context_line":"                req, method, status_int\u003dwire_status_int,"},{"line_number":512,"context_line":"                acc\u003dacc, cont\u003dcont, policy_index\u003dpolicy_index)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"            # Log timing information for time-to-first-byte (GET requests only)"},{"line_number":515,"context_line":"            ttfb \u003d 0.0"}],"source_content_type":"text/x-python","patch_set":15,"id":"d8371881_c428222d","line":512,"in_reply_to":"7026b1be_8d7f72dd","updated":"2024-09-10 15:35:18.000000000","message":"Indeed, this would be used in the follow-up patch for real-time bytes counter out of \u0027GET\u0027 condition","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e07190b79cdd40f0ea3d7b227dd74a463364144e","unresolved":true,"context_lines":[{"line_number":509,"context_line":"            policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":510,"context_line":"            labels \u003d self.statsd_metric_labels("},{"line_number":511,"context_line":"                req, method, status_int\u003dwire_status_int,"},{"line_number":512,"context_line":"                acc\u003dacc, cont\u003dcont, policy_index\u003dpolicy_index)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"            # Log timing information for time-to-first-byte (GET requests only)"},{"line_number":515,"context_line":"            ttfb \u003d 0.0"}],"source_content_type":"text/x-python","patch_set":15,"id":"7026b1be_8d7f72dd","line":512,"in_reply_to":"8acf800f_ee1c8255","updated":"2024-08-07 04:58:31.000000000","message":"I agree, unless this was moved for a future patch reason, this belongs down in the if, so it isn\u0027t called needlessly.","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e07190b79cdd40f0ea3d7b227dd74a463364144e","unresolved":true,"context_lines":[{"line_number":160,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"},{"line_number":161,"context_line":"            statsd_tail_prefix\u003d\u0027proxy-server\u0027)"},{"line_number":162,"context_line":"        self.statsd \u003d get_labeled_statsd_client("},{"line_number":163,"context_line":"            access_log_conf, self.access_logger.logger)"},{"line_number":164,"context_line":"        self.reveal_sensitive_prefix \u003d int("},{"line_number":165,"context_line":"            conf.get(\u0027reveal_sensitive_prefix\u0027, 16))"},{"line_number":166,"context_line":"        self.check_log_msg_template_validity()"}],"source_content_type":"text/x-python","patch_set":16,"id":"d424e90c_5987597d","line":163,"updated":"2024-08-07 04:58:31.000000000","message":"I do wonder if oneday we want an option of passing around or accessing a global statsd client rather then having to create one everytime... however, I guess we do create udp sockets to write stats lines out each time, so maybe it really doesn\u0027t matter, unless we ever need to minimise the number of open socket connections (esp if we ever hit ulimit issues)","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"},{"line_number":161,"context_line":"            statsd_tail_prefix\u003d\u0027proxy-server\u0027)"},{"line_number":162,"context_line":"        self.statsd \u003d get_labeled_statsd_client("},{"line_number":163,"context_line":"            access_log_conf, self.access_logger.logger)"},{"line_number":164,"context_line":"        self.reveal_sensitive_prefix \u003d int("},{"line_number":165,"context_line":"            conf.get(\u0027reveal_sensitive_prefix\u0027, 16))"},{"line_number":166,"context_line":"        self.check_log_msg_template_validity()"}],"source_content_type":"text/x-python","patch_set":16,"id":"28b100fa_75ac85f0","line":163,"in_reply_to":"d424e90c_5987597d","updated":"2024-09-10 15:35:18.000000000","message":"It seems that we create a udp socket each time so to avoid sharing a socket by multiple green threads which probably needs synchronization. The socket is closed each time so probably not too much an issue in open socket connections. Although the question of whether to access a global statsd client or singleton has actually come up in previous comments. Think that we chose to create a statsd client for simplicity and easier code maintainance","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e07190b79cdd40f0ea3d7b227dd74a463364144e","unresolved":true,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":346,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":347,"context_line":"        if metric_name:"},{"line_number":348,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":349,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":350,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"},{"line_number":351,"context_line":"                                            bytes_received + bytes_sent)"},{"line_number":352,"context_line":"        if metric_name_policy:"},{"line_number":353,"context_line":"            self.access_logger.timing(metric_name_policy + \u0027.timing\u0027,"},{"line_number":354,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":355,"context_line":"            self.access_logger.update_stats(metric_name_policy + \u0027.xfer\u0027,"},{"line_number":356,"context_line":"                                            bytes_received + bytes_sent)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        labels \u003d self.statsd_metric_labels("},{"line_number":359,"context_line":"            req, method, status_int\u003dstatus_int,"}],"source_content_type":"text/x-python","patch_set":16,"id":"04ded5ec_8bf8ded7","line":356,"range":{"start_line":347,"start_character":8,"end_line":356,"end_character":72},"updated":"2024-08-07 04:58:31.000000000","message":"So are these basically the legecy metrics for the ones below. logadapter based statsd client is just nooping but we still trigger them?","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":346,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":347,"context_line":"        if metric_name:"},{"line_number":348,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":349,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":350,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"},{"line_number":351,"context_line":"                                            bytes_received + bytes_sent)"},{"line_number":352,"context_line":"        if metric_name_policy:"},{"line_number":353,"context_line":"            self.access_logger.timing(metric_name_policy + \u0027.timing\u0027,"},{"line_number":354,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":355,"context_line":"            self.access_logger.update_stats(metric_name_policy + \u0027.xfer\u0027,"},{"line_number":356,"context_line":"                                            bytes_received + bytes_sent)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        labels \u003d self.statsd_metric_labels("},{"line_number":359,"context_line":"            req, method, status_int\u003dstatus_int,"}],"source_content_type":"text/x-python","patch_set":16,"id":"6cf54ec4_1591fea8","line":356,"range":{"start_line":347,"start_character":8,"end_line":356,"end_character":72},"in_reply_to":"04ded5ec_8bf8ded7","updated":"2024-09-10 15:35:18.000000000","message":"Right. The logadapter based statsd client would be noop if statsd_emit_legacy option is false or log_statsd_host is not configured","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e07190b79cdd40f0ea3d7b227dd74a463364144e","unresolved":true,"context_lines":[{"line_number":383,"context_line":"            if not valid_api_version(version):"},{"line_number":384,"context_line":"                raise ValueError"},{"line_number":385,"context_line":"        except ValueError:"},{"line_number":386,"context_line":"            version, acc, cont, obj \u003d None, None, None, None"},{"line_number":387,"context_line":"        return acc, cont, obj"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def get_metric_name_type(self, req):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7ebba68e_cbc4f9fa","line":386,"updated":"2024-08-07 04:58:31.000000000","message":"Why set the version to None here when we don\u0027t return it?","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            if not valid_api_version(version):"},{"line_number":384,"context_line":"                raise ValueError"},{"line_number":385,"context_line":"        except ValueError:"},{"line_number":386,"context_line":"            version, acc, cont, obj \u003d None, None, None, None"},{"line_number":387,"context_line":"        return acc, cont, obj"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def get_metric_name_type(self, req):"}],"source_content_type":"text/x-python","patch_set":16,"id":"362d3dd2_5d8a15ed","line":386,"in_reply_to":"7ebba68e_cbc4f9fa","updated":"2024-09-10 15:35:18.000000000","message":"Indeed probably not necessary. Squashed from a fix patch, although seems got merged in another patch","commit_id":"c83e3bdf1943f6add86ec6ac3f3b2af8cd69c0cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b6810fdfe40a9e12c292aebf09c6f17540e653c6","unresolved":true,"context_lines":[{"line_number":412,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":413,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":414,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":415,"context_line":"        if server_type is None:"},{"line_number":416,"context_line":"            return None"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        labels \u003d {"}],"source_content_type":"text/x-python","patch_set":21,"id":"805adad8_0746fcdc","line":415,"updated":"2024-11-27 16:45:25.000000000","message":"this is never True\n\nSee https://review.opendev.org/c/openstack/swift/+/928080/3/swift/common/middleware/proxy_logging.py","commit_id":"09df3927ca90d4aa215f3c6fb0cbfbdf63ab12fd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"2e5a31c13547d34a711013fcaabb1a846054b90c","unresolved":false,"context_lines":[{"line_number":412,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":413,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":414,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":415,"context_line":"        if server_type is None:"},{"line_number":416,"context_line":"            return None"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        labels \u003d {"}],"source_content_type":"text/x-python","patch_set":21,"id":"4ec088b4_15d2f0b7","line":415,"in_reply_to":"805adad8_0746fcdc","updated":"2024-12-04 16:22:38.000000000","message":"Acknowledged","commit_id":"09df3927ca90d4aa215f3c6fb0cbfbdf63ab12fd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b6810fdfe40a9e12c292aebf09c6f17540e653c6","unresolved":true,"context_lines":[{"line_number":503,"context_line":"                    self.access_logger.timing("},{"line_number":504,"context_line":"                        metric_name_policy + \u0027.first-byte.timing\u0027, ttfb * 1000)"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"                if labels is not None:"},{"line_number":507,"context_line":"                    self.statsd.timing("},{"line_number":508,"context_line":"                        \u0027swift_proxy_request_ttfb\u0027,"},{"line_number":509,"context_line":"                        ttfb * 1000,"}],"source_content_type":"text/x-python","patch_set":21,"id":"a3a74266_fc3e6a0d","line":506,"updated":"2024-11-27 16:45:25.000000000","message":"labels can never be None, self.statsd_metric_labels never returns None","commit_id":"09df3927ca90d4aa215f3c6fb0cbfbdf63ab12fd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"2e5a31c13547d34a711013fcaabb1a846054b90c","unresolved":false,"context_lines":[{"line_number":503,"context_line":"                    self.access_logger.timing("},{"line_number":504,"context_line":"                        metric_name_policy + \u0027.first-byte.timing\u0027, ttfb * 1000)"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"                if labels is not None:"},{"line_number":507,"context_line":"                    self.statsd.timing("},{"line_number":508,"context_line":"                        \u0027swift_proxy_request_ttfb\u0027,"},{"line_number":509,"context_line":"                        ttfb * 1000,"}],"source_content_type":"text/x-python","patch_set":21,"id":"92b2496a_1ce1ad66","line":506,"in_reply_to":"a3a74266_fc3e6a0d","updated":"2024-12-04 16:22:38.000000000","message":"Acknowledged","commit_id":"09df3927ca90d4aa215f3c6fb0cbfbdf63ab12fd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":439,"context_line":"            # Log timing information for time-to-first-byte (GET requests only)"},{"line_number":440,"context_line":"            ttfb \u003d 0.0"},{"line_number":441,"context_line":"            if method \u003d\u003d \u0027GET\u0027:"},{"line_number":442,"context_line":"                policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":443,"context_line":"                metric_name \u003d self.statsd_metric_name("},{"line_number":444,"context_line":"                    req, wire_status_int, method)"},{"line_number":445,"context_line":"                metric_name_policy \u003d self.statsd_metric_name_policy("}],"source_content_type":"text/x-python","patch_set":31,"id":"382ad505_f4b6c35a","side":"PARENT","line":442,"updated":"2025-03-20 15:24:50.000000000","message":"this didn\u0027t need to move outside the if clause - it *is* needed to build labels, but labels is also only used inside the if clause.","commit_id":"e6000ffb4174cf9cd6bf467d6f85e547545f7003"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            # Log timing information for time-to-first-byte (GET requests only)"},{"line_number":440,"context_line":"            ttfb \u003d 0.0"},{"line_number":441,"context_line":"            if method \u003d\u003d \u0027GET\u0027:"},{"line_number":442,"context_line":"                policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":443,"context_line":"                metric_name \u003d self.statsd_metric_name("},{"line_number":444,"context_line":"                    req, wire_status_int, method)"},{"line_number":445,"context_line":"                metric_name_policy \u003d self.statsd_metric_name_policy("}],"source_content_type":"text/x-python","patch_set":31,"id":"e1ff6a57_ed58898b","side":"PARENT","line":442,"in_reply_to":"382ad505_f4b6c35a","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"e6000ffb4174cf9cd6bf467d6f85e547545f7003"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            # Log timing information for time-to-first-byte (GET requests only)"},{"line_number":440,"context_line":"            ttfb \u003d 0.0"},{"line_number":441,"context_line":"            if method \u003d\u003d \u0027GET\u0027:"},{"line_number":442,"context_line":"                policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":443,"context_line":"                metric_name \u003d self.statsd_metric_name("},{"line_number":444,"context_line":"                    req, wire_status_int, method)"},{"line_number":445,"context_line":"                metric_name_policy \u003d self.statsd_metric_name_policy("}],"source_content_type":"text/x-python","patch_set":31,"id":"0e599569_523c46a1","side":"PARENT","line":442,"in_reply_to":"382ad505_f4b6c35a","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"e6000ffb4174cf9cd6bf467d6f85e547545f7003"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        access_prefix_len \u003d len(\u0027access_\u0027)"},{"line_number":146,"context_line":"        for k, v in conf.items():"},{"line_number":147,"context_line":"            if k.startswith(\u0027access_log_\u0027):"},{"line_number":148,"context_line":"                log_conf[k[access_prefix_len:]] \u003d v"},{"line_number":149,"context_line":"        self.access_logger \u003d logger or get_logger("},{"line_number":150,"context_line":"            log_conf,"},{"line_number":151,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"}],"source_content_type":"text/x-python","patch_set":31,"id":"19bd8a05_d59cc03d","line":148,"updated":"2025-03-20 15:24:50.000000000","message":"I\u0027m struggling with this change. The whole ``access_`` prefix thing is IMHO a workaround that we have to live with, but this is broadening it\u0027s application:\n\n1. On master there are some ``log_*`` options for which the ``access_log_*`` alias is not supported e.g. ``log_max_line_length`` - so this change is quietly adding support for ``access_max_log_line_length``. Also e.g. ``log_address``, ``log_custom_handlers``. They may well be _unintended_ exceptions, but if so, and if we care, then I\u0027d prefer that gets fixed in a different patch rather than as a drive-by here.\n\nsee https://review.opendev.org/c/openstack/swift/+/945117\n\n2. This change means that in future *any* new ``log_foo`` option will *automatically* also have the alias ``access_log_foo``, and IDK if that\u0027s a good thing. I think I prefer the code explicitly documenting the set of options that (questionably) have aliases, and requiring a deliberate choice to extend the pattern.\n\nThe change here seems to facilitating copying the new ``statsd_emit_legacy`` option across to the logger conf. That can be achieved with _just_ the change at line 144.","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        access_prefix_len \u003d len(\u0027access_\u0027)"},{"line_number":146,"context_line":"        for k, v in conf.items():"},{"line_number":147,"context_line":"            if k.startswith(\u0027access_log_\u0027):"},{"line_number":148,"context_line":"                log_conf[k[access_prefix_len:]] \u003d v"},{"line_number":149,"context_line":"        self.access_logger \u003d logger or get_logger("},{"line_number":150,"context_line":"            log_conf,"},{"line_number":151,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"}],"source_content_type":"text/x-python","patch_set":31,"id":"0228394c_a2f29fbc","line":148,"in_reply_to":"19b06965_61cd2f53","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        access_prefix_len \u003d len(\u0027access_\u0027)"},{"line_number":146,"context_line":"        for k, v in conf.items():"},{"line_number":147,"context_line":"            if k.startswith(\u0027access_log_\u0027):"},{"line_number":148,"context_line":"                log_conf[k[access_prefix_len:]] \u003d v"},{"line_number":149,"context_line":"        self.access_logger \u003d logger or get_logger("},{"line_number":150,"context_line":"            log_conf,"},{"line_number":151,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"}],"source_content_type":"text/x-python","patch_set":31,"id":"6ed6db73_804b084d","line":148,"in_reply_to":"19b06965_61cd2f53","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b462bd8c7f9587fdfa675d453f1d7a41fa68ea37","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        access_prefix_len \u003d len(\u0027access_\u0027)"},{"line_number":146,"context_line":"        for k, v in conf.items():"},{"line_number":147,"context_line":"            if k.startswith(\u0027access_log_\u0027):"},{"line_number":148,"context_line":"                log_conf[k[access_prefix_len:]] \u003d v"},{"line_number":149,"context_line":"        self.access_logger \u003d logger or get_logger("},{"line_number":150,"context_line":"            log_conf,"},{"line_number":151,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"}],"source_content_type":"text/x-python","patch_set":31,"id":"19b06965_61cd2f53","line":148,"in_reply_to":"19bd8a05_d59cc03d","updated":"2025-03-20 16:59:40.000000000","message":"\u003eThat can be achieved with just the change at line 144.\n\non reflection I\u0027m not sure I like this either and would prefer to just explicitly copy statsd_emit_legacy into access_log_conf","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":337,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":338,"context_line":"        if metric_name:"},{"line_number":339,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":340,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":341,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"79916b45_d1b2ed6d","line":338,"updated":"2025-03-20 15:24:50.000000000","message":"off-topic: I think this condition and the preceding comment are stale: metric_name is always Truthy, which was made more obvious by https://review.opendev.org/c/openstack/swift/+/928080\n\nsee https://review.opendev.org/c/openstack/swift/+/945118","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":337,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":338,"context_line":"        if metric_name:"},{"line_number":339,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":340,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":341,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"b72adacf_b90983a0","line":338,"in_reply_to":"79916b45_d1b2ed6d","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":337,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":338,"context_line":"        if metric_name:"},{"line_number":339,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":340,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":341,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"92960f84_fe414bb6","line":338,"in_reply_to":"79916b45_d1b2ed6d","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":408,"context_line":"        else:"},{"line_number":409,"context_line":"            return None"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":412,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":413,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"c2a4ed95_d2bbf4af","line":411,"updated":"2025-03-20 15:24:50.000000000","message":"status_int is always passed so deon\u0027t need to be a kwarg, so we don\u0027t need to vary from the existing signature pattern for this \u0027family\u0027 of helpers:\n\n```\ndef statsd_metric_name(self, req, status_int, method)\ndef statsd_metric_name_policy(self, req, status_int, method, policy_index)\ndef statsd_metric_labels(self, req, method, status_int\u003dNone,\n```","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        else:"},{"line_number":409,"context_line":"            return None"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":412,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":413,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"59072361_2ea37adb","line":411,"in_reply_to":"c2a4ed95_d2bbf4af","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        else:"},{"line_number":409,"context_line":"            return None"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def statsd_metric_labels(self, req, method, status_int\u003dNone,"},{"line_number":412,"context_line":"                             acc\u003dNone, cont\u003dNone, policy_index\u003dNone):"},{"line_number":413,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1ce3355f_04e0e85f","line":411,"in_reply_to":"c2a4ed95_d2bbf4af","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":417,"context_line":"            \u0027method\u0027: (method if method in self.valid_methods"},{"line_number":418,"context_line":"                       else \u0027BAD_METHOD\u0027),"},{"line_number":419,"context_line":"        }"},{"line_number":420,"context_line":"        if status_int:"},{"line_number":421,"context_line":"            labels[\u0027status\u0027] \u003d status_int"},{"line_number":422,"context_line":"        if acc:"},{"line_number":423,"context_line":"            labels[\u0027account\u0027] \u003d acc"}],"source_content_type":"text/x-python","patch_set":31,"id":"4a98c18e_b48b16f2","line":420,"range":{"start_line":420,"start_character":8,"end_line":420,"end_character":21},"updated":"2025-03-20 15:24:50.000000000","message":"this is never None AFAICT, cf ``statsd_metric_name``","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":417,"context_line":"            \u0027method\u0027: (method if method in self.valid_methods"},{"line_number":418,"context_line":"                       else \u0027BAD_METHOD\u0027),"},{"line_number":419,"context_line":"        }"},{"line_number":420,"context_line":"        if status_int:"},{"line_number":421,"context_line":"            labels[\u0027status\u0027] \u003d status_int"},{"line_number":422,"context_line":"        if acc:"},{"line_number":423,"context_line":"            labels[\u0027account\u0027] \u003d acc"}],"source_content_type":"text/x-python","patch_set":31,"id":"cd5f50dd_25513981","line":420,"range":{"start_line":420,"start_character":8,"end_line":420,"end_character":21},"in_reply_to":"4a98c18e_b48b16f2","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":417,"context_line":"            \u0027method\u0027: (method if method in self.valid_methods"},{"line_number":418,"context_line":"                       else \u0027BAD_METHOD\u0027),"},{"line_number":419,"context_line":"        }"},{"line_number":420,"context_line":"        if status_int:"},{"line_number":421,"context_line":"            labels[\u0027status\u0027] \u003d status_int"},{"line_number":422,"context_line":"        if acc:"},{"line_number":423,"context_line":"            labels[\u0027account\u0027] \u003d acc"}],"source_content_type":"text/x-python","patch_set":31,"id":"f61e0a01_f9764b9a","line":420,"range":{"start_line":420,"start_character":8,"end_line":420,"end_character":21},"in_reply_to":"4a98c18e_b48b16f2","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":480,"context_line":"            acc, cont, _ \u003d self.get_aco_from_path(swift_path)"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"            policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":483,"context_line":"            labels \u003d self.statsd_metric_labels("},{"line_number":484,"context_line":"                req, method, status_int\u003dwire_status_int,"},{"line_number":485,"context_line":"                acc\u003dacc, cont\u003dcont, policy_index\u003dpolicy_index)"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9c7b2662_821946c7","line":483,"updated":"2025-03-20 15:24:50.000000000","message":"this is only used inside the following ``if method \u003d\u003d \u0027GET\u0027:``","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":480,"context_line":"            acc, cont, _ \u003d self.get_aco_from_path(swift_path)"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"            policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":483,"context_line":"            labels \u003d self.statsd_metric_labels("},{"line_number":484,"context_line":"                req, method, status_int\u003dwire_status_int,"},{"line_number":485,"context_line":"                acc\u003dacc, cont\u003dcont, policy_index\u003dpolicy_index)"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"186cf34d_2ee5f494","line":483,"in_reply_to":"9c7b2662_821946c7","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":480,"context_line":"            acc, cont, _ \u003d self.get_aco_from_path(swift_path)"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"            policy_index \u003d get_policy_index(req.headers, resp_headers)"},{"line_number":483,"context_line":"            labels \u003d self.statsd_metric_labels("},{"line_number":484,"context_line":"                req, method, status_int\u003dwire_status_int,"},{"line_number":485,"context_line":"                acc\u003dacc, cont\u003dcont, policy_index\u003dpolicy_index)"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"d33f8260_9748fadb","line":483,"in_reply_to":"9c7b2662_821946c7","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        # Copy supported access_log_* options to the corresponding log_*"},{"line_number":146,"context_line":"        # option, possibly overriding the log_* option. Note that this includes"},{"line_number":147,"context_line":"        # some statsd options that have access_log_* or log_* prefixes."},{"line_number":148,"context_line":"        log_conf \u003d dict(conf)"},{"line_number":149,"context_line":"        for key in (\u0027log_facility\u0027, \u0027log_name\u0027, \u0027log_level\u0027, \u0027log_udp_host\u0027,"},{"line_number":150,"context_line":"                    \u0027log_udp_port\u0027, \u0027log_statsd_host\u0027, \u0027log_statsd_port\u0027,"},{"line_number":151,"context_line":"                    \u0027log_statsd_default_sample_rate\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3bff460b_81cfc96a","line":148,"updated":"2025-03-25 18:30:59.000000000","message":"IIRC this change also means that there\u0027s at least one log_ option copied to the log_conf that was that NOT previously copied i.e. log_max_line_length\n\nSee https://review.opendev.org/c/openstack/swift/+/945117\n\nThat\u0027s likely a historic bug, but we should add test coverage and mention it as a drive-by in the commit message, of fix it first in a prior patch.","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d4632d129faa99a439d46dc059bd989fe6b88d15","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        # Copy supported access_log_* options to the corresponding log_*"},{"line_number":146,"context_line":"        # option, possibly overriding the log_* option. Note that this includes"},{"line_number":147,"context_line":"        # some statsd options that have access_log_* or log_* prefixes."},{"line_number":148,"context_line":"        log_conf \u003d dict(conf)"},{"line_number":149,"context_line":"        for key in (\u0027log_facility\u0027, \u0027log_name\u0027, \u0027log_level\u0027, \u0027log_udp_host\u0027,"},{"line_number":150,"context_line":"                    \u0027log_udp_port\u0027, \u0027log_statsd_host\u0027, \u0027log_statsd_port\u0027,"},{"line_number":151,"context_line":"                    \u0027log_statsd_default_sample_rate\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"2f0e3c5e_c132c2bc","line":148,"in_reply_to":"176f9959_ed2e1adf","updated":"2025-03-26 15:11:06.000000000","message":"Done","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        # Copy supported access_log_* options to the corresponding log_*"},{"line_number":146,"context_line":"        # option, possibly overriding the log_* option. Note that this includes"},{"line_number":147,"context_line":"        # some statsd options that have access_log_* or log_* prefixes."},{"line_number":148,"context_line":"        log_conf \u003d dict(conf)"},{"line_number":149,"context_line":"        for key in (\u0027log_facility\u0027, \u0027log_name\u0027, \u0027log_level\u0027, \u0027log_udp_host\u0027,"},{"line_number":150,"context_line":"                    \u0027log_udp_port\u0027, \u0027log_statsd_host\u0027, \u0027log_statsd_port\u0027,"},{"line_number":151,"context_line":"                    \u0027log_statsd_default_sample_rate\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"176f9959_ed2e1adf","line":148,"in_reply_to":"3bff460b_81cfc96a","updated":"2025-03-26 15:08:54.000000000","message":"On reflection, I am inclined to avoid any drive-by change here. The access_ prefix pattern is a can of worms, we\u0027ll end up wanting to change docs and sample confs, and I do not want this change delayed by that work.\n\nI addressed the historic anomaly in the access logger conf in a separate patch https://review.opendev.org/c/openstack/swift/+/945117. If that lands first then we can rebase and adopt it, but it doesn\u0027t *need* to land first for us to make progress here if we revert to a more explicit copying of only the existing supported options.","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":348,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":349,"context_line":"        if metric_name:"},{"line_number":350,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":351,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":352,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"}],"source_content_type":"text/x-python","patch_set":45,"id":"94e107c1_342fcb96","line":349,"updated":"2025-04-09 16:01:46.000000000","message":"off-topic: this condition is not necessary, I have a patch here https://review.opendev.org/c/openstack/swift/+/945118","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":348,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":349,"context_line":"        if metric_name:"},{"line_number":350,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":351,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":352,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"}],"source_content_type":"text/x-python","patch_set":45,"id":"f61f6906_e10a7c2b","line":349,"in_reply_to":"94e107c1_342fcb96","updated":"2025-04-10 21:23:15.000000000","message":"Good point, Al!","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e03c2933822e5dead10d4a0a1732ec9292052b63","unresolved":true,"context_lines":[{"line_number":424,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        labels \u003d {"},{"line_number":427,"context_line":"            \u0027type\u0027: server_type,"},{"line_number":428,"context_line":"            \u0027method\u0027: metric_method,"},{"line_number":429,"context_line":"            \u0027status\u0027: status_int,"},{"line_number":430,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":50,"id":"02e12821_4d195432","line":427,"range":{"start_line":427,"start_character":12,"end_line":427,"end_character":18},"updated":"2025-04-23 16:18:38.000000000","message":"We\u0027re setting the precedent here for other labeled metrics i.e. that the label names \u0027type\u0027, \u0027method\u0027, \u0027status\u0027 etc should be used across different modules that may emit labeled metrics.\n\nI\u0027m therefore concerned about using ``type`` which shadows a python keyword. It\u0027s ok here because we only use it as a dict key, but in another use case I found myself wanting to type something like:\n\n\n```\ndef emit_metric(self, **labels):\n    self.statsd_client.increment(self.metric_name, labels\u003dlabels)\n    \ndef blah(self):\n    self.emit_metric(type\u003d\u0027object\u0027, method\u003d\u0027GET\u0027, custom\u003d\u0027foo\u0027)\n```\n\nand now I am using ``type`` as an arg name which I didn\u0027t like.\n\nThe variable in this patch is named ``server_type``, but I\u0027m also wary of enshrining ``server_type`` as a label name (because of the connotation of ``server`` implying the metric is to do with a proxy to server interaction - which it often is, but may not be??).\n\nI would suggest ``resource_type\u003d[account|container|object|UNKNOWN]``, or simply ``resource``, both of which are more abstract than ``server_type``.","commit_id":"7788ea0d82ea4a8b34b6bab47756468733528907"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51489088e04b904ff16a3321ec9c4ae997f0201b","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        server_type \u003d self.get_metric_name_type(req)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        labels \u003d {"},{"line_number":427,"context_line":"            \u0027type\u0027: server_type,"},{"line_number":428,"context_line":"            \u0027method\u0027: metric_method,"},{"line_number":429,"context_line":"            \u0027status\u0027: status_int,"},{"line_number":430,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":50,"id":"833a6302_b000650a","line":427,"range":{"start_line":427,"start_character":12,"end_line":427,"end_character":18},"in_reply_to":"02e12821_4d195432","updated":"2025-04-29 09:21:12.000000000","message":"Done","commit_id":"7788ea0d82ea4a8b34b6bab47756468733528907"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"684482e897bede2f511fe80685094eccd256f546","unresolved":true,"context_lines":[{"line_number":431,"context_line":"        if acc:"},{"line_number":432,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":433,"context_line":"        if cont:"},{"line_number":434,"context_line":"            labels[\u0027container\u0027] \u003d cont"},{"line_number":435,"context_line":"        if resource_type \u003d\u003d \u0027object\u0027 and \\"},{"line_number":436,"context_line":"                policy_index is not None and \\"},{"line_number":437,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"}],"source_content_type":"text/x-python","patch_set":52,"id":"64e35c70_2a533085","line":434,"range":{"start_line":434,"start_character":12,"end_line":434,"end_character":38},"updated":"2025-05-14 08:18:44.000000000","message":"are we concerned about the cardinality of containers? should we make the labels conditional on a conf option?","commit_id":"a5160909acb1339923039fd10ca4cf0e95253b4c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cae75b407907ba640a579f93d908094f1312cbec","unresolved":false,"context_lines":[{"line_number":431,"context_line":"        if acc:"},{"line_number":432,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":433,"context_line":"        if cont:"},{"line_number":434,"context_line":"            labels[\u0027container\u0027] \u003d cont"},{"line_number":435,"context_line":"        if resource_type \u003d\u003d \u0027object\u0027 and \\"},{"line_number":436,"context_line":"                policy_index is not None and \\"},{"line_number":437,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"}],"source_content_type":"text/x-python","patch_set":52,"id":"b8944eed_1c254cc9","line":434,"range":{"start_line":434,"start_character":12,"end_line":434,"end_character":38},"in_reply_to":"64e35c70_2a533085","updated":"2025-05-15 15:33:20.000000000","message":"Per our discussion, SRE would consider filtering out labels","commit_id":"a5160909acb1339923039fd10ca4cf0e95253b4c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20e9a7d682e181d1e0a551b03d5da498620fe751","unresolved":true,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":348,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":349,"context_line":"        if metric_name:"},{"line_number":350,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":351,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":352,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"}],"source_content_type":"text/x-python","patch_set":55,"id":"517a87cd_29039085","line":349,"range":{"start_line":349,"start_character":8,"end_line":349,"end_character":23},"updated":"2025-05-20 18:10:15.000000000","message":"I don\u0027t think we need this check -- we should always have a `metric_name`. See https://review.opendev.org/c/openstack/swift/+/945118 (which also removed the comment above)","commit_id":"8df07b9917912ada421a9287b92284e35d84625f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"03adfdddc41810e4039505e142b5014e6db44d8f","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Only log data for valid controllers (or SOS) to keep the metric count"},{"line_number":348,"context_line":"        # down (egregious errors will get logged by the proxy server itself)."},{"line_number":349,"context_line":"        if metric_name:"},{"line_number":350,"context_line":"            self.access_logger.timing(metric_name + \u0027.timing\u0027,"},{"line_number":351,"context_line":"                                      (end_time - start_time) * 1000)"},{"line_number":352,"context_line":"            self.access_logger.update_stats(metric_name + \u0027.xfer\u0027,"}],"source_content_type":"text/x-python","patch_set":55,"id":"158ffdba_85aa1c36","line":349,"range":{"start_line":349,"start_character":8,"end_line":349,"end_character":23},"in_reply_to":"517a87cd_29039085","updated":"2025-05-20 21:06:10.000000000","message":"Acknowledged","commit_id":"8df07b9917912ada421a9287b92284e35d84625f"}],"swift/common/statsd_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        self.emit_legacy \u003d emit_legacy"},{"line_number":181,"context_line":"        self.default_labels \u003d default_labels or {}"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.random \u003d random"},{"line_number":184,"context_line":"        self.logger \u003d logger"}],"source_content_type":"text/x-python","patch_set":10,"id":"96231d5c_83ae8d96","line":181,"updated":"2024-07-12 12:30:31.000000000","message":"aha! this fix should be in the parent patch, please move","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        self.emit_legacy \u003d emit_legacy"},{"line_number":181,"context_line":"        self.default_labels \u003d default_labels or {}"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.random \u003d random"},{"line_number":184,"context_line":"        self.logger \u003d logger"}],"source_content_type":"text/x-python","patch_set":10,"id":"c96fb955_10a3d834","line":181,"in_reply_to":"96231d5c_83ae8d96","updated":"2024-07-16 01:29:41.000000000","message":"parent patch still has mutable kwarg; but I think it\u0027s ok because we never mutate:\n\n```\n            labels \u003d dict(self.default_labels, **labels)\n```","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self._sample_rate_factor \u003d sample_rate_factor"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        self.emit_legacy \u003d emit_legacy"},{"line_number":181,"context_line":"        self.default_labels \u003d default_labels or {}"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.random \u003d random"},{"line_number":184,"context_line":"        self.logger \u003d logger"}],"source_content_type":"text/x-python","patch_set":10,"id":"7c67210b_be4d653e","line":181,"in_reply_to":"c96fb955_10a3d834","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":166,"context_line":"    def __init__(self, host, port, base_prefix\u003d\u0027\u0027, tail_prefix\u003d\u0027\u0027,"},{"line_number":167,"context_line":"                 default_sample_rate\u003d1, sample_rate_factor\u003d1,"},{"line_number":168,"context_line":"                 label_mode\u003dLabelModes.DISABLED.value,"},{"line_number":169,"context_line":"                 emit_legacy\u003dTrue, default_labels\u003d{},"},{"line_number":170,"context_line":"                 logger\u003dNone):"},{"line_number":171,"context_line":"        self._host \u003d host"},{"line_number":172,"context_line":"        self._port \u003d port"}],"source_content_type":"text/x-python","patch_set":13,"id":"54abc8b3_f1a7dc9e","line":169,"updated":"2024-07-16 01:29:41.000000000","message":"also this should be `default_labels\u003dNone`","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    def __init__(self, host, port, base_prefix\u003d\u0027\u0027, tail_prefix\u003d\u0027\u0027,"},{"line_number":167,"context_line":"                 default_sample_rate\u003d1, sample_rate_factor\u003d1,"},{"line_number":168,"context_line":"                 label_mode\u003dLabelModes.DISABLED.value,"},{"line_number":169,"context_line":"                 emit_legacy\u003dTrue, default_labels\u003d{},"},{"line_number":170,"context_line":"                 logger\u003dNone):"},{"line_number":171,"context_line":"        self._host \u003d host"},{"line_number":172,"context_line":"        self._port \u003d port"}],"source_content_type":"text/x-python","patch_set":13,"id":"b11ae92a_69e93d60","line":169,"in_reply_to":"54abc8b3_f1a7dc9e","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"02f0379d164db5ead56340c6ed0416e1b9861952","unresolved":true,"context_lines":[{"line_number":2424,"context_line":"            self.client_disconnect \u003d True"},{"line_number":2425,"context_line":"            raise"},{"line_number":2426,"context_line":"        self.bytes_received +\u003d len(chunk)"},{"line_number":2427,"context_line":"        if self.labels and self.labels[\u0027server_type\u0027] is not None:"},{"line_number":2428,"context_line":"            self.statsd.update_stats("},{"line_number":2429,"context_line":"                self.metric_name,"},{"line_number":2430,"context_line":"                self.bytes_received,"}],"source_content_type":"text/x-python","patch_set":9,"id":"2e3f6d36_f25d6f7f","line":2427,"range":{"start_line":2427,"start_character":27,"end_line":2427,"end_character":65},"updated":"2024-06-28 18:38:52.000000000","message":"This feels a little funny... why do we drop it if `None`? Why should `InputProxy` care about the *names* of the labels used, much less the values?","commit_id":"2ccdcc708daabbacb91a655a36941232af6da22b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"752fd6b06fcffda0452a9b881adef8277d80bac1","unresolved":false,"context_lines":[{"line_number":2424,"context_line":"            self.client_disconnect \u003d True"},{"line_number":2425,"context_line":"            raise"},{"line_number":2426,"context_line":"        self.bytes_received +\u003d len(chunk)"},{"line_number":2427,"context_line":"        if self.labels and self.labels[\u0027server_type\u0027] is not None:"},{"line_number":2428,"context_line":"            self.statsd.update_stats("},{"line_number":2429,"context_line":"                self.metric_name,"},{"line_number":2430,"context_line":"                self.bytes_received,"}],"source_content_type":"text/x-python","patch_set":9,"id":"47a93ecd_2155b951","line":2427,"range":{"start_line":2427,"start_character":27,"end_line":2427,"end_character":65},"in_reply_to":"2e3f6d36_f25d6f7f","updated":"2024-07-02 15:59:30.000000000","message":"Acknowledged","commit_id":"2ccdcc708daabbacb91a655a36941232af6da22b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":2415,"context_line":"        self.labels \u003d labels"},{"line_number":2416,"context_line":"        self.emit_buffer_xfer_bytes_sec \u003d emit_buffer_xfer_bytes_sec"},{"line_number":2417,"context_line":"        self.emit_bytes \u003d 0"},{"line_number":2418,"context_line":"        self.next_emit_time \u003d None"},{"line_number":2419,"context_line":""},{"line_number":2420,"context_line":"    def read(self, *args, **kwargs):"},{"line_number":2421,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"bbbbad26_090cc705","line":2418,"updated":"2024-07-12 12:30:31.000000000","message":"The changes bleed proxy_logging behavior into the utils.InputProxy.\n\nHow about keeping it more abstract by passing a func to InputProxy that it calls every chunk or line read?\n\n(that said, this class is only used in proxy_logging.)","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":2415,"context_line":"        self.labels \u003d labels"},{"line_number":2416,"context_line":"        self.emit_buffer_xfer_bytes_sec \u003d emit_buffer_xfer_bytes_sec"},{"line_number":2417,"context_line":"        self.emit_bytes \u003d 0"},{"line_number":2418,"context_line":"        self.next_emit_time \u003d None"},{"line_number":2419,"context_line":""},{"line_number":2420,"context_line":"    def read(self, *args, **kwargs):"},{"line_number":2421,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"d3f35193_6281d0d0","line":2418,"in_reply_to":"bbbbad26_090cc705","updated":"2024-07-16 01:29:41.000000000","message":"seems like it may be used outside of Swift in the opendev ecosystem\n\n18481: Move InputProxy to utils | https://review.opendev.org/c/openstack/swift/+/18481\n\nwe may need to track that down if we\u0027re making any changes to the interface (e.g. is `self.statsd` now *required*?)","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":2415,"context_line":"        self.labels \u003d labels"},{"line_number":2416,"context_line":"        self.emit_buffer_xfer_bytes_sec \u003d emit_buffer_xfer_bytes_sec"},{"line_number":2417,"context_line":"        self.emit_bytes \u003d 0"},{"line_number":2418,"context_line":"        self.next_emit_time \u003d None"},{"line_number":2419,"context_line":""},{"line_number":2420,"context_line":"    def read(self, *args, **kwargs):"},{"line_number":2421,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"14f9c8bc_aa7f5bd6","line":2418,"in_reply_to":"d3f35193_6281d0d0","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":2446,"context_line":"        return line"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"    def emit_buffer_xfer_bytes(self, buffer_bytes):"},{"line_number":2449,"context_line":"        if self.labels and self.emit_buffer_xfer_bytes_sec \u003e\u003d 0:"},{"line_number":2450,"context_line":"            self.emit_bytes +\u003d buffer_bytes"},{"line_number":2451,"context_line":"            now \u003d time.time()"},{"line_number":2452,"context_line":"            if self.emit_buffer_xfer_bytes_sec \u003d\u003d 0 or \\"}],"source_content_type":"text/x-python","patch_set":11,"id":"b4f59cf2_10ed20c4","line":2449,"updated":"2024-07-12 12:30:31.000000000","message":"there\u0027s very similar code in proxy_logging - perhaps could be wrapped up in a re-usable closure, particularly if it\u0027s passed into InputProxy as a per-chunk callback?","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":2446,"context_line":"        return line"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"    def emit_buffer_xfer_bytes(self, buffer_bytes):"},{"line_number":2449,"context_line":"        if self.labels and self.emit_buffer_xfer_bytes_sec \u003e\u003d 0:"},{"line_number":2450,"context_line":"            self.emit_bytes +\u003d buffer_bytes"},{"line_number":2451,"context_line":"            now \u003d time.time()"},{"line_number":2452,"context_line":"            if self.emit_buffer_xfer_bytes_sec \u003d\u003d 0 or \\"}],"source_content_type":"text/x-python","patch_set":11,"id":"0d024a69_27a87ff4","line":2449,"in_reply_to":"b4f59cf2_10ed20c4","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":2458,"context_line":"                    labels\u003dself.labels,"},{"line_number":2459,"context_line":"                )"},{"line_number":2460,"context_line":"                self.emit_bytes \u003d 0"},{"line_number":2461,"context_line":"                self.next_emit_time \u003d now + self.emit_buffer_xfer_bytes_sec"},{"line_number":2462,"context_line":""},{"line_number":2463,"context_line":""},{"line_number":2464,"context_line":"class LRUCache(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3e1ccf9d_d6216c94","line":2461,"updated":"2024-07-12 12:30:31.000000000","message":"nit: I have a preference for this to be above read and readline (and should it be _ prefixed?)","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":false,"context_lines":[{"line_number":2458,"context_line":"                    labels\u003dself.labels,"},{"line_number":2459,"context_line":"                )"},{"line_number":2460,"context_line":"                self.emit_bytes \u003d 0"},{"line_number":2461,"context_line":"                self.next_emit_time \u003d now + self.emit_buffer_xfer_bytes_sec"},{"line_number":2462,"context_line":""},{"line_number":2463,"context_line":""},{"line_number":2464,"context_line":"class LRUCache(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"e37acfc4_5b7476a1","line":2461,"in_reply_to":"3e1ccf9d_d6216c94","updated":"2024-07-16 01:29:41.000000000","message":"Done","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"92e3069c7c89a0a6b08cc4f31513aeb751884e9b","unresolved":true,"context_lines":[{"line_number":2430,"context_line":"                    labels\u003dself.labels,"},{"line_number":2431,"context_line":"                )"},{"line_number":2432,"context_line":"                self.emit_bytes \u003d 0"},{"line_number":2433,"context_line":"                self.next_emit_time \u003d now + self.emit_buffer_xfer_bytes_sec"},{"line_number":2434,"context_line":""},{"line_number":2435,"context_line":"    def read(self, *args, **kwargs):"},{"line_number":2436,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"2cc7d376_3dae2228","line":2433,"updated":"2024-07-17 22:00:33.000000000","message":"We want another emit at the end of the transfer, regardless of how much time has passed. Probably in a `close` method?","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":2430,"context_line":"                    labels\u003dself.labels,"},{"line_number":2431,"context_line":"                )"},{"line_number":2432,"context_line":"                self.emit_bytes \u003d 0"},{"line_number":2433,"context_line":"                self.next_emit_time \u003d now + self.emit_buffer_xfer_bytes_sec"},{"line_number":2434,"context_line":""},{"line_number":2435,"context_line":"    def read(self, *args, **kwargs):"},{"line_number":2436,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"b97215e8_f9a8af9a","line":2433,"in_reply_to":"2cc7d376_3dae2228","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"0a6f10bf5210231d31c89665d4c0806cba6795c1"}],"swift/common/utils/logs.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":855,"context_line":"        return type(self).__new__("},{"line_number":856,"context_line":"            type(self), str(self), self.method, self.salt)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"class StrFormatTime(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"97d6c265_a2f38fd7","line":856,"updated":"2024-07-12 12:30:31.000000000","message":"just curious why this change was needed?","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":855,"context_line":"        return type(self).__new__("},{"line_number":856,"context_line":"            type(self), str(self), self.method, self.salt)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"class StrFormatTime(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"b9e1c2c1_8803e34f","line":856,"in_reply_to":"57a88da8_06dcd1c9","updated":"2024-07-30 16:33:18.000000000","message":"Agree with Clay. assertUpdateStats probably also would like to avoid cha\nnging the original calls array","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":855,"context_line":"        return type(self).__new__("},{"line_number":856,"context_line":"            type(self), str(self), self.method, self.salt)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"class StrFormatTime(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"57a88da8_06dcd1c9","line":856,"in_reply_to":"97d6c265_a2f38fd7","updated":"2024-07-16 01:29:41.000000000","message":"it seems like `assertUpdateStats` wants to be able to deepcopy the args passed to `StatsdClient.update_stats`\n\n```\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_log_msg_template_s3api - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_log_request_stat_method_filtering_custom - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_log_request_stat_method_filtering_default - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_log_request_stat_type_good - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_object_error - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_upload_line - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_upload_size - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_upload_size_no_policy - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_xfer_stats_emit_frequency_get - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_xfer_stats_emit_frequency_post - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_xfer_stats_get - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\nFAILED swift/test/unit/common/middleware/test_proxy_logging.py::TestProxyLogging::test_xfer_stats_post - TypeError: StrAnonymizer.__new__() missing 2 required positional arguments: \u0027method\u0027 and \u0027salt\u0027\n```\n\nbut this WOMM\n\n```\n(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one/swift$ git diff\ndiff --git a/swift/common/utils/logs.py b/swift/common/utils/logs.py\nindex e208eb904..54780f10d 100644\n--- a/swift/common/utils/logs.py\n+++ b/swift/common/utils/logs.py\n@@ -851,10 +851,6 @@ class StrAnonymizer(str):\n             return \u0027{%s%s}%s\u0027 % (\u0027S\u0027 if self.salt else \u0027\u0027, self.method.upper(),\n                                  h.hexdigest())\n \n-    def __deepcopy__(self, memo):\n-        return type(self).__new__(\n-            type(self), str(self), self.method, self.salt)\n-\n \n class StrFormatTime(object):\n     \"\"\"\ndiff --git a/test/unit/common/middleware/test_proxy_logging.py b/test/unit/common/middleware/test_proxy_logging.py\nindex 3da1438ce..563a3f361 100644\n--- a/test/unit/common/middleware/test_proxy_logging.py\n+++ b/test/unit/common/middleware/test_proxy_logging.py\n@@ -169,7 +169,7 @@ class TestProxyLogging(unittest.TestCase):\n         timing_calls \u003d app.access_logger.statsd_client.calls[\u0027timing\u0027]\n         found \u003d False\n         for got in timing_calls:\n-            timing_call \u003d copy.deepcopy(got)\n+            timing_call \u003d got\n             self.assertEqual(2, len(timing_call[0]))\n             if timing_call[0][0].startswith(\u0027swift_\u0027):\n                 self.assertNotEqual({}, timing_call[1])\n@@ -200,8 +200,7 @@ class TestProxyLogging(unittest.TestCase):\n         update_stats_calls \u003d sorted(\n             app.access_logger.statsd_client.calls[\u0027update_stats\u0027])\n         got_metrics_values_and_kwargs \u003d []\n-        for update_call in update_stats_calls:\n-            got \u003d copy.deepcopy(update_call)\n+        for got in update_stats_calls:\n             if got[0][0].startswith(\u0027swift_\u0027):\n                 self.assertNotEqual({}, got[1])\n                 self.assertIn(\u0027labels\u0027, got[1])\n```","commit_id":"93313ab0e98fd701d0d1a1438d200f83f5b5c66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":727,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":728,"context_line":"        return type(self).__new__("},{"line_number":729,"context_line":"            type(self), str(self), self.method, self.salt)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"class StrFormatTime(object):"},{"line_number":733,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"3e723dc9_f256da2b","line":730,"updated":"2025-03-20 15:24:50.000000000","message":"is this change needed? looks like an earlier patchset was using the anonymizer, but not anymore","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":727,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":728,"context_line":"        return type(self).__new__("},{"line_number":729,"context_line":"            type(self), str(self), self.method, self.salt)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"class StrFormatTime(object):"},{"line_number":733,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"89d17191_f27f309f","line":730,"in_reply_to":"3e723dc9_f256da2b","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":727,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":728,"context_line":"        return type(self).__new__("},{"line_number":729,"context_line":"            type(self), str(self), self.method, self.salt)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"class StrFormatTime(object):"},{"line_number":733,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"581583eb_7f5ddc1a","line":730,"in_reply_to":"3e723dc9_f256da2b","updated":"2025-03-21 19:30:42.000000000","message":"Indeed was used by earlier versions","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"}],"test/debug_logger.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        for metric, step in self.get_update_stats():"},{"line_number":170,"context_line":"            counts[metric] +\u003d step"},{"line_number":171,"context_line":"        # convert to normal dict for better failure messages"},{"line_number":172,"context_line":"        return dict(counts)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"class CaptureLog(object):"}],"source_content_type":"text/x-python","patch_set":15,"id":"29a0592c_f7d29a13","line":172,"updated":"2024-08-02 16:46:16.000000000","message":"there\u0027s got to be a way in which we could share most of the code in FakeLabeledStatsdClient and FakeStatsdClient:\n\nmaybe extract most of it to BaseFakeStatsdClient and just customise ``_capture`` to forward to the appropriate superclass?","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        for metric, step in self.get_update_stats():"},{"line_number":170,"context_line":"            counts[metric] +\u003d step"},{"line_number":171,"context_line":"        # convert to normal dict for better failure messages"},{"line_number":172,"context_line":"        return dict(counts)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"class CaptureLog(object):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fdb0ecbb_809bd042","line":172,"in_reply_to":"247d78a0_2cf99478","updated":"2024-09-10 15:35:18.000000000","message":"Good point. Thanks for the patch!","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94d9034b38adb04db0788d061e5a3148171559b2","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        for metric, step in self.get_update_stats():"},{"line_number":170,"context_line":"            counts[metric] +\u003d step"},{"line_number":171,"context_line":"        # convert to normal dict for better failure messages"},{"line_number":172,"context_line":"        return dict(counts)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"class CaptureLog(object):"}],"source_content_type":"text/x-python","patch_set":15,"id":"247d78a0_2cf99478","line":172,"in_reply_to":"29a0592c_f7d29a13","updated":"2024-08-06 15:13:58.000000000","message":"see https://review.opendev.org/c/openstack/swift/+/925780","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":72,"context_line":"        return self.recording_socket"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _send(self, *args, **kwargs):"},{"line_number":75,"context_line":"        self.send_calls.append((args, kwargs))"},{"line_number":76,"context_line":"        super(FakeStatsdClient, self)._send(*args, **kwargs)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def clear(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"20930335_366fbaae","side":"PARENT","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":24},"updated":"2025-03-20 15:24:50.000000000","message":"seems like we never (or no longer) used this","commit_id":"e6000ffb4174cf9cd6bf467d6f85e547545f7003"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return self.recording_socket"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _send(self, *args, **kwargs):"},{"line_number":75,"context_line":"        self.send_calls.append((args, kwargs))"},{"line_number":76,"context_line":"        super(FakeStatsdClient, self)._send(*args, **kwargs)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def clear(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"06d66245_b13748f3","side":"PARENT","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":24},"in_reply_to":"20930335_366fbaae","updated":"2025-03-25 18:30:59.000000000","message":"Acknowledged","commit_id":"e6000ffb4174cf9cd6bf467d6f85e547545f7003"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return self.recording_socket"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _send(self, *args, **kwargs):"},{"line_number":75,"context_line":"        self.send_calls.append((args, kwargs))"},{"line_number":76,"context_line":"        super(FakeStatsdClient, self)._send(*args, **kwargs)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def clear(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"31ad6b63_d2413805","side":"PARENT","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":24},"in_reply_to":"20930335_366fbaae","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"e6000ffb4174cf9cd6bf467d6f85e547545f7003"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class BaseFakeStatsdClient(object):"},{"line_number":48,"context_line":"    def __init__(self):"},{"line_number":49,"context_line":"        self.clear()"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"b5d39d07_d87b93da","line":47,"updated":"2025-03-26 15:08:54.000000000","message":"no need for ``(object)`` in py3","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d4632d129faa99a439d46dc059bd989fe6b88d15","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class BaseFakeStatsdClient(object):"},{"line_number":48,"context_line":"    def __init__(self):"},{"line_number":49,"context_line":"        self.clear()"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"10fe421f_5d9fb051","line":47,"in_reply_to":"b5d39d07_d87b93da","updated":"2025-03-26 15:11:06.000000000","message":"Done","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"}],"test/unit/common/middleware/test_proxy_logging.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":208,"context_line":"                labels \u003d got[1][\u0027labels\u0027]"},{"line_number":209,"context_line":"                self.assertTrue(labels is not None)"},{"line_number":210,"context_line":"                if \u0027policy\u0027 in labels:"},{"line_number":211,"context_line":"                    got[1][\u0027labels\u0027].pop(\u0027policy\u0027)"},{"line_number":212,"context_line":"            else:"},{"line_number":213,"context_line":"                self.assertEqual({}, got[1])"},{"line_number":214,"context_line":"            got_metrics_values_and_kwargs.append((got[0][0],"}],"source_content_type":"text/x-python","patch_set":10,"id":"93f3fcb1_3c4c9584","line":211,"updated":"2024-07-16 01:29:41.000000000","message":"this is not an ideal thing to have buried in a generic test method; there\u0027s not a good way for the caller to assert on the specific policy that\u0027s coming in to the label kwargs it should still assert `expected_labels \u003d {\u0027policy\u0027: mock.ANY}` rather that make it seem like policy isn\u0027t one of the labels it expects.","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                labels \u003d got[1][\u0027labels\u0027]"},{"line_number":209,"context_line":"                self.assertTrue(labels is not None)"},{"line_number":210,"context_line":"                if \u0027policy\u0027 in labels:"},{"line_number":211,"context_line":"                    got[1][\u0027labels\u0027].pop(\u0027policy\u0027)"},{"line_number":212,"context_line":"            else:"},{"line_number":213,"context_line":"                self.assertEqual({}, got[1])"},{"line_number":214,"context_line":"            got_metrics_values_and_kwargs.append((got[0][0],"}],"source_content_type":"text/x-python","patch_set":10,"id":"8497f8cb_a5227f70","line":211,"in_reply_to":"93f3fcb1_3c4c9584","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":473,"context_line":"            \u0027/v1/a/c/o/p/\u0027: \u0027object\u0027,"},{"line_number":474,"context_line":"            \u0027/v1/a/c/o/p/p2\u0027: \u0027object\u0027,"},{"line_number":475,"context_line":"        }"},{"line_number":476,"context_line":"        # It\u0027d probably be better if we replaced the logger wholesale"},{"line_number":477,"context_line":"        self.logger.statsd_client.label_mode \u003d \u0027signalfx\u0027"},{"line_number":478,"context_line":"        self.logger.statsd_client._label_line_f \u003d build_line_signalfx"},{"line_number":479,"context_line":"        self.logger.statsd_client.emit_legacy \u003d False"}],"source_content_type":"text/x-python","patch_set":10,"id":"53eb4960_258bd8ed","line":476,"updated":"2024-07-12 12:30:31.000000000","message":"yes! these tests would be more robust of the ProxyLoggingMiddleware was left to create its logger rather than being given one that the test has created and monkey patched.\n\nThe tests can monkey patch get_logger to return a debug_logger","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9857eb07cf03d0396d4515685d999e8638af8140","unresolved":true,"context_lines":[{"line_number":473,"context_line":"            \u0027/v1/a/c/o/p/\u0027: \u0027object\u0027,"},{"line_number":474,"context_line":"            \u0027/v1/a/c/o/p/p2\u0027: \u0027object\u0027,"},{"line_number":475,"context_line":"        }"},{"line_number":476,"context_line":"        # It\u0027d probably be better if we replaced the logger wholesale"},{"line_number":477,"context_line":"        self.logger.statsd_client.label_mode \u003d \u0027signalfx\u0027"},{"line_number":478,"context_line":"        self.logger.statsd_client._label_line_f \u003d build_line_signalfx"},{"line_number":479,"context_line":"        self.logger.statsd_client.emit_legacy \u003d False"}],"source_content_type":"text/x-python","patch_set":10,"id":"add26707_8b272411","line":476,"in_reply_to":"53eb4960_258bd8ed","updated":"2024-07-16 01:29:41.000000000","message":"well except currently there\u0027s no way to get your config into FakeStatsdClient\n\nwith new helper\n\n```\ndiff --git a/test/debug_logger.py b/test/debug_logger.py\nindex b91f46d2b..f0f501e36 100644\n--- a/test/debug_logger.py\n+++ b/test/debug_logger.py\n@@ -274,6 +274,13 @@ def debug_logger(name\u003d\u0027test\u0027):\n     return DebugLogAdapter(DebugLogger(), name)\n \n \n+def debug_statsd_client(conf):\n+    \"\"\"get a configured statsd client\"\"\"\n+    with mock.patch(\u0027swift.common.statsd_client.StatsdClient\u0027,\n+                    FakeStatsdClient):\n+        return statsd_client.get_statsd_client(conf)\n+\n+\n class ForwardingLogHandler(logging.NullHandler):\n     \"\"\"\n     Provides a LogHandler implementation that simply forwards filtered records\n\n```\n\nThis was as far as I could get:\n\n```\n-        self.logger.statsd_client.label_mode \u003d \u0027signalfx\u0027\n-        self.logger.statsd_client._label_line_f \u003d build_line_signalfx\n-        self.logger.statsd_client.emit_legacy \u003d False\n+        self.logger.logger.statsd_client \u003d debug_statsd_client({\n+            \u0027log_statsd_host\u0027: \u0027host\u0027,\n+            \u0027log_statsd_port\u0027: 8125,\n+            \u0027statsd_label_mode\u0027: \u0027signalfx\u0027,\n+            \u0027statsd_emit_legacy\u0027: False,\n+        })\n```\n\nN.B. the `self.logger.logger.statsd_client \u003d `\n\nwhen I first attempted `self.logger.statsd_client \u003d ` the new instance got lost in delegation somewhere in `swift.common.logs`","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            \u0027/v1/a/c/o/p/\u0027: \u0027object\u0027,"},{"line_number":474,"context_line":"            \u0027/v1/a/c/o/p/p2\u0027: \u0027object\u0027,"},{"line_number":475,"context_line":"        }"},{"line_number":476,"context_line":"        # It\u0027d probably be better if we replaced the logger wholesale"},{"line_number":477,"context_line":"        self.logger.statsd_client.label_mode \u003d \u0027signalfx\u0027"},{"line_number":478,"context_line":"        self.logger.statsd_client._label_line_f \u003d build_line_signalfx"},{"line_number":479,"context_line":"        self.logger.statsd_client.emit_legacy \u003d False"}],"source_content_type":"text/x-python","patch_set":10,"id":"66226175_bb5f53aa","line":476,"in_reply_to":"add26707_8b272411","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":478,"context_line":"        self.logger.statsd_client._label_line_f \u003d build_line_signalfx"},{"line_number":479,"context_line":"        self.logger.statsd_client.emit_legacy \u003d False"},{"line_number":480,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":481,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":482,"context_line":"                # GET"},{"line_number":483,"context_line":"                self.logger.clear()"},{"line_number":484,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":10,"id":"57f3ca3b_c569db6a","line":481,"updated":"2024-07-12 12:30:31.000000000","message":"consider putting the following in a local do_test(path, exp_label_bytes) method","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        self.logger.statsd_client._label_line_f \u003d build_line_signalfx"},{"line_number":479,"context_line":"        self.logger.statsd_client.emit_legacy \u003d False"},{"line_number":480,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":481,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":482,"context_line":"                # GET"},{"line_number":483,"context_line":"                self.logger.clear()"},{"line_number":484,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":10,"id":"2a793187_9930e716","line":481,"in_reply_to":"57f3ca3b_c569db6a","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":492,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"                self.assertEqual(b\u00277654321\u0027, b\u0027\u0027.join(iter_response))"},{"line_number":495,"context_line":"                if exp_type \u003d\u003d \u0027account\u0027:"},{"line_number":496,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":497,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":498,"context_line":"                        b\u0027method\u003dGET\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"a472f2e1_a54332d2","line":495,"updated":"2024-07-12 12:30:31.000000000","message":"see above - if you use a do_test helper method then the expected lab_bytes can be passed in to do_test - I think it\u0027s best to minimise conditional assertions within the a test","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":492,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"                self.assertEqual(b\u00277654321\u0027, b\u0027\u0027.join(iter_response))"},{"line_number":495,"context_line":"                if exp_type \u003d\u003d \u0027account\u0027:"},{"line_number":496,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":497,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":498,"context_line":"                        b\u0027method\u003dGET\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"630acbb1_647fe398","line":495,"in_reply_to":"a472f2e1_a54332d2","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":533,"context_line":"                ])"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":536,"context_line":"                # Do this only for object types"},{"line_number":537,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":538,"context_line":"                    self.logger.clear()"},{"line_number":539,"context_line":"                    app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":10,"id":"d2d3dfaa_bb948989","line":536,"updated":"2024-07-12 12:30:31.000000000","message":"consider breaking this into a separate test","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                ])"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":536,"context_line":"                # Do this only for object types"},{"line_number":537,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":538,"context_line":"                    self.logger.clear()"},{"line_number":539,"context_line":"                    app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":10,"id":"1b602c8e_fddd6e71","line":536,"in_reply_to":"d2d3dfaa_bb948989","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e83157b224d63c5f89cf0d68cf38ca9642bd1b24","unresolved":true,"context_lines":[{"line_number":662,"context_line":"                        + b\u0027]:6|c\u0027,"},{"line_number":663,"context_line":"                        b\u0027swift_proxy_response_body_bytes[\u0027 + label_bytes"},{"line_number":664,"context_line":"                        + b\u0027]:8|c\u0027"},{"line_number":665,"context_line":"                    ])"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"    def test_log_request_stat_method_filtering_default(self):"},{"line_number":668,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"2ca293b9_e02609dd","line":665,"updated":"2024-07-12 12:30:31.000000000","message":"I think it would be better if this test was restructured/broken up to separate the different scenarios:\n\naccount, container  vs object\nPUT vs GET\nnon-existent policy","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0c3ef67450b908c1235db62ae87e1c918081487b","unresolved":false,"context_lines":[{"line_number":662,"context_line":"                        + b\u0027]:6|c\u0027,"},{"line_number":663,"context_line":"                        b\u0027swift_proxy_response_body_bytes[\u0027 + label_bytes"},{"line_number":664,"context_line":"                        + b\u0027]:8|c\u0027"},{"line_number":665,"context_line":"                    ])"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"    def test_log_request_stat_method_filtering_default(self):"},{"line_number":668,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aead202_48fde475","line":665,"in_reply_to":"2ca293b9_e02609dd","updated":"2024-07-30 16:33:18.000000000","message":"Acknowledged","commit_id":"61e5b6af326dc101d77015effd9ff0cf3343f8f9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":172,"context_line":"        for timing_call in timing_calls:"},{"line_number":173,"context_line":"            self.assertNotEqual(not_exp_metric, timing_call[0][0])"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":176,"context_line":"        logger_calls \u003d app.access_logger.statsd_client.calls[\u0027update_stats\u0027]"},{"line_number":177,"context_line":"        statsd_calls \u003d self.statsd.calls[\u0027update_stats\u0027]"},{"line_number":178,"context_line":"        update_stats_calls \u003d sorted(logger_calls + statsd_calls)"}],"source_content_type":"text/x-python","patch_set":15,"id":"658933e9_03000644","line":175,"updated":"2024-08-02 16:46:16.000000000","message":"I wonder if it would be clearer to have a new ``assertLabeledUpdateStats`` to verify the statsd_calls","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        for timing_call in timing_calls:"},{"line_number":173,"context_line":"            self.assertNotEqual(not_exp_metric, timing_call[0][0])"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":176,"context_line":"        logger_calls \u003d app.access_logger.statsd_client.calls[\u0027update_stats\u0027]"},{"line_number":177,"context_line":"        statsd_calls \u003d self.statsd.calls[\u0027update_stats\u0027]"},{"line_number":178,"context_line":"        update_stats_calls \u003d sorted(logger_calls + statsd_calls)"}],"source_content_type":"text/x-python","patch_set":15,"id":"2cc6a097_72f601c7","line":175,"in_reply_to":"658933e9_03000644","updated":"2024-09-10 15:35:18.000000000","message":"Considering changing this in follow-up patches for labeled metrics in other components","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":175,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":176,"context_line":"        logger_calls \u003d app.access_logger.statsd_client.calls[\u0027update_stats\u0027]"},{"line_number":177,"context_line":"        statsd_calls \u003d self.statsd.calls[\u0027update_stats\u0027]"},{"line_number":178,"context_line":"        update_stats_calls \u003d sorted(logger_calls + statsd_calls)"},{"line_number":179,"context_line":"        got_metrics_values_and_kwargs \u003d []"},{"line_number":180,"context_line":"        for update_call in update_stats_calls:"},{"line_number":181,"context_line":"            got \u003d copy.deepcopy(update_call)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ceb27f0_89487278","line":178,"updated":"2024-08-02 16:46:16.000000000","message":"here we mix legacy and labeled together...","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":176,"context_line":"        logger_calls \u003d app.access_logger.statsd_client.calls[\u0027update_stats\u0027]"},{"line_number":177,"context_line":"        statsd_calls \u003d self.statsd.calls[\u0027update_stats\u0027]"},{"line_number":178,"context_line":"        update_stats_calls \u003d sorted(logger_calls + statsd_calls)"},{"line_number":179,"context_line":"        got_metrics_values_and_kwargs \u003d []"},{"line_number":180,"context_line":"        for update_call in update_stats_calls:"},{"line_number":181,"context_line":"            got \u003d copy.deepcopy(update_call)"}],"source_content_type":"text/x-python","patch_set":15,"id":"8c62e3ab_b25d5037","line":178,"in_reply_to":"3ceb27f0_89487278","updated":"2024-09-10 15:35:18.000000000","message":"Acknowledged","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":179,"context_line":"        got_metrics_values_and_kwargs \u003d []"},{"line_number":180,"context_line":"        for update_call in update_stats_calls:"},{"line_number":181,"context_line":"            got \u003d copy.deepcopy(update_call)"},{"line_number":182,"context_line":"            if got[0][0].startswith(\u0027swift_\u0027):"},{"line_number":183,"context_line":"                self.assertNotEqual({}, got[1])"},{"line_number":184,"context_line":"                self.assertIn(\u0027labels\u0027, got[1])"},{"line_number":185,"context_line":"                labels \u003d got[1][\u0027labels\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"11bcc4ec_e602bd22","line":182,"updated":"2024-08-02 16:46:16.000000000","message":"...now filter them apart - is it necessary to mingle things like this?","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        got_metrics_values_and_kwargs \u003d []"},{"line_number":180,"context_line":"        for update_call in update_stats_calls:"},{"line_number":181,"context_line":"            got \u003d copy.deepcopy(update_call)"},{"line_number":182,"context_line":"            if got[0][0].startswith(\u0027swift_\u0027):"},{"line_number":183,"context_line":"                self.assertNotEqual({}, got[1])"},{"line_number":184,"context_line":"                self.assertIn(\u0027labels\u0027, got[1])"},{"line_number":185,"context_line":"                labels \u003d got[1][\u0027labels\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"df8915eb_17b2ba7b","line":182,"in_reply_to":"11bcc4ec_e602bd22","updated":"2024-09-10 15:35:18.000000000","message":"Considering changing this in follow-up patches for labeled metrics in other components","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fcf84538a4da55662b92e944bf03a7a40d49a659","unresolved":true,"context_lines":[{"line_number":373,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":374,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":375,"context_line":"                # GET"},{"line_number":376,"context_line":"                self._clear()"},{"line_number":377,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":378,"context_line":"                    FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027),"},{"line_number":379,"context_line":"                    {},"}],"source_content_type":"text/x-python","patch_set":15,"id":"fbb0a568_dc883f08","line":376,"updated":"2024-08-02 16:46:16.000000000","message":"eek, so we have to clear *two* things...it might be better to instantiate new instances of fake logger and statsd client for each iteration rather than clearing and re-using","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4243597b2cdcda6bbac6dec3a1fa9f0e10e55ba4","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":374,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":375,"context_line":"                # GET"},{"line_number":376,"context_line":"                self._clear()"},{"line_number":377,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":378,"context_line":"                    FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027),"},{"line_number":379,"context_line":"                    {},"}],"source_content_type":"text/x-python","patch_set":15,"id":"d521ba4d_1f412fba","line":376,"in_reply_to":"fbb0a568_dc883f08","updated":"2024-09-10 15:35:18.000000000","message":"Considering changing this in follow-up patches for labeled metrics in other components","commit_id":"cf980c07e3abc703890ea4c56b5c9b80bcb9df4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        for got in timing_calls:"},{"line_number":148,"context_line":"            timing_call \u003d copy.deepcopy(got)"},{"line_number":149,"context_line":"            self.assertEqual(2, len(timing_call[0]))"},{"line_number":150,"context_line":"            if timing_call[0][0].startswith(\u0027swift_\u0027):"},{"line_number":151,"context_line":"                self.assertNotEqual({}, timing_call[1])"},{"line_number":152,"context_line":"                self.assertIn(\u0027labels\u0027, timing_call[1])"},{"line_number":153,"context_line":"                labels \u003d timing_call[1][\u0027labels\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"86fde86f_102c7832","line":150,"updated":"2025-03-26 15:08:54.000000000","message":"do we ever get to this clause? IIUC this method is only looking at legacy stats\n\nas per my comment below for assertUpdateStats, I would suggest adding a separate new assert method for labeled timing stats, and leaving this method as it is on master","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        for got in timing_calls:"},{"line_number":148,"context_line":"            timing_call \u003d copy.deepcopy(got)"},{"line_number":149,"context_line":"            self.assertEqual(2, len(timing_call[0]))"},{"line_number":150,"context_line":"            if timing_call[0][0].startswith(\u0027swift_\u0027):"},{"line_number":151,"context_line":"                self.assertNotEqual({}, timing_call[1])"},{"line_number":152,"context_line":"                self.assertIn(\u0027labels\u0027, timing_call[1])"},{"line_number":153,"context_line":"                labels \u003d timing_call[1][\u0027labels\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"72e12644_87d55329","line":150,"in_reply_to":"86fde86f_102c7832","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":204,"context_line":"                self.assertIn("},{"line_number":205,"context_line":"                    ((\u0027proxy-server.%s:%s|c\u0027 % (metric, value)).encode(),"},{"line_number":206,"context_line":"                     (\u0027host\u0027, 8125)),"},{"line_number":207,"context_line":"                    app.access_logger.statsd_client.sendto_calls)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def test_init_logger_and_legacy_statsd_options_log_prefix(self):"},{"line_number":210,"context_line":"        conf \u003d {"}],"source_content_type":"text/x-python","patch_set":34,"id":"9d785c5a_d07fcdea","line":207,"updated":"2025-03-26 15:08:54.000000000","message":"I found this quite hard to grok:\n\n- it\u0027s combining the calls to the legacy and labeled statsd clients\n- it\u0027s opinionated that labeled metrics start with swift_\n- it asserts that labeled metric calls have a \u0027labels\u0027 kwarg, but also asserts the entire value of kwargs\n- it asserts sendto calls for legacy metrics but not labeled metrics\n\nI think it would be much clearer to have a new ``assertLabeledUpdateStats`` method and deal with each type of stat separately, rather than having to grok the various conditions in this method.\n\nI made a start but didn\u0027t migrate all the assertion call sites:\n\nhttps://paste.openstack.org/show/bP1QM9ulIPjjaPcsETRz/","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                self.assertIn("},{"line_number":205,"context_line":"                    ((\u0027proxy-server.%s:%s|c\u0027 % (metric, value)).encode(),"},{"line_number":206,"context_line":"                     (\u0027host\u0027, 8125)),"},{"line_number":207,"context_line":"                    app.access_logger.statsd_client.sendto_calls)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def test_init_logger_and_legacy_statsd_options_log_prefix(self):"},{"line_number":210,"context_line":"        conf \u003d {"}],"source_content_type":"text/x-python","patch_set":34,"id":"27608121_ddb2dddd","line":207,"in_reply_to":"9d785c5a_d07fcdea","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":663,"context_line":"            \u0027/v1.0/a/c/o/p\u0027: \u0027object\u0027,"},{"line_number":664,"context_line":"            \u0027/v1.0/a/c/o/p/\u0027: \u0027object\u0027,"},{"line_number":665,"context_line":"            \u0027/v1.0/a/c/o/p/p2\u0027: \u0027object\u0027,"},{"line_number":666,"context_line":"        }"},{"line_number":667,"context_line":"        conf \u003d {"},{"line_number":668,"context_line":"            \u0027log_statsd_host\u0027: \u0027host\u0027,"},{"line_number":669,"context_line":"            \u0027log_statsd_port\u0027: 8125,"}],"source_content_type":"text/x-python","patch_set":34,"id":"96992b52_e226895f","line":666,"updated":"2025-03-26 15:08:54.000000000","message":"this could be declared in setUp() once an re-used by all these types of tests","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":663,"context_line":"            \u0027/v1.0/a/c/o/p\u0027: \u0027object\u0027,"},{"line_number":664,"context_line":"            \u0027/v1.0/a/c/o/p/\u0027: \u0027object\u0027,"},{"line_number":665,"context_line":"            \u0027/v1.0/a/c/o/p/p2\u0027: \u0027object\u0027,"},{"line_number":666,"context_line":"        }"},{"line_number":667,"context_line":"        conf \u003d {"},{"line_number":668,"context_line":"            \u0027log_statsd_host\u0027: \u0027host\u0027,"},{"line_number":669,"context_line":"            \u0027log_statsd_port\u0027: 8125,"}],"source_content_type":"text/x-python","patch_set":34,"id":"38152844_6f5a247e","line":666,"in_reply_to":"96992b52_e226895f","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":672,"context_line":"        }"},{"line_number":673,"context_line":"        self.logger.logger.statsd_client \u003d debug_statsd_client(conf)"},{"line_number":674,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":675,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":676,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":677,"context_line":"                # GET"},{"line_number":678,"context_line":"                self._clear()"}],"source_content_type":"text/x-python","patch_set":34,"id":"23ed4c5a_ed8b8572","line":675,"updated":"2025-03-26 15:08:54.000000000","message":"I think you could achieve the same with a side_effect https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.side_effect\n\n```\nmock.patch(\"time.time\", side_effect\u003d[18.0, 18.5, 20.71828182846])\n```","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":672,"context_line":"        }"},{"line_number":673,"context_line":"        self.logger.logger.statsd_client \u003d debug_statsd_client(conf)"},{"line_number":674,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":675,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":676,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":677,"context_line":"                # GET"},{"line_number":678,"context_line":"                self._clear()"}],"source_content_type":"text/x-python","patch_set":34,"id":"f856b1a3_e2e0045f","line":675,"in_reply_to":"23ed4c5a_ed8b8572","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":688,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"                self.assertEqual(b\u00277654321\u0027, b\u0027\u0027.join(iter_response))"},{"line_number":691,"context_line":"                if exp_type \u003d\u003d \u0027account\u0027:"},{"line_number":692,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":693,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":694,"context_line":"                        b\u0027method\u003dGET\u0027,"},{"line_number":695,"context_line":"                        b\u0027status\u003d321\u0027,"},{"line_number":696,"context_line":"                        b\u0027type\u003daccount\u0027,"},{"line_number":697,"context_line":"                    ])"},{"line_number":698,"context_line":"                elif exp_type \u003d\u003d \u0027container\u0027:"},{"line_number":699,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":700,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":701,"context_line":"                        b\u0027container\u003dc\u0027,"},{"line_number":702,"context_line":"                        b\u0027method\u003dGET\u0027,"},{"line_number":703,"context_line":"                        b\u0027status\u003d321\u0027,"},{"line_number":704,"context_line":"                        b\u0027type\u003dcontainer\u0027,"},{"line_number":705,"context_line":"                    ])"},{"line_number":706,"context_line":"                else:"},{"line_number":707,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":708,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":709,"context_line":"                        b\u0027container\u003dc\u0027,"},{"line_number":710,"context_line":"                        b\u0027method\u003dGET\u0027,"},{"line_number":711,"context_line":"                        b\u0027policy\u003d0\u0027,"},{"line_number":712,"context_line":"                        b\u0027status\u003d321\u0027,"},{"line_number":713,"context_line":"                        b\u0027type\u003dobject\u0027,"},{"line_number":714,"context_line":"                    ])"},{"line_number":715,"context_line":"                # Note that in a labeled world, object only gets the one stat,"},{"line_number":716,"context_line":"                # which includes policy info"},{"line_number":717,"context_line":"                self.assertEqual(["}],"source_content_type":"text/x-python","patch_set":34,"id":"221c67df_1a306b8c","line":714,"range":{"start_line":691,"start_character":16,"end_line":714,"end_character":22},"updated":"2025-03-26 15:08:54.000000000","message":"these conditions wouldn\u0027t be necessary if the test iterated over ``path, exp_labels in path_types.items()``\n\nthen up above have \n\n```\n        exp_obj_labels \u003d {...}\n        path_types \u003d {\n            ...\n            \u0027/v1/a/c/o\u0027: exp_obj_labels,\n\n```","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"                self.assertEqual(b\u00277654321\u0027, b\u0027\u0027.join(iter_response))"},{"line_number":691,"context_line":"                if exp_type \u003d\u003d \u0027account\u0027:"},{"line_number":692,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":693,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":694,"context_line":"                        b\u0027method\u003dGET\u0027,"},{"line_number":695,"context_line":"                        b\u0027status\u003d321\u0027,"},{"line_number":696,"context_line":"                        b\u0027type\u003daccount\u0027,"},{"line_number":697,"context_line":"                    ])"},{"line_number":698,"context_line":"                elif exp_type \u003d\u003d \u0027container\u0027:"},{"line_number":699,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":700,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":701,"context_line":"                        b\u0027container\u003dc\u0027,"},{"line_number":702,"context_line":"                        b\u0027method\u003dGET\u0027,"},{"line_number":703,"context_line":"                        b\u0027status\u003d321\u0027,"},{"line_number":704,"context_line":"                        b\u0027type\u003dcontainer\u0027,"},{"line_number":705,"context_line":"                    ])"},{"line_number":706,"context_line":"                else:"},{"line_number":707,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":708,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":709,"context_line":"                        b\u0027container\u003dc\u0027,"},{"line_number":710,"context_line":"                        b\u0027method\u003dGET\u0027,"},{"line_number":711,"context_line":"                        b\u0027policy\u003d0\u0027,"},{"line_number":712,"context_line":"                        b\u0027status\u003d321\u0027,"},{"line_number":713,"context_line":"                        b\u0027type\u003dobject\u0027,"},{"line_number":714,"context_line":"                    ])"},{"line_number":715,"context_line":"                # Note that in a labeled world, object only gets the one stat,"},{"line_number":716,"context_line":"                # which includes policy info"},{"line_number":717,"context_line":"                self.assertEqual(["}],"source_content_type":"text/x-python","patch_set":34,"id":"ade6ae46_88d0ece0","line":714,"range":{"start_line":691,"start_character":16,"end_line":714,"end_character":22},"in_reply_to":"221c67df_1a306b8c","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":757,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":758,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":759,"context_line":"                # Do this only for object types"},{"line_number":760,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":761,"context_line":"                    self._clear()"},{"line_number":762,"context_line":"                    app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":763,"context_line":"                        FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"8879c7ef_78f38827","line":760,"range":{"start_line":760,"start_character":16,"end_line":760,"end_character":39},"updated":"2025-03-26 15:08:54.000000000","message":"there\u0027s no elif or else, so whay all the other path_types?","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":757,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":758,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":759,"context_line":"                # Do this only for object types"},{"line_number":760,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":761,"context_line":"                    self._clear()"},{"line_number":762,"context_line":"                    app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":763,"context_line":"                        FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1803da2c_07b6e8b3","line":760,"range":{"start_line":760,"start_character":16,"end_line":760,"end_character":39},"in_reply_to":"8879c7ef_78f38827","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":873,"context_line":"                stub_times \u003d [58.2, 58.2 + 7.3321]"},{"line_number":874,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":875,"context_line":"                self.assertEqual(b\u002787654321\u0027, b\u0027\u0027.join(iter_response))"},{"line_number":876,"context_line":"                if exp_type \u003d\u003d \u0027account\u0027:"},{"line_number":877,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":878,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":879,"context_line":"                        b\u0027method\u003dPUT\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"e9c83e52_abdfec51","line":876,"updated":"2025-03-26 15:08:54.000000000","message":"ditto comment above about having path_types values be exp_label_bytes rather than if/elif/else here","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":873,"context_line":"                stub_times \u003d [58.2, 58.2 + 7.3321]"},{"line_number":874,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":875,"context_line":"                self.assertEqual(b\u002787654321\u0027, b\u0027\u0027.join(iter_response))"},{"line_number":876,"context_line":"                if exp_type \u003d\u003d \u0027account\u0027:"},{"line_number":877,"context_line":"                    label_bytes \u003d b\u0027,\u0027.join(["},{"line_number":878,"context_line":"                        b\u0027account\u003da\u0027,"},{"line_number":879,"context_line":"                        b\u0027method\u003dPUT\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"f2c074f0_18375feb","line":876,"in_reply_to":"e9c83e52_abdfec51","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88db9dab158fd0d4ac0450a38ee6ed12246f303f","unresolved":true,"context_lines":[{"line_number":939,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":940,"context_line":"                # PUT Repeat the test above, but with a non-existent policy"},{"line_number":941,"context_line":"                # Do this only for object types"},{"line_number":942,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":943,"context_line":"                    self._clear()"},{"line_number":944,"context_line":"                    app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":945,"context_line":"                        FakeApp(body\u003db\u002787654321\u0027, response_str\u003d\u0027314 PiTown\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"b0cc7c02_3414abbc","line":942,"updated":"2025-03-26 15:08:54.000000000","message":"as above, there\u0027s no assertions for account or container paths so why iterate over them in path_types?","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"a34438cc67fbdac711d9498f1b90b18ada7a248f","unresolved":false,"context_lines":[{"line_number":939,"context_line":"            for path, exp_type in path_types.items():"},{"line_number":940,"context_line":"                # PUT Repeat the test above, but with a non-existent policy"},{"line_number":941,"context_line":"                # Do this only for object types"},{"line_number":942,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":943,"context_line":"                    self._clear()"},{"line_number":944,"context_line":"                    app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":945,"context_line":"                        FakeApp(body\u003db\u002787654321\u0027, response_str\u003d\u0027314 PiTown\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"0ca01115_8097e573","line":942,"in_reply_to":"b0cc7c02_3414abbc","updated":"2025-04-03 19:23:28.000000000","message":"Acknowledged","commit_id":"18edf67852dc5a11700b29a0a53fbf343b59b3ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":224,"context_line":"                \u0027type\u0027: \u0027object\u0027,"},{"line_number":225,"context_line":"                \u0027policy\u0027: \u00270\u0027,"},{"line_number":226,"context_line":"            },"},{"line_number":227,"context_line":"        }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _clear(self):"},{"line_number":230,"context_line":"        self.logger.clear()"}],"source_content_type":"text/x-python","patch_set":40,"id":"1bf6958c_912c365c","line":227,"updated":"2025-04-04 14:42:48.000000000","message":"nit: this could be further simplified by first defining dicts for account_labels, container_labels and object_labels","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                \u0027type\u0027: \u0027object\u0027,"},{"line_number":225,"context_line":"                \u0027policy\u0027: \u00270\u0027,"},{"line_number":226,"context_line":"            },"},{"line_number":227,"context_line":"        }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _clear(self):"},{"line_number":230,"context_line":"        self.logger.clear()"}],"source_content_type":"text/x-python","patch_set":40,"id":"ceae7521_0bf6cb79","line":227,"in_reply_to":"1bf6958c_912c365c","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":273,"context_line":"                    self.assertEqual({\u0027labels\u0027: exp_labels}, timing_call[1])"},{"line_number":274,"context_line":"        if not found:"},{"line_number":275,"context_line":"            self.fail(\u0027assertLabeledTiming: %s not found in %r\u0027 % ("},{"line_number":276,"context_line":"                exp_metric, timing_calls))"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":279,"context_line":"        update_stats_calls \u003d sorted("}],"source_content_type":"text/x-python","patch_set":40,"id":"8a467389_8e541872","line":276,"updated":"2025-04-04 14:42:48.000000000","message":"IIUC this is asserting that a given metric is in a potentially longer list of metrics. I prefer to make more precise assertions where possible. I can see that the pattern has been inherited from the legacy stats tests, but I think we could do better and have something similar to ``assertLabeledUpdateStats`` that takes a list of all expected metrics.\n\nIt will need to be different in that we need to use and assertAlmostEqual on the times.","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                    self.assertEqual({\u0027labels\u0027: exp_labels}, timing_call[1])"},{"line_number":274,"context_line":"        if not found:"},{"line_number":275,"context_line":"            self.fail(\u0027assertLabeledTiming: %s not found in %r\u0027 % ("},{"line_number":276,"context_line":"                exp_metric, timing_calls))"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def assertUpdateStats(self, exp_metrics_and_values, app):"},{"line_number":279,"context_line":"        update_stats_calls \u003d sorted("}],"source_content_type":"text/x-python","patch_set":40,"id":"7447b61b_0d4e453c","line":276,"in_reply_to":"8a467389_8e541872","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":522,"context_line":"                app.access_logger.statsd_client.calls[\u0027update_stats\u0027])"},{"line_number":523,"context_line":"            app.access_logger.clear()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test_log_request_stat_type_good(self):"},{"line_number":526,"context_line":"        \"\"\""},{"line_number":527,"context_line":"        log_request() should send timing and byte-count counters for GET"},{"line_number":528,"context_line":"        requests.  Also, __call__()\u0027s iter_response() function should"}],"source_content_type":"text/x-python","patch_set":40,"id":"d5fe472a_ea889552","line":525,"updated":"2025-04-04 14:42:48.000000000","message":"this test was already very long, and it\u0027s getting longer. I think the time has come to break it up into each scenario,\n\nMuch of the test set up can be simplified anyway, as noted in following comments...","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":522,"context_line":"                app.access_logger.statsd_client.calls[\u0027update_stats\u0027])"},{"line_number":523,"context_line":"            app.access_logger.clear()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test_log_request_stat_type_good(self):"},{"line_number":526,"context_line":"        \"\"\""},{"line_number":527,"context_line":"        log_request() should send timing and byte-count counters for GET"},{"line_number":528,"context_line":"        requests.  Also, __call__()\u0027s iter_response() function should"}],"source_content_type":"text/x-python","patch_set":40,"id":"ac27233f_0a9469c5","line":525,"in_reply_to":"d5fe472a_ea889552","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":532,"context_line":"        stub_times \u003d []"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        def stub_time():"},{"line_number":535,"context_line":"            return stub_times.pop(0)"},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"        conf \u003d {"},{"line_number":538,"context_line":"            \u0027log_statsd_host\u0027: \u0027host\u0027,"}],"source_content_type":"text/x-python","patch_set":40,"id":"b3edebbd_ccdb6fab","line":535,"updated":"2025-04-04 14:42:48.000000000","message":"if we use mock side_effect then we can ditch this function","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":532,"context_line":"        stub_times \u003d []"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        def stub_time():"},{"line_number":535,"context_line":"            return stub_times.pop(0)"},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"        conf \u003d {"},{"line_number":538,"context_line":"            \u0027log_statsd_host\u0027: \u0027host\u0027,"}],"source_content_type":"text/x-python","patch_set":40,"id":"3bf9173e_06401978","line":535,"in_reply_to":"b3edebbd_ccdb6fab","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":540,"context_line":"            \u0027statsd_label_mode\u0027: \u0027signalfx\u0027,"},{"line_number":541,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":542,"context_line":"        }"},{"line_number":543,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":544,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":545,"context_line":"            for path, exp_labels in self.path_labels.items():"},{"line_number":546,"context_line":"                exp_labels \u003d dict(exp_labels)"}],"source_content_type":"text/x-python","patch_set":40,"id":"2fdce38d_5d94d3e4","line":543,"updated":"2025-04-04 14:42:48.000000000","message":"we can create a fake statsd client once in ``setUp()``","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":540,"context_line":"            \u0027statsd_label_mode\u0027: \u0027signalfx\u0027,"},{"line_number":541,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":542,"context_line":"        }"},{"line_number":543,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":544,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":545,"context_line":"            for path, exp_labels in self.path_labels.items():"},{"line_number":546,"context_line":"                exp_labels \u003d dict(exp_labels)"}],"source_content_type":"text/x-python","patch_set":40,"id":"067ce254_835270f3","line":543,"in_reply_to":"2fdce38d_5d94d3e4","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":541,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":542,"context_line":"        }"},{"line_number":543,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":544,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":545,"context_line":"            for path, exp_labels in self.path_labels.items():"},{"line_number":546,"context_line":"                exp_labels \u003d dict(exp_labels)"},{"line_number":547,"context_line":"                exp_type \u003d exp_labels[\u0027type\u0027]"}],"source_content_type":"text/x-python","patch_set":40,"id":"899ba81c_732d5c9e","line":544,"updated":"2025-04-04 14:42:48.000000000","message":"```\nwith mock.patch(\"time.time\",\n                            side_effect\u003d[18.0, 18.5, 20.71828182846]):\n```","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":541,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":542,"context_line":"        }"},{"line_number":543,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":544,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":545,"context_line":"            for path, exp_labels in self.path_labels.items():"},{"line_number":546,"context_line":"                exp_labels \u003d dict(exp_labels)"},{"line_number":547,"context_line":"                exp_type \u003d exp_labels[\u0027type\u0027]"}],"source_content_type":"text/x-python","patch_set":40,"id":"c8450ad9_339386af","line":544,"in_reply_to":"899ba81c_732d5c9e","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":543,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":544,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":545,"context_line":"            for path, exp_labels in self.path_labels.items():"},{"line_number":546,"context_line":"                exp_labels \u003d dict(exp_labels)"},{"line_number":547,"context_line":"                exp_type \u003d exp_labels[\u0027type\u0027]"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"                # GET"}],"source_content_type":"text/x-python","patch_set":40,"id":"0a91b3d5_5f070749","line":546,"range":{"start_line":546,"start_character":29,"end_line":546,"end_character":45},"updated":"2025-04-04 14:42:48.000000000","message":"good move, make a copy because this is mutated below","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":544,"context_line":"        with mock.patch(\"time.time\", stub_time):"},{"line_number":545,"context_line":"            for path, exp_labels in self.path_labels.items():"},{"line_number":546,"context_line":"                exp_labels \u003d dict(exp_labels)"},{"line_number":547,"context_line":"                exp_type \u003d exp_labels[\u0027type\u0027]"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"                # GET"}],"source_content_type":"text/x-python","patch_set":40,"id":"c2d3e61c_331194ff","line":546,"range":{"start_line":546,"start_character":29,"end_line":546,"end_character":45},"in_reply_to":"0a91b3d5_5f070749","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":584,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":585,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 4, exp_labels),"},{"line_number":586,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":587,"context_line":"                    ])"},{"line_number":588,"context_line":"                else:"},{"line_number":589,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"},{"line_number":590,"context_line":"                                            4 + 7)],"}],"source_content_type":"text/x-python","patch_set":40,"id":"761fdc5d_d00951e9","line":587,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":584,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":585,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 4, exp_labels),"},{"line_number":586,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":587,"context_line":"                    ])"},{"line_number":588,"context_line":"                else:"},{"line_number":589,"context_line":"                    self.assertUpdateStats([(\u0027%s.GET.321.xfer\u0027 % exp_type,"},{"line_number":590,"context_line":"                                            4 + 7)],"}],"source_content_type":"text/x-python","patch_set":40,"id":"6783c3e1_091fda9b","line":587,"in_reply_to":"761fdc5d_d00951e9","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":592,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":593,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 4, exp_labels),"},{"line_number":594,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":595,"context_line":"                    ])"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":598,"context_line":"                # Do this only for object types"}],"source_content_type":"text/x-python","patch_set":40,"id":"427f9dab_2eb40ab2","line":595,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here\n\nalso, self.assertLabeledUpdateStats can be dedented - it is the same for the if and else","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":592,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":593,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 4, exp_labels),"},{"line_number":594,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":595,"context_line":"                    ])"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":598,"context_line":"                # Do this only for object types"}],"source_content_type":"text/x-python","patch_set":40,"id":"b1e968d5_8e2314fb","line":595,"in_reply_to":"427f9dab_2eb40ab2","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":594,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":595,"context_line":"                    ])"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":598,"context_line":"                # Do this only for object types"},{"line_number":599,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":600,"context_line":"                    exp_labels.pop(\u0027policy\u0027)"}],"source_content_type":"text/x-python","patch_set":40,"id":"11eee74f_31ff1805","line":597,"updated":"2025-04-04 14:42:48.000000000","message":"so, let\u0027s start a new test method here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":594,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":595,"context_line":"                    ])"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"                # GET Repeat the test above, but with a non-existent policy"},{"line_number":598,"context_line":"                # Do this only for object types"},{"line_number":599,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":600,"context_line":"                    exp_labels.pop(\u0027policy\u0027)"}],"source_content_type":"text/x-python","patch_set":40,"id":"6c8b89fe_8acf6a88","line":597,"in_reply_to":"11eee74f_31ff1805","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":619,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":620,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 4, exp_labels),"},{"line_number":621,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":622,"context_line":"                    ])"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"                # GET with swift.proxy_access_log_made already set"},{"line_number":625,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":40,"id":"eb63b098_d6e5ee88","line":622,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":619,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":620,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 4, exp_labels),"},{"line_number":621,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":622,"context_line":"                    ])"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"                # GET with swift.proxy_access_log_made already set"},{"line_number":625,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":40,"id":"96078efd_c73fad5c","line":622,"in_reply_to":"eb63b098_d6e5ee88","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":621,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":622,"context_line":"                    ])"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"                # GET with swift.proxy_access_log_made already set"},{"line_number":625,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":626,"context_line":"                    FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027), {})"},{"line_number":627,"context_line":"                app.access_logger \u003d debug_logger()"}],"source_content_type":"text/x-python","patch_set":40,"id":"9b7785ce_1131ab85","line":624,"updated":"2025-04-04 14:42:48.000000000","message":"and a new test method here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":621,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 7, exp_labels),"},{"line_number":622,"context_line":"                    ])"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"                # GET with swift.proxy_access_log_made already set"},{"line_number":625,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":626,"context_line":"                    FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027), {})"},{"line_number":627,"context_line":"                app.access_logger \u003d debug_logger()"}],"source_content_type":"text/x-python","patch_set":40,"id":"4b0f31c4_aa35473f","line":624,"in_reply_to":"9b7785ce_1131ab85","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":624,"context_line":"                # GET with swift.proxy_access_log_made already set"},{"line_number":625,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":626,"context_line":"                    FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027), {})"},{"line_number":627,"context_line":"                app.access_logger \u003d debug_logger()"},{"line_number":628,"context_line":"                req \u003d Request.blank(path, environ\u003d{"},{"line_number":629,"context_line":"                    \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":630,"context_line":"                    \u0027swift.proxy_access_log_made\u0027: True,"}],"source_content_type":"text/x-python","patch_set":40,"id":"984d9d66_02d5b5af","line":627,"updated":"2025-04-04 14:42:48.000000000","message":"the app.statsd has NOT been replaced with a fake here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                # GET with swift.proxy_access_log_made already set"},{"line_number":625,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":626,"context_line":"                    FakeApp(body\u003db\u00277654321\u0027, response_str\u003d\u0027321 Fubar\u0027), {})"},{"line_number":627,"context_line":"                app.access_logger \u003d debug_logger()"},{"line_number":628,"context_line":"                req \u003d Request.blank(path, environ\u003d{"},{"line_number":629,"context_line":"                    \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":630,"context_line":"                    \u0027swift.proxy_access_log_made\u0027: True,"}],"source_content_type":"text/x-python","patch_set":40,"id":"14476194_226ecee8","line":627,"in_reply_to":"984d9d66_02d5b5af","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":637,"context_line":"                self.assertEqual("},{"line_number":638,"context_line":"                    [], app.access_logger.statsd_client.calls[\u0027timing_since\u0027])"},{"line_number":639,"context_line":"                self.assertEqual("},{"line_number":640,"context_line":"                    [], app.access_logger.statsd_client.calls[\u0027update_stats\u0027])"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"                # PUT (no first-byte timing!)"},{"line_number":643,"context_line":"                self._clear()"}],"source_content_type":"text/x-python","patch_set":40,"id":"d32359d5_06fc2bf9","line":640,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled assertions here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":637,"context_line":"                self.assertEqual("},{"line_number":638,"context_line":"                    [], app.access_logger.statsd_client.calls[\u0027timing_since\u0027])"},{"line_number":639,"context_line":"                self.assertEqual("},{"line_number":640,"context_line":"                    [], app.access_logger.statsd_client.calls[\u0027update_stats\u0027])"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"                # PUT (no first-byte timing!)"},{"line_number":643,"context_line":"                self._clear()"}],"source_content_type":"text/x-python","patch_set":40,"id":"64eba20c_8a277791","line":640,"in_reply_to":"d32359d5_06fc2bf9","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":639,"context_line":"                self.assertEqual("},{"line_number":640,"context_line":"                    [], app.access_logger.statsd_client.calls[\u0027update_stats\u0027])"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"                # PUT (no first-byte timing!)"},{"line_number":643,"context_line":"                self._clear()"},{"line_number":644,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":645,"context_line":"                    FakeApp(body\u003db\u002787654321\u0027, response_str\u003d\u0027314 PiTown\u0027), {},"}],"source_content_type":"text/x-python","patch_set":40,"id":"32c17c98_e118abbe","line":642,"updated":"2025-04-04 14:42:48.000000000","message":"new test method here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":639,"context_line":"                self.assertEqual("},{"line_number":640,"context_line":"                    [], app.access_logger.statsd_client.calls[\u0027update_stats\u0027])"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"                # PUT (no first-byte timing!)"},{"line_number":643,"context_line":"                self._clear()"},{"line_number":644,"context_line":"                app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":645,"context_line":"                    FakeApp(body\u003db\u002787654321\u0027, response_str\u003d\u0027314 PiTown\u0027), {},"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f36a626_5829a11f","line":642,"in_reply_to":"32c17c98_e118abbe","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":675,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":676,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 6, exp_labels),"},{"line_number":677,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":678,"context_line":"                    ])"},{"line_number":679,"context_line":"                else:"},{"line_number":680,"context_line":"                    self.assertUpdateStats("},{"line_number":681,"context_line":"                        [(\u0027%s.PUT.314.xfer\u0027 % exp_type, 6 + 8)], app)"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a576194_f960e84f","line":678,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":675,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":676,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 6, exp_labels),"},{"line_number":677,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":678,"context_line":"                    ])"},{"line_number":679,"context_line":"                else:"},{"line_number":680,"context_line":"                    self.assertUpdateStats("},{"line_number":681,"context_line":"                        [(\u0027%s.PUT.314.xfer\u0027 % exp_type, 6 + 8)], app)"}],"source_content_type":"text/x-python","patch_set":40,"id":"f3a19c31_7a7ae820","line":678,"in_reply_to":"3a576194_f960e84f","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":682,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":683,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 6, exp_labels),"},{"line_number":684,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":685,"context_line":"                    ])"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"                # PUT Repeat the test above, but with a non-existent policy"},{"line_number":688,"context_line":"                # Do this only for object types"}],"source_content_type":"text/x-python","patch_set":40,"id":"baba38b9_04209c69","line":685,"updated":"2025-04-04 14:42:48.000000000","message":"same assertion in if and else -\u003e dedent","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":682,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":683,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 6, exp_labels),"},{"line_number":684,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":685,"context_line":"                    ])"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"                # PUT Repeat the test above, but with a non-existent policy"},{"line_number":688,"context_line":"                # Do this only for object types"}],"source_content_type":"text/x-python","patch_set":40,"id":"7237f6d5_b2ca7e17","line":685,"in_reply_to":"baba38b9_04209c69","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":684,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":685,"context_line":"                    ])"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"                # PUT Repeat the test above, but with a non-existent policy"},{"line_number":688,"context_line":"                # Do this only for object types"},{"line_number":689,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":690,"context_line":"                    exp_labels.pop(\u0027policy\u0027)"}],"source_content_type":"text/x-python","patch_set":40,"id":"69b7469b_70a381d9","line":687,"updated":"2025-04-04 14:42:48.000000000","message":"new test method here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":685,"context_line":"                    ])"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"                # PUT Repeat the test above, but with a non-existent policy"},{"line_number":688,"context_line":"                # Do this only for object types"},{"line_number":689,"context_line":"                if exp_type \u003d\u003d \u0027object\u0027:"},{"line_number":690,"context_line":"                    exp_labels.pop(\u0027policy\u0027)"}],"source_content_type":"text/x-python","patch_set":40,"id":"575d5679_da82efd7","line":687,"in_reply_to":"69b7469b_70a381d9","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":712,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":713,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 6, exp_labels),"},{"line_number":714,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":715,"context_line":"                    ])"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def test_log_request_labeled_stats_get(self):"},{"line_number":718,"context_line":"        stub_times \u003d []"}],"source_content_type":"text/x-python","patch_set":40,"id":"896d68ea_af076f37","line":715,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":712,"context_line":"                    self.assertLabeledUpdateStats(["},{"line_number":713,"context_line":"                        (\u0027swift_proxy_request_body_bytes\u0027, 6, exp_labels),"},{"line_number":714,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":715,"context_line":"                    ])"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def test_log_request_labeled_stats_get(self):"},{"line_number":718,"context_line":"        stub_times \u003d []"}],"source_content_type":"text/x-python","patch_set":40,"id":"58b58541_3951a01a","line":715,"in_reply_to":"896d68ea_af076f37","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":714,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":715,"context_line":"                    ])"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def test_log_request_labeled_stats_get(self):"},{"line_number":718,"context_line":"        stub_times \u003d []"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":"        def stub_time():"}],"source_content_type":"text/x-python","patch_set":40,"id":"aae7f526_f0f436e9","line":717,"updated":"2025-04-04 14:42:48.000000000","message":"ooohhh! so are these tests ALREADY de-composed versions of the long test above, but only for labeled metrics??\n\nwhy do we have both? or is there a difference I haven\u0027t seen?","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":714,"context_line":"                        (\u0027swift_proxy_response_body_bytes\u0027, 8, exp_labels),"},{"line_number":715,"context_line":"                    ])"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def test_log_request_labeled_stats_get(self):"},{"line_number":718,"context_line":"        stub_times \u003d []"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":"        def stub_time():"}],"source_content_type":"text/x-python","patch_set":40,"id":"afb73a9e_ece984da","line":717,"in_reply_to":"aae7f526_f0f436e9","updated":"2025-04-08 15:19:19.000000000","message":"It seems that those tests were for labeled metrics, the only difference seems to be \"emit_legacy\" config option, which we already have unit tests for","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":958,"context_line":"            \u0027statsd_label_mode\u0027: \u0027signalfx\u0027,"},{"line_number":959,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":960,"context_line":"        }"},{"line_number":961,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":962,"context_line":"        for method, exp_method in method_map.items():"},{"line_number":963,"context_line":"            self._clear()"},{"line_number":964,"context_line":"            app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":40,"id":"3ba2f650_54694288","line":961,"updated":"2025-04-04 14:42:48.000000000","message":"let\u0027s move this to setUp an use in EVERY test","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":958,"context_line":"            \u0027statsd_label_mode\u0027: \u0027signalfx\u0027,"},{"line_number":959,"context_line":"            \u0027statsd_emit_legacy\u0027: True,"},{"line_number":960,"context_line":"        }"},{"line_number":961,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":962,"context_line":"        for method, exp_method in method_map.items():"},{"line_number":963,"context_line":"            self._clear()"},{"line_number":964,"context_line":"            app \u003d proxy_logging.ProxyLoggingMiddleware("}],"source_content_type":"text/x-python","patch_set":40,"id":"f7910cd3_1b05306e","line":961,"in_reply_to":"3ba2f650_54694288","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":975,"context_line":"            self.assertLabeledUpdateStats(["},{"line_number":976,"context_line":"                (\u0027swift_proxy_request_body_bytes\u0027, 11, {"},{"line_number":977,"context_line":"                    \u0027type\u0027: \u0027account\u0027,"},{"line_number":978,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":979,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":980,"context_line":"                    \u0027account\u0027: \u0027a\u0027}),"},{"line_number":981,"context_line":"                (\u0027swift_proxy_response_body_bytes\u0027, 3, {"}],"source_content_type":"text/x-python","patch_set":40,"id":"55a7901a_be0ba618","line":978,"range":{"start_line":978,"start_character":30,"end_line":978,"end_character":38},"updated":"2025-04-09 16:01:46.000000000","message":"shouldn\u0027t this be exp_method\n\nSame in a bunch of the following test.\n\nmock.ANY is useful when we need to assert a data structure that may contain a time for example, where the time is unpredictable but not the focus of the test.","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":975,"context_line":"            self.assertLabeledUpdateStats(["},{"line_number":976,"context_line":"                (\u0027swift_proxy_request_body_bytes\u0027, 11, {"},{"line_number":977,"context_line":"                    \u0027type\u0027: \u0027account\u0027,"},{"line_number":978,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":979,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":980,"context_line":"                    \u0027account\u0027: \u0027a\u0027}),"},{"line_number":981,"context_line":"                (\u0027swift_proxy_response_body_bytes\u0027, 3, {"}],"source_content_type":"text/x-python","patch_set":40,"id":"07a3ab59_742a1e1f","line":978,"range":{"start_line":978,"start_character":30,"end_line":978,"end_character":38},"in_reply_to":"55a7901a_be0ba618","updated":"2025-04-10 21:23:15.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":983,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":984,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":985,"context_line":"                    \u0027account\u0027: \u0027a\u0027})"},{"line_number":986,"context_line":"            ])"},{"line_number":987,"context_line":""},{"line_number":988,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":989,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"bcea9191_259617c4","line":986,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":983,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":984,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":985,"context_line":"                    \u0027account\u0027: \u0027a\u0027})"},{"line_number":986,"context_line":"            ])"},{"line_number":987,"context_line":""},{"line_number":988,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":989,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"e614789a_e2767a2c","line":986,"in_reply_to":"83a3f8be_8bf4fb2e","updated":"2025-04-10 21:23:15.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":983,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":984,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":985,"context_line":"                    \u0027account\u0027: \u0027a\u0027})"},{"line_number":986,"context_line":"            ])"},{"line_number":987,"context_line":""},{"line_number":988,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":989,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"f1e911b2_c0309760","line":986,"in_reply_to":"bcea9191_259617c4","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":983,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":984,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":985,"context_line":"                    \u0027account\u0027: \u0027a\u0027})"},{"line_number":986,"context_line":"            ])"},{"line_number":987,"context_line":""},{"line_number":988,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":989,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"83a3f8be_8bf4fb2e","line":986,"in_reply_to":"f1e911b2_c0309760","updated":"2025-04-09 16:01:46.000000000","message":"There still seems to be gaps in the labeled stats timing assertion here and in the following tests","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":1035,"context_line":"                        \u0027account\u0027: \u0027a\u0027,"},{"line_number":1036,"context_line":"                        \u0027container\u0027: \u0027c\u0027"},{"line_number":1037,"context_line":"                    })"},{"line_number":1038,"context_line":"                ])"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def test_basic_req(self):"},{"line_number":1041,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), {})"}],"source_content_type":"text/x-python","patch_set":40,"id":"e62c6573_3c4fa222","line":1038,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"                        \u0027account\u0027: \u0027a\u0027,"},{"line_number":1036,"context_line":"                        \u0027container\u0027: \u0027c\u0027"},{"line_number":1037,"context_line":"                    })"},{"line_number":1038,"context_line":"                ])"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def test_basic_req(self):"},{"line_number":1041,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), {})"}],"source_content_type":"text/x-python","patch_set":40,"id":"dbc74dfa_7622c9f4","line":1038,"in_reply_to":"e62c6573_3c4fa222","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":1240,"context_line":"                \u0027status\u0027: 200,"},{"line_number":1241,"context_line":"                \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":1242,"context_line":"                \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":1243,"context_line":"                \u0027policy\u0027: mock.ANY}),"},{"line_number":1244,"context_line":"            (\u0027swift_proxy_response_body_bytes\u0027, 8, {"},{"line_number":1245,"context_line":"                \u0027type\u0027: \u0027object\u0027,"},{"line_number":1246,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":40,"id":"58a10835_bf72b41c","line":1243,"range":{"start_line":1243,"start_character":26,"end_line":1243,"end_character":35},"updated":"2025-04-09 16:01:46.000000000","message":"we know the policy (0) I think - it is embedded in the legacy metric name (line 1234)","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"                \u0027status\u0027: 200,"},{"line_number":1241,"context_line":"                \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":1242,"context_line":"                \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":1243,"context_line":"                \u0027policy\u0027: mock.ANY}),"},{"line_number":1244,"context_line":"            (\u0027swift_proxy_response_body_bytes\u0027, 8, {"},{"line_number":1245,"context_line":"                \u0027type\u0027: \u0027object\u0027,"},{"line_number":1246,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":40,"id":"0cc8689c_f12aad27","line":1243,"range":{"start_line":1243,"start_character":26,"end_line":1243,"end_character":35},"in_reply_to":"58a10835_bf72b41c","updated":"2025-04-10 21:23:15.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":1248,"context_line":"                \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":1249,"context_line":"                \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":1250,"context_line":"                \u0027policy\u0027: mock.ANY})"},{"line_number":1251,"context_line":"        ])"},{"line_number":1252,"context_line":""},{"line_number":1253,"context_line":"    def test_invalid_log_config(self):"},{"line_number":1254,"context_line":"        with self.assertRaises(ValueError):"}],"source_content_type":"text/x-python","patch_set":40,"id":"9a770bfb_15026ac2","line":1251,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":1248,"context_line":"                \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":1249,"context_line":"                \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":1250,"context_line":"                \u0027policy\u0027: mock.ANY})"},{"line_number":1251,"context_line":"        ])"},{"line_number":1252,"context_line":""},{"line_number":1253,"context_line":"    def test_invalid_log_config(self):"},{"line_number":1254,"context_line":"        with self.assertRaises(ValueError):"}],"source_content_type":"text/x-python","patch_set":40,"id":"4db6e727_fd300339","line":1251,"in_reply_to":"9a770bfb_15026ac2","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25f3b3dd17d8fbfd4eb860321b19927d52568352","unresolved":true,"context_lines":[{"line_number":1296,"context_line":"                \u0027type\u0027: \u0027SOS\u0027,"},{"line_number":1297,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"},{"line_number":1298,"context_line":"                \u0027status\u0027: 200})"},{"line_number":1299,"context_line":"        ])"},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"    def test_log_headers(self):"},{"line_number":1302,"context_line":"        for conf_key in [\u0027access_log_headers\u0027, \u0027log_headers\u0027]:"}],"source_content_type":"text/x-python","patch_set":40,"id":"78177f8d_3b8fae88","line":1299,"updated":"2025-04-04 14:42:48.000000000","message":"there\u0027s no labeled timing assertion here","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4a40126889c46880c4672ab1869d8e9a685c423c","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"                \u0027type\u0027: \u0027SOS\u0027,"},{"line_number":1297,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"},{"line_number":1298,"context_line":"                \u0027status\u0027: 200})"},{"line_number":1299,"context_line":"        ])"},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"    def test_log_headers(self):"},{"line_number":1302,"context_line":"        for conf_key in [\u0027access_log_headers\u0027, \u0027log_headers\u0027]:"}],"source_content_type":"text/x-python","patch_set":40,"id":"98f93732_c4bfcf9f","line":1299,"in_reply_to":"78177f8d_3b8fae88","updated":"2025-04-08 15:19:19.000000000","message":"Acknowledged","commit_id":"832a31fab8e970901b805f1bcfc140b7216a8b0f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":199,"context_line":"        for timing_call in timing_calls:"},{"line_number":200,"context_line":"            self.assertNotEqual(not_exp_metric, timing_call[0][0])"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def assertLabeledTiming(self, exp_metric, exp_timing\u003dNone,"},{"line_number":203,"context_line":"                            exp_labels\u003dNone):"},{"line_number":204,"context_line":"        timing_calls \u003d self.statsd.calls[\u0027timing\u0027]"},{"line_number":205,"context_line":"        found \u003d False"}],"source_content_type":"text/x-python","patch_set":45,"id":"150b55af_a41a4d3e","line":202,"range":{"start_line":202,"start_character":8,"end_line":202,"end_character":27},"updated":"2025-04-09 16:01:46.000000000","message":"this is no longer used","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        for timing_call in timing_calls:"},{"line_number":200,"context_line":"            self.assertNotEqual(not_exp_metric, timing_call[0][0])"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def assertLabeledTiming(self, exp_metric, exp_timing\u003dNone,"},{"line_number":203,"context_line":"                            exp_labels\u003dNone):"},{"line_number":204,"context_line":"        timing_calls \u003d self.statsd.calls[\u0027timing\u0027]"},{"line_number":205,"context_line":"        found \u003d False"}],"source_content_type":"text/x-python","patch_set":45,"id":"22c97398_592c8bd9","line":202,"range":{"start_line":202,"start_character":8,"end_line":202,"end_character":27},"in_reply_to":"150b55af_a41a4d3e","updated":"2025-04-10 21:23:15.000000000","message":"Acknowledged","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":730,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":731,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":732,"context_line":"                    \u0027account\u0027: \u0027a\u0027})"},{"line_number":733,"context_line":"            ])"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":736,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":45,"id":"b8111c55_b95ae2d6","line":733,"updated":"2025-04-09 16:01:46.000000000","message":"mentioned elsewhere I think, but I think for completeness, and symmetry with the legacy assertions, we should also ``assertLabeledTimingStats``.\n\nThe expected labels should be the same for every labeled metric so the assertions (here and in following patches) would be more compact if an ``exp_labels`` dict was defined. e.g.:\n\n```\nexp_labels \u003d {\u0027type\u0027: \u0027account\u0027,\n              \u0027method\u0027: mock.ANY,\n              \u0027status\u0027: 299,\n              \u0027account\u0027: \u0027a\u0027}\nself.assertLabeledUpdateStats([\n                (\u0027swift_proxy_request_body_bytes\u0027, 11, exp_labels),\n                (\u0027swift_proxy_response_body_bytes\u0027, 3, exp_labels)\n            ])\n```","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":730,"context_line":"                    \u0027method\u0027: mock.ANY,"},{"line_number":731,"context_line":"                    \u0027status\u0027: 299,"},{"line_number":732,"context_line":"                    \u0027account\u0027: \u0027a\u0027})"},{"line_number":733,"context_line":"            ])"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    def test_log_request_stat_method_filtering_custom(self):"},{"line_number":736,"context_line":"        method_map \u003d {"}],"source_content_type":"text/x-python","patch_set":45,"id":"d32314a1_292472a7","line":733,"in_reply_to":"b8111c55_b95ae2d6","updated":"2025-04-10 21:23:15.000000000","message":"Acknowledged","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":951,"context_line":"        req \u003d Request.blank(\u0027/bucket/path/to/key\u0027, environ\u003d{"},{"line_number":952,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":953,"context_line":"            # This would actually get set in the app, but w/e"},{"line_number":954,"context_line":"            \u0027swift.backend_path\u0027: \u0027/v1/AUTH_test/bucket/path/to/key\u0027})"},{"line_number":955,"context_line":"        with mock.patch(\"time.time\", side_effect\u003d["},{"line_number":956,"context_line":"                18.0, 18.5, 20.71828182846]):"},{"line_number":957,"context_line":"            resp \u003d app(req.environ, start_response)"}],"source_content_type":"text/x-python","patch_set":45,"id":"56bb745b_169efd28","line":954,"range":{"start_line":954,"start_character":12,"end_line":954,"end_character":68},"updated":"2025-04-09 16:01:46.000000000","message":"FWIW this appears to be the only test that sets \u0027swift.backend_path\u0027 - good we have one!","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":951,"context_line":"        req \u003d Request.blank(\u0027/bucket/path/to/key\u0027, environ\u003d{"},{"line_number":952,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":953,"context_line":"            # This would actually get set in the app, but w/e"},{"line_number":954,"context_line":"            \u0027swift.backend_path\u0027: \u0027/v1/AUTH_test/bucket/path/to/key\u0027})"},{"line_number":955,"context_line":"        with mock.patch(\"time.time\", side_effect\u003d["},{"line_number":956,"context_line":"                18.0, 18.5, 20.71828182846]):"},{"line_number":957,"context_line":"            resp \u003d app(req.environ, start_response)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f0c0bd8_79adbfe8","line":954,"range":{"start_line":954,"start_character":12,"end_line":954,"end_character":68},"in_reply_to":"56bb745b_169efd28","updated":"2025-04-10 21:23:15.000000000","message":"Acknowledged","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4488ff869d15774a446956ae5f9a7e9e8c06154f","unresolved":true,"context_lines":[{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":"        conf \u003d {\u0027statsd_emit_legacy\u0027: \u0027no\u0027}"},{"line_number":1327,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), conf)"},{"line_number":1328,"context_line":"        self.assertFalse(app.access_logger.logger.statsd_client.emit_legacy)"},{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"    def test_filter(self):"},{"line_number":1331,"context_line":"        factory \u003d proxy_logging.filter_factory({})"}],"source_content_type":"text/x-python","patch_set":45,"id":"9e948ec1_51f91582","line":1328,"updated":"2025-04-09 16:01:46.000000000","message":"as discussed verbally, IMHO this is sufficient to verify that the proxy logging middleware is correctly passing the statsd_emit_legacy option to the LabeledStatsdClient, which is worth verifying given proxy-logging\u0027s translating of the conf options.","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"e7dec8f54b76dc99214d53fbbfa9b0a89afa7556","unresolved":false,"context_lines":[{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":"        conf \u003d {\u0027statsd_emit_legacy\u0027: \u0027no\u0027}"},{"line_number":1327,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), conf)"},{"line_number":1328,"context_line":"        self.assertFalse(app.access_logger.logger.statsd_client.emit_legacy)"},{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"    def test_filter(self):"},{"line_number":1331,"context_line":"        factory \u003d proxy_logging.filter_factory({})"}],"source_content_type":"text/x-python","patch_set":45,"id":"18e04939_b576677f","line":1328,"in_reply_to":"9e948ec1_51f91582","updated":"2025-04-10 21:23:15.000000000","message":"Acknowledged","commit_id":"c54335dfbb5d1b794f68fd274c6dfbace7051d4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ab0c59e03d16f918a0f9aec15e3c22f8b397a0f8","unresolved":true,"context_lines":[{"line_number":709,"context_line":"                \u0027account\u0027: \u0027a\u0027"},{"line_number":710,"context_line":"            }"},{"line_number":711,"context_line":"            self.assertLabeledTimingStats(["},{"line_number":712,"context_line":"                (\u0027swift_proxy_request_timing\u0027, mock.ANY, exp_labels),"},{"line_number":713,"context_line":"            ])"},{"line_number":714,"context_line":"            self.assertLabeledUpdateStats(["},{"line_number":715,"context_line":"                (\u0027swift_proxy_request_body_bytes\u0027, 11, exp_labels),"}],"source_content_type":"text/x-python","patch_set":47,"id":"30188bd4_c8350d57","line":712,"range":{"start_line":712,"start_character":47,"end_line":712,"end_character":55},"updated":"2025-04-11 13:09:54.000000000","message":"this is going to be the same value as used in assertTiming above i.e. ``1.17 * 1000``","commit_id":"bc3f550342635c40943520c5cdaf7aaf4e7b289b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ba9d4897f8505ad697cf0853574b0d9d27738bdb","unresolved":false,"context_lines":[{"line_number":709,"context_line":"                \u0027account\u0027: \u0027a\u0027"},{"line_number":710,"context_line":"            }"},{"line_number":711,"context_line":"            self.assertLabeledTimingStats(["},{"line_number":712,"context_line":"                (\u0027swift_proxy_request_timing\u0027, mock.ANY, exp_labels),"},{"line_number":713,"context_line":"            ])"},{"line_number":714,"context_line":"            self.assertLabeledUpdateStats(["},{"line_number":715,"context_line":"                (\u0027swift_proxy_request_body_bytes\u0027, 11, exp_labels),"}],"source_content_type":"text/x-python","patch_set":47,"id":"ecf41e3b_2997aaeb","line":712,"range":{"start_line":712,"start_character":47,"end_line":712,"end_character":55},"in_reply_to":"30188bd4_c8350d57","updated":"2025-04-17 19:23:18.000000000","message":"Acknowledged","commit_id":"bc3f550342635c40943520c5cdaf7aaf4e7b289b"}],"test/unit/common/utils/test_logs.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e534bbc2ac5700be2099500aa33294dda5ee5082","unresolved":true,"context_lines":[{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"        anon \u003d utils.StrAnonymizer(None, \u0027sha1\u0027, \u0027salty_secret\u0027)"},{"line_number":1067,"context_line":"        self.assertEqual(anon, \u0027\u0027)"},{"line_number":1068,"context_line":"        self.assertEqual(anon.anonymized, \u0027\u0027)"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def test_str_anonymizer_python_maddness(self):"},{"line_number":1071,"context_line":"        utils.StrAnonymizer(\u0027Swift is great!\u0027, \u0027sha1\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"36421b64_2cd9cc88","line":1068,"updated":"2025-03-20 15:24:50.000000000","message":"seem ok but off-topic?","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef6e1b732d13fa1d6b0825cd89791b1a1991cb00","unresolved":false,"context_lines":[{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"        anon \u003d utils.StrAnonymizer(None, \u0027sha1\u0027, \u0027salty_secret\u0027)"},{"line_number":1067,"context_line":"        self.assertEqual(anon, \u0027\u0027)"},{"line_number":1068,"context_line":"        self.assertEqual(anon.anonymized, \u0027\u0027)"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def test_str_anonymizer_python_maddness(self):"},{"line_number":1071,"context_line":"        utils.StrAnonymizer(\u0027Swift is great!\u0027, \u0027sha1\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"013cca69_40fbe4ef","line":1068,"in_reply_to":"36421b64_2cd9cc88","updated":"2025-03-21 19:30:42.000000000","message":"Acknowledged","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2d26b6dbb091a53887b941e5d803aa3df7378085","unresolved":false,"context_lines":[{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"        anon \u003d utils.StrAnonymizer(None, \u0027sha1\u0027, \u0027salty_secret\u0027)"},{"line_number":1067,"context_line":"        self.assertEqual(anon, \u0027\u0027)"},{"line_number":1068,"context_line":"        self.assertEqual(anon.anonymized, \u0027\u0027)"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def test_str_anonymizer_python_maddness(self):"},{"line_number":1071,"context_line":"        utils.StrAnonymizer(\u0027Swift is great!\u0027, \u0027sha1\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"8d4976f6_dcbeacb7","line":1068,"in_reply_to":"36421b64_2cd9cc88","updated":"2025-03-25 18:30:59.000000000","message":"Done","commit_id":"d97da4438126ee49c6e295af24e28ed2e421132b"}]}
