)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"96bd26a4d198a1b8992a1664d5d34d48e5ed6e23","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Shreeya Deshpande \u003cshreeyad@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-11-20 14:49:55 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"proxy-logging: Add client label if original request is from S3 client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I26f75fb61ba0d13ca16810f13cc6cc193898211a"},{"line_number":10,"context_line":"Signed-off-by: Yan Xiao \u003cyanxiao@nvidia.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"35772efb_d8e082e5","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":25},"updated":"2025-11-21 13:16:09.000000000","message":"s/client/api/\n\nAlso, it wouldn\u0027t hurt to have a little more detail in the commit message as a heads-up to SREs e.g. what\u0027s the label key and what values can it take?","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2d749309212995855970187ed1cd21da9d5fad53","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shreeya Deshpande \u003cshreeyad@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-11-20 14:49:55 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"proxy-logging: Add client label if original request is from S3 client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I26f75fb61ba0d13ca16810f13cc6cc193898211a"},{"line_number":10,"context_line":"Signed-off-by: Yan Xiao \u003cyanxiao@nvidia.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"4973e942_2667901e","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":25},"in_reply_to":"35772efb_d8e082e5","updated":"2025-11-24 17:25:57.000000000","message":"Done","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4d2ed402d1a5c48422e73b015c5f314d4fc9f270","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2026-01-06 11:44:29 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"proxy-logging: Add \u0027api\u0027 label to determine if the original"},{"line_number":8,"context_line":"request is from S3 client or swift."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"labels[\u0027api\u0027] \u003d \u0027S3\u0027 or \u0027swift\u0027"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"c774b4a2_48703eff","line":8,"updated":"2026-01-12 06:09:38.000000000","message":"First line we should try and keep at least as close to 50 chars as per the opendev commit message guidelines: https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"68a6bd009438be3c352046aa2e920d05043827c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c533de69_9c36aa2f","updated":"2025-01-15 15:22:32.000000000","message":"There should a test for s3request to verify that the env flag is set.\n\nI\u0027m not sure if my suggestion to put the flag in a \u0027labels\u0027 dict in the env is good or if it is conflating concerns. It depends if we think the flag is only for logging to use or is more generally useful.","commit_id":"f12623985c89df6ff695c5fee4acbb21197f2c2f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ab6ef665aa92b5ca5bebf69e49d8b7af9691c0e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"290bc9c7_63b05c67","updated":"2025-11-06 19:14:01.000000000","message":"lgtm!","commit_id":"1a16a95a0b3c905075dbf7b1237ff21299bd9b6f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2e97bfed03c7e5d99d65729ea04dd3df911e93ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b8eeaf4e_c83ba001","updated":"2025-11-17 15:37:45.000000000","message":"wow, base_labels made this a very straightforward change.\n\nI\u0027m interested in opinions about the naming though...","commit_id":"1a16a95a0b3c905075dbf7b1237ff21299bd9b6f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a88b01b3f0d18fdd4b92828733182bcc85918238","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"14c5d1d7_429b1827","updated":"2025-11-19 17:29:14.000000000","message":"we want to see some tests with api: swift","commit_id":"ae0a8bc24fb35ac2b17eea9ae027b43b8da15b00"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"96bd26a4d198a1b8992a1664d5d34d48e5ed6e23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"838f1b4c_839276c3","updated":"2025-11-21 13:16:09.000000000","message":"This is adding the api label to the base_labels in the request environment, but currently only the xfer bytes stats use base_labels, so I only see the api label on those stats:\n\ni.e. it\u0027s only on ``swift_proxy_server_request_body_streaming_bytes`` and ``swift_proxy_server_response_body_streaming_bytes``\n\n```\nswift_proxy_server_request_body_streaming_bytes:11358|c|#account:AUTH_test,api:swift,container:test,method:PUT,resource:object\nproxy-server.object.PUT.201.timing:22.9805|ms\nproxy-server.object.PUT.201.xfer:11358|c\nproxy-server.object.policy.0.PUT.201.timing:22.9805|ms\nproxy-server.object.policy.0.PUT.201.xfer:11358|c\nswift_proxy_server_request_timing:22.9805|ms|#account:AUTH_test,container:test,method:PUT,policy:0,resource:object,status:201\nswift_proxy_server_request_body_bytes:11358|c|#account:AUTH_test,container:test,method:PUT,policy:0,resource:object,status:201\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,container:test,method:PUT,policy:0,resource:object,status:201\n\n\nproxy-server.object.GET.200.first-byte.timing:64.6925|ms\nproxy-server.object.policy.0.GET.200.first-byte.timing:64.6925|ms\nswift_proxy_server_request_ttfb:64.6925|ms|#account:AUTH_test,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_response_body_streaming_bytes:11358|c|#account:AUTH_test,api:swift,container:test,method:GET,policy:0,resource:object,status:200\nproxy-server.object.GET.200.timing:81.5175|ms\nproxy-server.object.GET.200.xfer:11358|c\nproxy-server.object.policy.0.GET.200.timing:81.5175|ms\nproxy-server.object.policy.0.GET.200.xfer:11358|c\nswift_proxy_server_request_timing:81.5175|ms|#account:AUTH_test,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_response_body_bytes:11358|c|#account:AUTH_test,container:test,method:GET,policy:0,resource:object,status:200\n```\n\nI\u0027m therefore voting -1 because as a minimum the commit message needs to be updated to be clear about the limited scope of this change, pointing out that only some of the stats are getting this new label. Maybe its worth merging that as a step forwards. \n\nBut ideally we\u0027d have this label on *all* the proxy-logging stats which could be achieved by either:\n\n1. migrating all proxy-logging labeled stats to use base_labels. This was on our radar but perhaps we lost track of it. IIRC there\u0027s a small wrinkle with how the container name is treated for some requests, but we ought to cross that bridge at some point and have uniform labelling.\n\nOR\n\n2. just tactically add the api label to the other places where labeled metrics are emitted.","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dcf2c4cfdce8668b75b7dbcfc911fdc7d1d72531","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"08ffaeeb_11db38ab","updated":"2025-12-22 13:59:50.000000000","message":"I worked out why I was not seeing the correct s3 api label in my vsaio tests:\n\n* My request is using aws v4 header auth with ``Authorization: AWS4-HMAC-SHA256 Credential\u003dtest:tester...``\n* ``is_s3_req`` is true if the ``Authorization`` header has the ``Credential`` part\n* the first things log_request does is ``obscure_req`` which truncates sensitive headers, including ``Authorization``, to 16 characters. IMHO it\u0027s not good that this modifies the request environ but it is what it is!\n* For aws v4 header auth that reduces the ``Authorization`` header to just ``AWS4-HMAC-SHA256...`` which nol longer looks like an s3 req when checked in ``is_s3_req`` 😞\n\nAll the proxy logging unit tests pass because they us aws v2 header auth with the shorter ``AWS`` prefix in the ``Authorization`` so the header still looks like a valid s3 req even when truncated to 16 (by chance!).\n\nThe good news is that we determined if the request is s3 or not early in handling when ``base_labels`` was added to the req environ, so we should just use the value in ``base_labels`` 😊\n\nThe not so good news is that because of the legacy edge cases (e.g. container modification in swift.backend_path) it\u0027s not absolutely clear to me that we can just use all of ``base_labels`` everywhere 😞 WE absolutely SHOULD try to work towards that goal, but it\u0027s beyond the scope of this patch IMHO.\n\nso for now we could do something like\n\n```\ndiff --git a/swift/common/middleware/proxy_logging.py b/swift/common/middleware/proxy_logging.py\nindex a514c594e..cefadf0a4 100644\n--- a/swift/common/middleware/proxy_logging.py\n+++ b/swift/common/middleware/proxy_logging.py\n@@ -551,6 +551,11 @@ class ProxyLoggingMiddleware(object):\n \n     def statsd_metric_labels(self, req, status_int, metric_method, acc\u003dNone,\n                              cont\u003dNone, policy_index\u003dNone):\n+        # overlay freshly derived labels onto base_labels just in case any\n+        # changed w.r.t. base labels while the request was being handled (in\n+        # particular, container may be different in swift.backend_path)\n+        # TODO: remove unnecessary duplication in the overlay e.g. method,\n+        #  account\n         resource_type \u003d self.get_resource_type(req)\n \n         labels \u003d {\n@@ -558,7 +563,6 @@ class ProxyLoggingMiddleware(object):\n             \u0027method\u0027: metric_method,\n             \u0027status\u0027: status_int,\n         }\n-        labels[\u0027api\u0027] \u003d \u0027S3\u0027 if is_s3_req(req) else \u0027swift\u0027\n         if acc:\n             labels[\u0027account\u0027] \u003d acc\n         if cont:\n@@ -567,7 +571,7 @@ class ProxyLoggingMiddleware(object):\n                 policy_index is not None and \\\n                 POLICIES.get_by_index(policy_index) is not None:\n             labels[\u0027policy\u0027] \u003d policy_index\n-        return labels\n+        return ChainMap(labels, req.environ[\u0027swift.base_labels\u0027])\n \n     def __call__(self, env, start_response):\n         req \u003d Request(env)\n@@ -581,10 +585,10 @@ class ProxyLoggingMiddleware(object):\n         start_response_args \u003d [None]\n \n         xfer_metric_name \u003d \u0027swift_proxy_server_request_body_streaming_bytes\u0027\n-        xfer_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)\n+        base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)\n \n         statsd_emit_callback \u003d BufferXferEmitCallback(\n-            xfer_metric_name, xfer_labels, self.statsd,\n+            xfer_metric_name, base_labels, self.statsd,\n             self.emit_buffer_xfer_bytes_sec)\n         input_proxy \u003d CallbackInputProxy(env[\u0027wsgi.input\u0027],\n                                          statsd_emit_callback)\n@@ -655,7 +659,7 @@ class ProxyLoggingMiddleware(object):\n                 )\n \n             resp_xfer_labels \u003d statsd_metric_resp_labels(\n-                xfer_labels, status_int\u003dwire_status_int,\n+                base_labels, status_int\u003dwire_status_int,\n                 policy_index\u003dpolicy_index)\n \n             bytes_sent \u003d 0\ndiff --git a/test/unit/common/middleware/test_proxy_logging.py b/test/unit/common/middleware/test_proxy_logging.py\nindex 6d5caea47..8b95f4e36 100644\n--- a/test/unit/common/middleware/test_proxy_logging.py\n+++ b/test/unit/common/middleware/test_proxy_logging.py\n@@ -1064,6 +1064,7 @@ class TestProxyLogging(BaseTestProxyLogging):\n                 FakeApp(), {}, logger\u003dself.logger)\n             app.statsd \u003d self.statsd\n             req \u003d Request.blank(\u0027/v1/a/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: method})\n+            app.update_swift_base_labels(req)\n             now \u003d 10000.0\n             app.log_request(req, 299, 11, 3, now, now + 1.17)\n             self.assertTiming(\u0027account.%s.299.timing\u0027 % exp_method, app,\n@@ -1108,6 +1109,7 @@ class TestProxyLogging(BaseTestProxyLogging):\n                 req \u003d Request.blank(\u0027/v1/a/c\u0027,\n                                     environ\u003d{\u0027REQUEST_METHOD\u0027: method})\n                 now \u003d 10000.0\n+                app.update_swift_base_labels(req)\n                 app.log_request(req, 911, 4, 43, now, now + 1.01)\n                 self.assertTiming(\u0027container.%s.911.timing\u0027 % exp_method, app,\n                                   exp_timing\u003d1.01 * 1000)\n@@ -2342,6 +2344,7 @@ class TestProxyLogging(BaseTestProxyLogging):\n             \u0027statsd_label_mode\u0027: \u0027dogstatsd\u0027,\n             \u0027statsd_emit_buffer_xfer_bytes_seconds\u0027: 0,\n             \u0027storage_domain\u0027: storage_domain,\n+            \u0027reveal_sensitive_prefix\u0027: 1,\n         }\n         app \u003d proxy_logging.ProxyLoggingMiddleware(\n             app, proxy_logging_conf, logger\u003dself.logger)\n\n```","commit_id":"c5bfee1573707d83d7e3401f68aacc81cdd427fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f2e39ebb9ae2d5058bf2b23c976047a1f4842eb6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4ef4d497_70b6f14b","updated":"2025-12-19 19:00:46.000000000","message":"When I do `aws s3api list-buckets` in my vsaio I see:\n\n```\nvagrant@saio:~/udp_listener$ python3 ./udp_listener.py |grep \u0027api\u0027\n[270134] Listening for UDP packets on port [::]:8125\nswift_proxy_server_request_ttfb:3.3073|ms|#account:AUTH_test,api:S3,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_response_body_streaming_bytes:352|c|#account:AUTH_test,api:S3,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_request_timing:3.7918|ms|#account:AUTH_test,api:swift,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:352|c|#account:AUTH_test,api:swift,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_request_ttfb:3.0162|ms|#account:AUTH_test,api:swift,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_response_body_streaming_bytes:2|c|#account:AUTH_test,api:S3,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_request_timing:3.4757|ms|#account:AUTH_test,api:swift,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:2|c|#account:AUTH_test,api:swift,method:GET,resource:account,status:200,user_reqctx:subrequest\nswift_proxy_server_request_ttfb:10.2942|ms|#account:AUTH_test,api:S3,method:GET,resource:account,status:200\nswift_proxy_server_response_body_streaming_bytes:403|c|#account:AUTH_test,api:S3,method:GET,resource:account,status:200\nswift_proxy_server_request_timing:10.5753|ms|#account:AUTH_test,api:swift,method:GET,resource:account,status:200\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,method:GET,resource:account,status:200\nswift_proxy_server_response_body_bytes:403|c|#account:AUTH_test,api:swift,method:GET,resource:account,status:200\n```\n\nthe metrics with `user_reqctx:subrequest` have api: swift which is correct because they are the internal swift reqs that the s3api synthesizes.\n\nBut the other metrics should all have ``api: s3``, excpe the final 3 don\u0027t ?!?\n\nI\u0027ve not been able to figure out why: for some reason when ``statsd_metric_labels`` is called in log_request it\u0027s not detecting the req as s3? Maybe the request headers are modified as the request is handled and no longer have the ``Authorization`` header???\n\nI\u0027d like to understand the reason, but it may be that we need to determine the api earlier as the request is first received.","commit_id":"c5bfee1573707d83d7e3401f68aacc81cdd427fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"69f7732b_42ce8e25","updated":"2026-01-09 15:22:24.000000000","message":"We should discuss whether we should just apply base_labels everywhere rather than sometimes updating account \u0026 container.\n\nsee https://review.opendev.org/c/openstack/swift/+/972906 for a test suggestion","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a95854d8975991c7b36bb17442287735ecb5fb4f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"09f5d3a3_4cfa5f6b","updated":"2026-01-15 15:00:16.000000000","message":"@shreeya please remove *all* the unnecessary whitespace changes added from patchset 7 and run flake8 to check pep8 compliance","commit_id":"a5040eadb1037a2f5d803d89bf91b035428e83a2"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"7c7ee54064af8e3303a4941ddff5807ddba60daa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"efc014ac_9ed13520","updated":"2026-01-17 02:14:04.000000000","message":"All of this LGTM with some minor concerns that might not need a lot of time addressing","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"bb1a68a0_4952c90e","updated":"2026-01-19 13:13:23.000000000","message":"I see the label using swift API:\n```\nvagrant@saio:~/swift$ curl -i http://saio:8080/v1/AUTH_test/test/LICENSE -X PUT -H \"x-object-meta-mtime: 1671468180.000000\" -H \"X-Auth-Token: AUTH_tkf3bb68890bfe48bd96c55680ac8c24b0\" -H \"Content-Length: 11358\" -T LICENSE\nHTTP/1.1 100 Continue\n\nHTTP/1.1 201 Created\nContent-Type: text/html; charset\u003dUTF-8\nContent-Length: 0\nEtag: \"3b83ef96387f14655fc854ddc3c6bd57\"\nLast-Modified: Mon, 19 Jan 2026 12:02:57 GMT\nX-Trans-Id: tx7e606de2cb4a4bd390f4d-00696e1d70\nX-Openstack-Request-Id: tx7e606de2cb4a4bd390f4d-00696e1d70\nDate: Mon, 19 Jan 2026 12:02:56 GMT\n\nswift_proxy_server_request_timing:5.4913|ms|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:account,status:204,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:account,status:204,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:account,status:204,user_reqctx:subrequest\nswift_proxy_server_request_timing:5.2245|ms|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:container,status:204,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:container,status:204,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:container,status:204,user_reqctx:subrequest\nswift_proxy_server_request_body_streaming_bytes:11358|c|#account:AUTH_test,api:swift,container:test,method:PUT,resource:object\nswift_proxy_server_request_timing:38.0118|ms|#account:AUTH_test,api:swift,container:test,method:PUT,policy:0,resource:object,status:201\nswift_proxy_server_request_body_bytes:11358|c|#account:AUTH_test,api:swift,container:test,method:PUT,policy:0,resource:object,status:201\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:PUT,policy:0,resource:object,status:201\n\n\nvagrant@saio:~/swift$ curl -i http://saio:8080/v1/AUTH_test/test/LICENSE -X GET -H \"X-Auth-Token: AUTH_tkf3bb68890bfe48bd96c55680ac8c24b0\" \u003e /dev/null\n  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n100 11358  100 11358    0     0   495k      0 --:--:-- --:--:-- --:--:--  504k\n\n\nswift_proxy_server_request_timing:3.691|ms|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:account,status:204,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:account,status:204,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:account,status:204,user_reqctx:subrequest\nswift_proxy_server_request_timing:6.5734|ms|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:container,status:204,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:container,status:204,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:HEAD,resource:container,status:204,user_reqctx:subrequest\nswift_proxy_server_request_ttfb:16.7878|ms|#account:AUTH_test,api:swift,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_response_body_streaming_bytes:11358|c|#account:AUTH_test,api:swift,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_request_timing:18.6687|ms|#account:AUTH_test,api:swift,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:swift,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_response_body_bytes:11358|c|#account:AUTH_test,api:swift,container:test,method:GET,policy:0,resource:object,status:200\n\n```\n\nand via s3api\n\n```\nvagrant@saio:~/swift$ aws s3api put-object --bucket test --key foo\n\nswift_proxy_server_request_timing:15.6496|ms|#account:AUTH_test,api:S3,container:test,method:PUT,policy:0,resource:object,status:201,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:PUT,policy:0,resource:object,status:201,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:PUT,policy:0,resource:object,status:201,user_reqctx:subrequest\nswift_proxy_server_request_timing:18.2137|ms|#account:AUTH_test,api:S3,container:test,method:PUT,policy:0,resource:object,status:200\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:PUT,policy:0,resource:object,status:200\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:PUT,policy:0,resource:object,status:200\n\n\nvagrant@saio:~/swift$ aws s3api get-object --bucket test --key foo /dev/null\n\nswift_proxy_server_request_ttfb:3.2685|ms|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200,user_reqctx:subrequest\nswift_proxy_server_request_timing:3.6995|ms|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200,user_reqctx:subrequest\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200,user_reqctx:subrequest\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200,user_reqctx:subrequest\nswift_proxy_server_request_ttfb:6.4089|ms|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_request_timing:6.6085|ms|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_request_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200\nswift_proxy_server_response_body_bytes:0|c|#account:AUTH_test,api:S3,container:test,method:GET,policy:0,resource:object,status:200\n\n```","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"48412623973e9afbf2edddb2df6a288a52a890ae","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"c32c5f6a_25e1805f","updated":"2026-01-17 01:59:33.000000000","message":"Shouldn\u0027t we be adding a functional/probe test to verify the \"api\" label shows up correctly in real metrics ?","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"089fd0ba5ab96a81dc723a8a1a138acd96380c9c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"335f67fb_6f060242","updated":"2026-01-19 13:13:57.000000000","message":"see fixups here https://review.opendev.org/c/openstack/swift/+/973826","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"19da05547b94b69679c0de253126c1bb96df8532","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"13163125_0f7ae392","in_reply_to":"506a9801_e97d912e","updated":"2026-01-20 20:11:01.000000000","message":"Acknowledged","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"506a9801_e97d912e","in_reply_to":"c32c5f6a_25e1805f","updated":"2026-01-19 13:13:23.000000000","message":"Functional tests only test the external API, they cannot inspect internal processes.\n\nAFAIK probe tests do not assume or install a statsd collector, so assertions cannot be made there either. So we have to rely on unit tests in this case.","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"9f574f51d25488f28427ecbfa45fd5e846c3c3a4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"b76954a6_a9381930","updated":"2026-01-19 17:22:29.000000000","message":"recheck","commit_id":"0f3e11176ae4264ab4a9b3134d2599c7ef92dcd6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b3238d3a757cbe86eb01dd1daeb535bad2a7a50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c169d0f8_7d3e54eb","updated":"2026-01-19 18:43:01.000000000","message":"something has changed in test infra that is causing the bandit job (part of pep8) to fail on a line that this patch does not touch 😞\n\n```\npep8: 13256 W commands[2]\u003e bandit -c bandit.yaml -r swift -n 5 [tox/tox_env/api.py:464]\n[main]\tINFO\tprofile include tests: None\n[main]\tINFO\tprofile exclude tests: B608,B603,B404,B405,B311,B104,B110,B607\n[main]\tINFO\tcli include tests: None\n[main]\tINFO\tcli exclude tests: None\n[main]\tINFO\tusing config: bandit.yaml\n[main]\tINFO\trunning on Python 3.12.3\n[manager]\tWARNING\tTest in comment: bandit is not a test name or id, ignoring\n[manager]\tWARNING\tTest in comment: bandit is not a test name or id, ignoring\n[tester]\tWARNING\tnosec encountered (B105), but no failed test on line 1682\n[tester]\tWARNING\tnosec encountered (B105), but no failed test on line 1727\nWorking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:03\nRun started:2026-01-19 16:00:24.297708+00:00\n\nTest results:\n\u003e\u003e Issue: [B105:hardcoded_password_string] Possible hardcoded password: \u00271234...\u0027\n   Severity: Low   Confidence: Medium\n   CWE: CWE-259 (https://cwe.mitre.org/data/definitions/259.html)\n   More Info: https://bandit.readthedocs.io/en/1.9.3/plugins/b105_hardcoded_password_string.html\n   Location: swift/common/middleware/proxy_logging.py:286:12\n284\t            \u0027protocol\u0027: \u0027\u0027,\n285\t            \u0027status_int\u0027: \u00270\u0027,\n286\t            \u0027auth_token\u0027: \u00271234...\u0027,\n287\t            \u0027bytes_recvd\u0027: \u00271\u0027,\n288\t            \u0027bytes_sent\u0027: \u00270\u0027,\n289\t            \u0027transaction_id\u0027: \u0027tx1234\u0027,\n290\t            \u0027request_time\u0027: \u00270.05\u0027,\n291\t            \u0027source\u0027: \u0027\u0027,\n292\t            \u0027log_info\u0027: \u0027\u0027,\n293\t            \u0027policy_index\u0027: \u0027\u0027,\n294\t            \u0027ttfb\u0027: \u00270.05\u0027,\n295\t            \u0027pid\u0027: \u002742\u0027,\n296\t            \u0027wire_status_int\u0027: \u0027200\u0027,\n297\t            \u0027access_user_id\u0027: StrAnonymizer(\u0027AKIAIOSFODNN7EXAMPLE\u0027,\n298\t                                            self.anonymization_method,\n299\t                                            self.anonymization_salt),\n300\t        }\n```\n\nI have not been able to reproduce OMM.","commit_id":"0f3e11176ae4264ab4a9b3134d2599c7ef92dcd6"}],"swift/common/middleware/proxy_logging.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"68a6bd009438be3c352046aa2e920d05043827c0","unresolved":true,"context_lines":[{"line_number":172,"context_line":"            policy_index is not None and \\"},{"line_number":173,"context_line":"            POLICIES.get_by_index(policy_index) is not None:"},{"line_number":174,"context_line":"        labels[\u0027policy\u0027] \u003d policy_index"},{"line_number":175,"context_line":"    is_origin_s3 \u003d req.environ.get(\u0027swift.is_origin_s3\u0027, False)"},{"line_number":176,"context_line":"    if is_origin_s3:"},{"line_number":177,"context_line":"            labels[\u0027client\u0027] \u003d \u0027S3\u0027"},{"line_number":178,"context_line":"    return labels"}],"source_content_type":"text/x-python","patch_set":1,"id":"729d9379_cef32a51","line":175,"range":{"start_line":175,"start_character":42,"end_line":175,"end_character":54},"updated":"2025-01-15 15:22:32.000000000","message":"I was wondering if \u0027origin\u0027 is the best term to use here, then see that the label is actually \u0027client\u0027 - could we make them consistent i.e. ``swift.is_s3_client`` or ``swift.client\u003ds3``?\n\nThen I got to wondering if we might just have a swift.labels dict in the req environ that can be updated with \u0027client\u0027 as well as account, container etc in order to unify this and the swift.path_parts\n\nthen in proxy_logging we could write ``labels.update(env.get(\u0027swift.labels\u0027, {})``\n\nJust a thought...","commit_id":"f12623985c89df6ff695c5fee4acbb21197f2c2f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdb2093ef5f99eda5b9a93018928b2ea188674d0","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            policy_index is not None and \\"},{"line_number":173,"context_line":"            POLICIES.get_by_index(policy_index) is not None:"},{"line_number":174,"context_line":"        labels[\u0027policy\u0027] \u003d policy_index"},{"line_number":175,"context_line":"    is_origin_s3 \u003d req.environ.get(\u0027swift.is_origin_s3\u0027, False)"},{"line_number":176,"context_line":"    if is_origin_s3:"},{"line_number":177,"context_line":"            labels[\u0027client\u0027] \u003d \u0027S3\u0027"},{"line_number":178,"context_line":"    return labels"}],"source_content_type":"text/x-python","patch_set":1,"id":"725f7a73_bcf4ef85","line":175,"range":{"start_line":175,"start_character":42,"end_line":175,"end_character":54},"in_reply_to":"729d9379_cef32a51","updated":"2025-11-03 15:23:59.000000000","message":"Good point, Al! changed to be in base_labels","commit_id":"f12623985c89df6ff695c5fee4acbb21197f2c2f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2e97bfed03c7e5d99d65729ea04dd3df911e93ad","unresolved":true,"context_lines":[{"line_number":519,"context_line":"                \u0027method\u0027: metric_method,"},{"line_number":520,"context_line":"            }"},{"line_number":521,"context_line":"            if is_s3_req(req):"},{"line_number":522,"context_line":"                base_labels[\u0027client\u0027] \u003d \u0027S3\u0027"},{"line_number":523,"context_line":"            if resource_type !\u003d \u0027UNKNOWN\u0027 or not is_s3_req(req):"},{"line_number":524,"context_line":"                base_labels[\u0027resource\u0027] \u003d resource_type"},{"line_number":525,"context_line":"            if acc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"0dc1a1f5_71695886","line":522,"updated":"2025-11-17 15:37:45.000000000","message":"is the *client* s3 or is the *api* s3?\n\nI hate to start a naming debate, but it seems weird to me be be talking about \"the client is S3\" when we get requests from a boto3 client.\n\nAlso, should we have an explicit ``else`` ? If so, that perhaps further informs the naming choice...do we have *clients* that are \"swift\" or \"s3\"?\n\nIIRC internally we make some attempt in log parsing to identify actual clients (boto, aws-sdk) from user-agent strings.","commit_id":"1a16a95a0b3c905075dbf7b1237ff21299bd9b6f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"c500d6a32422689b8785743bc7f0261573e8e7dd","unresolved":false,"context_lines":[{"line_number":519,"context_line":"                \u0027method\u0027: metric_method,"},{"line_number":520,"context_line":"            }"},{"line_number":521,"context_line":"            if is_s3_req(req):"},{"line_number":522,"context_line":"                base_labels[\u0027client\u0027] \u003d \u0027S3\u0027"},{"line_number":523,"context_line":"            if resource_type !\u003d \u0027UNKNOWN\u0027 or not is_s3_req(req):"},{"line_number":524,"context_line":"                base_labels[\u0027resource\u0027] \u003d resource_type"},{"line_number":525,"context_line":"            if acc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"17cd22d4_df2a7984","line":522,"in_reply_to":"0dc1a1f5_71695886","updated":"2025-11-19 17:23:16.000000000","message":"Acknowledged","commit_id":"1a16a95a0b3c905075dbf7b1237ff21299bd9b6f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a88b01b3f0d18fdd4b92828733182bcc85918238","unresolved":true,"context_lines":[{"line_number":527,"context_line":"            if cont:"},{"line_number":528,"context_line":"                base_labels[\u0027container\u0027] \u003d cont"},{"line_number":529,"context_line":"            # else:"},{"line_number":530,"context_line":"            #     base_labels[\u0027api\u0027] \u003d \u0027swift\u0027?"},{"line_number":531,"context_line":"            req.environ[\u0027swift.base_labels\u0027] \u003d base_labels"},{"line_number":532,"context_line":"        elif acc:"},{"line_number":533,"context_line":"            # expected in the right-most proxy_logging instance"}],"source_content_type":"text/x-python","patch_set":3,"id":"321cfa93_b1330723","line":530,"updated":"2025-11-19 17:29:14.000000000","message":"let\u0027s do this!","commit_id":"ae0a8bc24fb35ac2b17eea9ae027b43b8da15b00"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"e2847c6f8ca4024291fffa78352c4804f894a6f2","unresolved":false,"context_lines":[{"line_number":527,"context_line":"            if cont:"},{"line_number":528,"context_line":"                base_labels[\u0027container\u0027] \u003d cont"},{"line_number":529,"context_line":"            # else:"},{"line_number":530,"context_line":"            #     base_labels[\u0027api\u0027] \u003d \u0027swift\u0027?"},{"line_number":531,"context_line":"            req.environ[\u0027swift.base_labels\u0027] \u003d base_labels"},{"line_number":532,"context_line":"        elif acc:"},{"line_number":533,"context_line":"            # expected in the right-most proxy_logging instance"}],"source_content_type":"text/x-python","patch_set":3,"id":"c66d1a55_024b4205","line":530,"in_reply_to":"321cfa93_b1330723","updated":"2025-11-20 20:50:42.000000000","message":"Done","commit_id":"ae0a8bc24fb35ac2b17eea9ae027b43b8da15b00"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"96bd26a4d198a1b8992a1664d5d34d48e5ed6e23","unresolved":true,"context_lines":[{"line_number":502,"context_line":"        resource_type \u003d self.get_resource_type(req)"},{"line_number":503,"context_line":"        return \u0027.\u0027.join((resource_type, metric_method, str(status_int)))"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def update_swift_base_labels(self, req):"},{"line_number":506,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(req.path)"},{"line_number":507,"context_line":"        base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)"},{"line_number":508,"context_line":"        if base_labels is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"6cc28dfe_d0a9ef3a","line":505,"updated":"2025-11-21 13:16:09.000000000","message":"unfortunately we don\u0027t yet use base_labels for all labeled metrics coming out of proxy-logging 😞","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2d749309212995855970187ed1cd21da9d5fad53","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        resource_type \u003d self.get_resource_type(req)"},{"line_number":503,"context_line":"        return \u0027.\u0027.join((resource_type, metric_method, str(status_int)))"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def update_swift_base_labels(self, req):"},{"line_number":506,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(req.path)"},{"line_number":507,"context_line":"        base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)"},{"line_number":508,"context_line":"        if base_labels is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"2e037c57_0151d0b4","line":505,"in_reply_to":"6cc28dfe_d0a9ef3a","updated":"2025-11-24 17:25:57.000000000","message":"also added labels in statsd_metric_labels","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"96bd26a4d198a1b8992a1664d5d34d48e5ed6e23","unresolved":true,"context_lines":[{"line_number":521,"context_line":"            if is_s3_req(req):"},{"line_number":522,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027S3\u0027"},{"line_number":523,"context_line":"            else:"},{"line_number":524,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027swift\u0027"},{"line_number":525,"context_line":"            if resource_type !\u003d \u0027UNKNOWN\u0027 or not is_s3_req(req):"},{"line_number":526,"context_line":"                base_labels[\u0027resource\u0027] \u003d resource_type"},{"line_number":527,"context_line":"            if acc:"}],"source_content_type":"text/x-python","patch_set":4,"id":"16161bd7_1be42712","line":524,"updated":"2025-11-21 13:16:09.000000000","message":"this is absolutely fine, don\u0027t change it.\n\njust a passing comment though: I sometimes find the one liner if/else form useful for compact statements:\n\n```\nbase_labels[\u0027api\u0027] \u003d \u0027S3\u0027 is is_s3_req(req) else \u0027swift\u0027\n```\n\nbut once it spills to another line I usually revert to the  ``if: ... else:...`` form","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2d749309212995855970187ed1cd21da9d5fad53","unresolved":false,"context_lines":[{"line_number":521,"context_line":"            if is_s3_req(req):"},{"line_number":522,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027S3\u0027"},{"line_number":523,"context_line":"            else:"},{"line_number":524,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027swift\u0027"},{"line_number":525,"context_line":"            if resource_type !\u003d \u0027UNKNOWN\u0027 or not is_s3_req(req):"},{"line_number":526,"context_line":"                base_labels[\u0027resource\u0027] \u003d resource_type"},{"line_number":527,"context_line":"            if acc:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7927a0d2_6d1f30b7","line":524,"in_reply_to":"16161bd7_1be42712","updated":"2025-11-24 17:25:57.000000000","message":"totally agree, much better to write if..else this way for one liners!","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4d2ed402d1a5c48422e73b015c5f314d4fc9f270","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            base_labels \u003d {"},{"line_number":519,"context_line":"                \u0027method\u0027: metric_method,"},{"line_number":520,"context_line":"            }"},{"line_number":521,"context_line":"            base_labels[\u0027api\u0027] \u003d \u0027S3\u0027 if is_s3_req(req) else \u0027swift\u0027"},{"line_number":522,"context_line":"            if resource_type !\u003d \u0027UNKNOWN\u0027 or not is_s3_req(req):"},{"line_number":523,"context_line":"                base_labels[\u0027resource\u0027] \u003d resource_type"},{"line_number":524,"context_line":"            if acc:"}],"source_content_type":"text/x-python","patch_set":7,"id":"72ccb63d_9ad14aaa","line":521,"updated":"2026-01-12 06:09:38.000000000","message":"OK, when an s3 request\u0027s get_response is called, ie works down the pipeline, the s3 request is converted into a swift request, what happens here?\n \nOK, so the s3 request will hit the first proxy_logging and yeah get an api\u003d\u003dS3. But any subrequests wont include the query string or Authorization header so will be labeled swift. Oh the swift.base_labels will be saved. And therefore will all subrequests also get the API \u003d\u003d s3. \n\nI guess I should go and test this out.\n[update]\nTested this patch, building an MPU and all requests are coming back as API s3, all thanks to the swift.base_labels and the power of ChainMap\u0027s! \n\nIf I hack the code so it has to recheck the API (loosing swift.base_labels) then they\u0027re swift apis (because of the conversion to swift requests). So patch seems to be working well!","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":555,"context_line":"        # changed w.r.t. base labels while the request was being handled (in"},{"line_number":556,"context_line":"        # particular, container may be different in swift.backend_path)"},{"line_number":557,"context_line":"        # TODO: remove unnecessary duplication in the overlay e.g. method,"},{"line_number":558,"context_line":"        # account"},{"line_number":559,"context_line":"        resource_type \u003d self.get_resource_type(req)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        labels \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff8350c7_16043b2a","line":558,"updated":"2026-01-09 15:22:24.000000000","message":"I think it would be worth tackling this TODO\n\nIn fact, is there any reason why statsd_metric_labels needs to be different from statsd_metric_resp_labels?\n\nThe only reason I can think of is what is hinted at in the comment above: I have a lingering memory that sometime (mpu part upload??) the container in swift.backend_path (``bucket+segments``) is different from the container in req.path (``bucket``). But I do wonder if that is a mis-feature/bug. And every other label ought to be the same as resp_xfer_labels.\n\nSo perhaps we could just move the creation of resp_xfer_labels up to line  607 and use that for *all* metric labels, and abandon statsd_metric_labels?\n\n(Or if we really care about the container changing, overlay only that onto resp_xfer_labels for the legacy metrics.)","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        # changed w.r.t. base labels while the request was being handled (in"},{"line_number":556,"context_line":"        # particular, container may be different in swift.backend_path)"},{"line_number":557,"context_line":"        # TODO: remove unnecessary duplication in the overlay e.g. method,"},{"line_number":558,"context_line":"        # account"},{"line_number":559,"context_line":"        resource_type \u003d self.get_resource_type(req)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        labels \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"89aa1278_c527e2ac","line":558,"in_reply_to":"ff8350c7_16043b2a","updated":"2026-01-19 13:13:23.000000000","message":"I wrote up some launchpad bugs for the inconsistent treatment of container labels:\nhttps://bugs.launchpad.net/swift/+bug/2138371\nhttps://bugs.launchpad.net/swift/+bug/2138370\n\nI do think the inconsistency is a bug, but it is not caused by this patch...it just becomes apparent because of the (probably) unnecessary overlay of one set of labels onto another. So on balance I\u0027m ok with it being fixed separately.","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"7c7ee54064af8e3303a4941ddff5807ddba60daa","unresolved":true,"context_lines":[{"line_number":515,"context_line":"            metric_method \u003d self.statsd_metric_method(method)"},{"line_number":516,"context_line":"            resource_type \u003d self.get_resource_type_from_aco("},{"line_number":517,"context_line":"                req, acc, cont, obj)"},{"line_number":518,"context_line":"            base_labels \u003d {"},{"line_number":519,"context_line":"                \u0027method\u0027: metric_method,"},{"line_number":520,"context_line":"            }"},{"line_number":521,"context_line":"            base_labels[\u0027api\u0027] \u003d \u0027S3\u0027 if is_s3_req(req) else \u0027swift\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1b8c9afa_0c6f0b2d","line":518,"updated":"2026-01-17 02:14:04.000000000","message":"Wanna simplify the assignment of `base_labels` as:\n```\n            base_labels \u003d {\u0027method\u0027: metric_method,\n                           \u0027api\u0027: \u0027S3\u0027 if is_s3_req(req) else \u0027swift\u0027}\n```","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"7c7ee54064af8e3303a4941ddff5807ddba60daa","unresolved":true,"context_lines":[{"line_number":553,"context_line":"                             cont\u003dNone, policy_index\u003dNone):"},{"line_number":554,"context_line":"        # overlay freshly derived labels onto base_labels just in case any"},{"line_number":555,"context_line":"        # changed w.r.t. base labels while the request was being handled (in"},{"line_number":556,"context_line":"        # particular, container may be different in swift.backend_path)"},{"line_number":557,"context_line":"        # TODO: remove unnecessary duplication in the overlay e.g. method,"},{"line_number":558,"context_line":"        # account"},{"line_number":559,"context_line":"        resource_type \u003d self.get_resource_type(req)"}],"source_content_type":"text/x-python","patch_set":10,"id":"04a9a284_0afaa12e","line":556,"updated":"2026-01-17 02:14:04.000000000","message":"We are trying to address this as a subset of this issue here as well, ref: https://review.opendev.org/c/openstack/swift/+/966917","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"7c7ee54064af8e3303a4941ddff5807ddba60daa","unresolved":true,"context_lines":[{"line_number":571,"context_line":"                policy_index is not None and \\"},{"line_number":572,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"},{"line_number":573,"context_line":"            labels[\u0027policy\u0027] \u003d policy_index"},{"line_number":574,"context_line":"        return ChainMap(labels, req.environ[\u0027swift.base_labels\u0027])"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"    def __call__(self, env, start_response):"},{"line_number":577,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":10,"id":"b3a61b13_ebe4764f","line":574,"updated":"2026-01-17 02:14:04.000000000","message":"Nice `ChainMap` usage someone attended their ADS class!\n\nThis return statement always assumes that `req.environ[\u0027swift.base_labels\u0027])` always exists; i can see that we are calling `update_swift_base_labels` always earlier before we arrive at this return statement but its worth verifying","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"19da05547b94b69679c0de253126c1bb96df8532","unresolved":false,"context_lines":[{"line_number":571,"context_line":"                policy_index is not None and \\"},{"line_number":572,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"},{"line_number":573,"context_line":"            labels[\u0027policy\u0027] \u003d policy_index"},{"line_number":574,"context_line":"        return ChainMap(labels, req.environ[\u0027swift.base_labels\u0027])"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"    def __call__(self, env, start_response):"},{"line_number":577,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":10,"id":"d1fab0e1_3922b697","line":574,"in_reply_to":"3f0cf967_94809a0e","updated":"2026-01-20 20:11:01.000000000","message":"Acknowledged","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[{"line_number":571,"context_line":"                policy_index is not None and \\"},{"line_number":572,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"},{"line_number":573,"context_line":"            labels[\u0027policy\u0027] \u003d policy_index"},{"line_number":574,"context_line":"        return ChainMap(labels, req.environ[\u0027swift.base_labels\u0027])"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"    def __call__(self, env, start_response):"},{"line_number":577,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f0cf967_94809a0e","line":574,"in_reply_to":"b3a61b13_ebe4764f","updated":"2026-01-19 13:13:23.000000000","message":"It\u0027s often good to be defensive when accessing a dict, but in this case I think it would be a bug for base_labels to have been removed from the request environ, so a KeyError might be appropriate.","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"95a294670d3745fa28f35a72e8d80057c9c32832","unresolved":true,"context_lines":[{"line_number":283,"context_line":"            \u0027method\u0027: \u0027GET\u0027,"},{"line_number":284,"context_line":"            \u0027protocol\u0027: \u0027\u0027,"},{"line_number":285,"context_line":"            \u0027status_int\u0027: \u00270\u0027,"},{"line_number":286,"context_line":"            \u0027auth_token\u0027: \u00271234...\u0027,  # nosec B105"},{"line_number":287,"context_line":"            \u0027bytes_recvd\u0027: \u00271\u0027,"},{"line_number":288,"context_line":"            \u0027bytes_sent\u0027: \u00270\u0027,"},{"line_number":289,"context_line":"            \u0027transaction_id\u0027: \u0027tx1234\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"6089c730_e2937606","line":286,"updated":"2026-01-19 18:47:27.000000000","message":"let\u0027s see if this comment helps","commit_id":"64bde7e05c258322864703b55042455d4d3c48ad"}],"swift/common/wsgi.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"68a6bd009438be3c352046aa2e920d05043827c0","unresolved":true,"context_lines":[{"line_number":1202,"context_line":"                 \u0027swift.trans_id\u0027, \u0027swift.authorize_override\u0027,"},{"line_number":1203,"context_line":"                 \u0027swift.authorize\u0027, \u0027HTTP_X_USER_ID\u0027, \u0027HTTP_X_PROJECT_ID\u0027,"},{"line_number":1204,"context_line":"                 \u0027HTTP_REFERER\u0027, \u0027swift.infocache\u0027,"},{"line_number":1205,"context_line":"                 \u0027swift.swift_request_paths\u0027, \u0027swift.is_origin_s3\u0027,"},{"line_number":1206,"context_line":"                 \u0027swift.shard_listing_history\u0027):"},{"line_number":1207,"context_line":"        if name in env:"},{"line_number":1208,"context_line":"            newenv[name] \u003d env[name]"}],"source_content_type":"text/x-python","patch_set":1,"id":"93c884ec_78b3a801","line":1205,"range":{"start_line":1205,"start_character":47,"end_line":1205,"end_character":66},"updated":"2025-01-15 15:22:32.000000000","message":"do we need subrequests to have this flag? do we want to label all subrequests ?","commit_id":"f12623985c89df6ff695c5fee4acbb21197f2c2f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdb2093ef5f99eda5b9a93018928b2ea188674d0","unresolved":false,"context_lines":[{"line_number":1202,"context_line":"                 \u0027swift.trans_id\u0027, \u0027swift.authorize_override\u0027,"},{"line_number":1203,"context_line":"                 \u0027swift.authorize\u0027, \u0027HTTP_X_USER_ID\u0027, \u0027HTTP_X_PROJECT_ID\u0027,"},{"line_number":1204,"context_line":"                 \u0027HTTP_REFERER\u0027, \u0027swift.infocache\u0027,"},{"line_number":1205,"context_line":"                 \u0027swift.swift_request_paths\u0027, \u0027swift.is_origin_s3\u0027,"},{"line_number":1206,"context_line":"                 \u0027swift.shard_listing_history\u0027):"},{"line_number":1207,"context_line":"        if name in env:"},{"line_number":1208,"context_line":"            newenv[name] \u003d env[name]"}],"source_content_type":"text/x-python","patch_set":1,"id":"28870a2d_c05b1e9d","line":1205,"range":{"start_line":1205,"start_character":47,"end_line":1205,"end_character":66},"in_reply_to":"93c884ec_78b3a801","updated":"2025-11-03 15:23:59.000000000","message":"think should be all subrequests","commit_id":"f12623985c89df6ff695c5fee4acbb21197f2c2f"}],"test/unit/common/middleware/test_proxy_logging.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"96bd26a4d198a1b8992a1664d5d34d48e5ed6e23","unresolved":true,"context_lines":[{"line_number":2150,"context_line":"            (\u0027swift_proxy_server_response_body_streaming_bytes\u0027, 22, {"},{"line_number":2151,"context_line":"                \u0027account\u0027: \u0027a\u0027,"},{"line_number":2152,"context_line":"                \u0027api\u0027: \u0027swift\u0027,"},{"line_number":2153,"context_line":"                \u0027api\u0027: \u0027swift\u0027,"},{"line_number":2154,"context_line":"                \u0027container\u0027: \u0027c\u0027,"},{"line_number":2155,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"},{"line_number":2156,"context_line":"                \u0027policy\u0027: \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"d7bf9a4e_58ad6274","line":2153,"updated":"2025-11-21 13:16:09.000000000","message":"oops!","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2d749309212995855970187ed1cd21da9d5fad53","unresolved":false,"context_lines":[{"line_number":2150,"context_line":"            (\u0027swift_proxy_server_response_body_streaming_bytes\u0027, 22, {"},{"line_number":2151,"context_line":"                \u0027account\u0027: \u0027a\u0027,"},{"line_number":2152,"context_line":"                \u0027api\u0027: \u0027swift\u0027,"},{"line_number":2153,"context_line":"                \u0027api\u0027: \u0027swift\u0027,"},{"line_number":2154,"context_line":"                \u0027container\u0027: \u0027c\u0027,"},{"line_number":2155,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"},{"line_number":2156,"context_line":"                \u0027policy\u0027: \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"50de6e6a_6e10f27c","line":2153,"in_reply_to":"d7bf9a4e_58ad6274","updated":"2025-11-24 17:25:57.000000000","message":"oops","commit_id":"398a19d33ae09cb8abb0145a00f3a797080b1e98"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6f597e9b974dd5cb90fedbc29509d07edc0fe3c5","unresolved":true,"context_lines":[{"line_number":2372,"context_line":"                \u0027wsgi.input\u0027: BytesIO(buffer_str),"},{"line_number":2373,"context_line":"            },"},{"line_number":2374,"context_line":"            headers\u003d{"},{"line_number":2375,"context_line":"                \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":2376,"context_line":"                \u0027Date\u0027: date_header,"},{"line_number":2377,"context_line":"            },"},{"line_number":2378,"context_line":"        )"},{"line_number":2379,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"2b5330b4_4eacb023","line":2376,"range":{"start_line":2375,"start_character":16,"end_line":2376,"end_character":36},"updated":"2025-12-22 14:55:03.000000000","message":"We should update at least some of these tests to use aws v4 style authorization headers. That would have revealed the fact that the header was being truncated in a way that defeated the ``is_s3_req`` check.\n\nyou can find example is the s3api unit tests, for example test_bucket.py","commit_id":"c5bfee1573707d83d7e3401f68aacc81cdd427fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":2372,"context_line":"                \u0027wsgi.input\u0027: BytesIO(buffer_str),"},{"line_number":2373,"context_line":"            },"},{"line_number":2374,"context_line":"            headers\u003d{"},{"line_number":2375,"context_line":"                \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":2376,"context_line":"                \u0027Date\u0027: date_header,"},{"line_number":2377,"context_line":"            },"},{"line_number":2378,"context_line":"        )"},{"line_number":2379,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"79859cea_19e3c7bf","line":2376,"range":{"start_line":2375,"start_character":16,"end_line":2376,"end_character":36},"in_reply_to":"2646e228_32546e98","updated":"2026-01-09 15:22:24.000000000","message":"these tests actually call self.assertLabeledUpdateStats(stats) and therefore check the emitted labels\n\nThe test you have changed to sig_v3 only checks base_labels, but does not assert the emitted stats, so does not check that emitted stats are based on base_labels.\n\nIf I revert the changes to the middleware w.r.t. patchset 5 the tests all pass.","commit_id":"c5bfee1573707d83d7e3401f68aacc81cdd427fe"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"c831186981d1063261b7510e9a35a1cefc1b59a4","unresolved":false,"context_lines":[{"line_number":2372,"context_line":"                \u0027wsgi.input\u0027: BytesIO(buffer_str),"},{"line_number":2373,"context_line":"            },"},{"line_number":2374,"context_line":"            headers\u003d{"},{"line_number":2375,"context_line":"                \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":2376,"context_line":"                \u0027Date\u0027: date_header,"},{"line_number":2377,"context_line":"            },"},{"line_number":2378,"context_line":"        )"},{"line_number":2379,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"2646e228_32546e98","line":2376,"range":{"start_line":2375,"start_character":16,"end_line":2376,"end_character":36},"in_reply_to":"2b5330b4_4eacb023","updated":"2026-01-06 17:39:50.000000000","message":"Done","commit_id":"c5bfee1573707d83d7e3401f68aacc81cdd427fe"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"fff62157ad06e84b6db0fbfca46bffb237845c5c","unresolved":false,"context_lines":[{"line_number":2372,"context_line":"                \u0027wsgi.input\u0027: BytesIO(buffer_str),"},{"line_number":2373,"context_line":"            },"},{"line_number":2374,"context_line":"            headers\u003d{"},{"line_number":2375,"context_line":"                \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":2376,"context_line":"                \u0027Date\u0027: date_header,"},{"line_number":2377,"context_line":"            },"},{"line_number":2378,"context_line":"        )"},{"line_number":2379,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dcd98a5c_97cda89e","line":2376,"range":{"start_line":2375,"start_character":16,"end_line":2376,"end_character":36},"in_reply_to":"79859cea_19e3c7bf","updated":"2026-01-14 23:00:47.000000000","message":"Checked and asserted labeled stats!","commit_id":"c5bfee1573707d83d7e3401f68aacc81cdd427fe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":836,"context_line":"                req \u003d Request.blank(path, environ\u003d{"},{"line_number":837,"context_line":"                    \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":838,"context_line":"                    \u0027wsgi.input\u0027: BytesIO(b\u00274321\u0027)})"},{"line_number":839,"context_line":"                app.update_swift_base_labels(req)"},{"line_number":840,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"                self.assertEqual(b\u00277654321\u0027, b\u0027\u0027.join(iter_response))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a78db75_d373ec34","line":839,"updated":"2026-01-09 15:22:24.000000000","message":"this looks wrong.\n\nThe test is calling the proxy_logging middleware on the next line, just like a request would be handled in the real world. \n\nBut in the real world there is no call to update_swift_base_labels first. So why does the test need it?\n\nhere and in most other places, but not all, see comment line 1117","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"fff62157ad06e84b6db0fbfca46bffb237845c5c","unresolved":false,"context_lines":[{"line_number":836,"context_line":"                req \u003d Request.blank(path, environ\u003d{"},{"line_number":837,"context_line":"                    \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":838,"context_line":"                    \u0027wsgi.input\u0027: BytesIO(b\u00274321\u0027)})"},{"line_number":839,"context_line":"                app.update_swift_base_labels(req)"},{"line_number":840,"context_line":"                iter_response \u003d app(req.environ, lambda *_: None)"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"                self.assertEqual(b\u00277654321\u0027, b\u0027\u0027.join(iter_response))"}],"source_content_type":"text/x-python","patch_set":7,"id":"aa9d8e83_dfcef39c","line":839,"in_reply_to":"7a78db75_d373ec34","updated":"2026-01-14 23:00:47.000000000","message":"Acknowledged","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":1114,"context_line":"                app.statsd \u003d self.statsd"},{"line_number":1115,"context_line":"                req \u003d Request.blank(\u0027/v1/a/c\u0027,"},{"line_number":1116,"context_line":"                                    environ\u003d{\u0027REQUEST_METHOD\u0027: method})"},{"line_number":1117,"context_line":"                app.update_swift_base_labels(req)"},{"line_number":1118,"context_line":"                now \u003d 10000.0"},{"line_number":1119,"context_line":"                app.log_request(req, 911, 4, 43, now, now + 1.01)"},{"line_number":1120,"context_line":"                self.assertTiming(\u0027container.%s.911.timing\u0027 % exp_method, app,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5e004b8c_640d1637","line":1117,"updated":"2026-01-09 15:22:24.000000000","message":"in this test this DOES make sense because the test is calling log_request directly, same at line 1375, but not elsewhere","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"fff62157ad06e84b6db0fbfca46bffb237845c5c","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"                app.statsd \u003d self.statsd"},{"line_number":1115,"context_line":"                req \u003d Request.blank(\u0027/v1/a/c\u0027,"},{"line_number":1116,"context_line":"                                    environ\u003d{\u0027REQUEST_METHOD\u0027: method})"},{"line_number":1117,"context_line":"                app.update_swift_base_labels(req)"},{"line_number":1118,"context_line":"                now \u003d 10000.0"},{"line_number":1119,"context_line":"                app.log_request(req, 911, 4, 43, now, now + 1.01)"},{"line_number":1120,"context_line":"                self.assertTiming(\u0027container.%s.911.timing\u0027 % exp_method, app,"}],"source_content_type":"text/x-python","patch_set":7,"id":"d3858e14_a4fe3ba2","line":1117,"in_reply_to":"5e004b8c_640d1637","updated":"2026-01-14 23:00:47.000000000","message":"Acknowledged","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":2358,"context_line":"            \u0027statsd_label_mode\u0027: \u0027dogstatsd\u0027,"},{"line_number":2359,"context_line":"            \u0027statsd_emit_buffer_xfer_bytes_seconds\u0027: 0,"},{"line_number":2360,"context_line":"            \u0027storage_domain\u0027: storage_domain,"},{"line_number":2361,"context_line":"            \u0027reveal_sensitive_prefix\u0027: 1,"},{"line_number":2362,"context_line":"        }"},{"line_number":2363,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":2364,"context_line":"            app, proxy_logging_conf, logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":7,"id":"cd9fc793_a5d9e926","line":2361,"updated":"2026-01-09 15:22:24.000000000","message":"this was a hack to force sig_v2 style request headers to be truncated such that is_s3_req actually returned False. Once we have sig_v4 request coverage we should revert this change and stick with the default.","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"fff62157ad06e84b6db0fbfca46bffb237845c5c","unresolved":false,"context_lines":[{"line_number":2358,"context_line":"            \u0027statsd_label_mode\u0027: \u0027dogstatsd\u0027,"},{"line_number":2359,"context_line":"            \u0027statsd_emit_buffer_xfer_bytes_seconds\u0027: 0,"},{"line_number":2360,"context_line":"            \u0027storage_domain\u0027: storage_domain,"},{"line_number":2361,"context_line":"            \u0027reveal_sensitive_prefix\u0027: 1,"},{"line_number":2362,"context_line":"        }"},{"line_number":2363,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":2364,"context_line":"            app, proxy_logging_conf, logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":7,"id":"98ac4f21_49580355","line":2361,"in_reply_to":"cd9fc793_a5d9e926","updated":"2026-01-14 23:00:47.000000000","message":"Done","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":2650,"context_line":"            \u0027/bucket/object\u0027,"},{"line_number":2651,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":2652,"context_line":"            headers\u003d{"},{"line_number":2653,"context_line":"                \u0027Authorization\u0027: \u0027AWS4-HMAC-SHA256 \u0027 + \u0027, \u0027.join(["},{"line_number":2654,"context_line":"                    \u0027Credential\u003dtest:tester/%s/us-east-1/s3/aws4_request\u0027 %"},{"line_number":2655,"context_line":"                    self.get_v4_amz_date_header().split(\u0027T\u0027, 1)[0],"},{"line_number":2656,"context_line":"                    \u0027SignedHeaders\u003dhost\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1dd97ffa_6a45e585","line":2653,"updated":"2026-01-09 15:22:24.000000000","message":"ok, this is what we need :)","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"fff62157ad06e84b6db0fbfca46bffb237845c5c","unresolved":false,"context_lines":[{"line_number":2650,"context_line":"            \u0027/bucket/object\u0027,"},{"line_number":2651,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":2652,"context_line":"            headers\u003d{"},{"line_number":2653,"context_line":"                \u0027Authorization\u0027: \u0027AWS4-HMAC-SHA256 \u0027 + \u0027, \u0027.join(["},{"line_number":2654,"context_line":"                    \u0027Credential\u003dtest:tester/%s/us-east-1/s3/aws4_request\u0027 %"},{"line_number":2655,"context_line":"                    self.get_v4_amz_date_header().split(\u0027T\u0027, 1)[0],"},{"line_number":2656,"context_line":"                    \u0027SignedHeaders\u003dhost\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"e4ca943f_3f5311be","line":2653,"in_reply_to":"1dd97ffa_6a45e585","updated":"2026-01-14 23:00:47.000000000","message":"Done","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":2672,"context_line":"            \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":2673,"context_line":"            \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":2674,"context_line":"            \u0027api\u0027: \u0027S3\u0027"},{"line_number":2675,"context_line":"        })"},{"line_number":2676,"context_line":""},{"line_number":2677,"context_line":"        # PUT request"},{"line_number":2678,"context_line":"        buffer_str \u003d (b\u0027some stuff\\n\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"95a9e213_aef39ec3","line":2675,"updated":"2026-01-09 15:22:24.000000000","message":"ok, so base_labels is correct. But the change w.r.t. patchset 5 is to *use* base_labels when constructing the *emitted* labels, and this test does not assert the emitted labels.\n\nSo we need a similar sig_v4 test for test_xfer_stats_get_s3api","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"fff62157ad06e84b6db0fbfca46bffb237845c5c","unresolved":false,"context_lines":[{"line_number":2672,"context_line":"            \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":2673,"context_line":"            \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":2674,"context_line":"            \u0027api\u0027: \u0027S3\u0027"},{"line_number":2675,"context_line":"        })"},{"line_number":2676,"context_line":""},{"line_number":2677,"context_line":"        # PUT request"},{"line_number":2678,"context_line":"        buffer_str \u003d (b\u0027some stuff\\n\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"7fa33a3e_98544dc6","line":2675,"in_reply_to":"95a9e213_aef39ec3","updated":"2026-01-14 23:00:47.000000000","message":"Done","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0b6eaee5d47661e7e11a4fe41515c5c0ce76737b","unresolved":true,"context_lines":[{"line_number":2674,"context_line":"            \u0027api\u0027: \u0027S3\u0027"},{"line_number":2675,"context_line":"        })"},{"line_number":2676,"context_line":""},{"line_number":2677,"context_line":"        # PUT request"},{"line_number":2678,"context_line":"        buffer_str \u003d (b\u0027some stuff\\n\u0027"},{"line_number":2679,"context_line":"                      b\u0027some other stuff\\n\u0027"},{"line_number":2680,"context_line":"                      b\u0027some additional stuff\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"030f83c8_d224cb5f","line":2677,"updated":"2026-01-09 15:22:24.000000000","message":"I think this could/should be separate test case. Then if tests fail it\u0027s immediately obvious: PUT scenario fails, GET scenario fails, or both PUT and GET scenarios are failing.","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"fff62157ad06e84b6db0fbfca46bffb237845c5c","unresolved":false,"context_lines":[{"line_number":2674,"context_line":"            \u0027api\u0027: \u0027S3\u0027"},{"line_number":2675,"context_line":"        })"},{"line_number":2676,"context_line":""},{"line_number":2677,"context_line":"        # PUT request"},{"line_number":2678,"context_line":"        buffer_str \u003d (b\u0027some stuff\\n\u0027"},{"line_number":2679,"context_line":"                      b\u0027some other stuff\\n\u0027"},{"line_number":2680,"context_line":"                      b\u0027some additional stuff\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7ce1d4ed_ec90d2c9","line":2677,"in_reply_to":"030f83c8_d224cb5f","updated":"2026-01-14 23:00:47.000000000","message":"Done","commit_id":"514328e2a7f4484b45129e37b121aa171f0ccb03"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[{"line_number":15,"context_line":"import itertools"},{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"from datetime import datetime"},{"line_number":18,"context_line":"from datetime import timezone"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from unittest import mock"},{"line_number":21,"context_line":"import email"}],"source_content_type":"text/x-python","patch_set":10,"id":"b2903d18_68d0c44b","line":18,"updated":"2026-01-19 13:13:23.000000000","message":"nit: we can write \n```\nfrom datetime import datetime, timezone\n```","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"95a294670d3745fa28f35a72e8d80057c9c32832","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import itertools"},{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"from datetime import datetime"},{"line_number":18,"context_line":"from datetime import timezone"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from unittest import mock"},{"line_number":21,"context_line":"import email"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff579fb2_06fa0fe5","line":18,"in_reply_to":"b2903d18_68d0c44b","updated":"2026-01-19 18:47:27.000000000","message":"Done","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[{"line_number":743,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":744,"context_line":"            app_wrapper, {}, logger\u003dself.logger)"},{"line_number":745,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":746,"context_line":"        req \u003d Request.blank(path, environ\u003d{\u0027REQUEST_METHOD\u0027: method})"},{"line_number":747,"context_line":"        with mock.patch(\u0027time.time\u0027,"},{"line_number":748,"context_line":"                        side_effect\u003d[18.0, 18.5, 20.71828182846]):"},{"line_number":749,"context_line":"            resp \u003d app(req.environ, start_response)"}],"source_content_type":"text/x-python","patch_set":10,"id":"c29b5012_7b649183","line":746,"updated":"2026-01-19 13:13:23.000000000","message":"re comments below: this is NOT an s3 request 😞","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"95a294670d3745fa28f35a72e8d80057c9c32832","unresolved":false,"context_lines":[{"line_number":743,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":744,"context_line":"            app_wrapper, {}, logger\u003dself.logger)"},{"line_number":745,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":746,"context_line":"        req \u003d Request.blank(path, environ\u003d{\u0027REQUEST_METHOD\u0027: method})"},{"line_number":747,"context_line":"        with mock.patch(\u0027time.time\u0027,"},{"line_number":748,"context_line":"                        side_effect\u003d[18.0, 18.5, 20.71828182846]):"},{"line_number":749,"context_line":"            resp \u003d app(req.environ, start_response)"}],"source_content_type":"text/x-python","patch_set":10,"id":"140a49a0_24c38664","line":746,"in_reply_to":"c29b5012_7b649183","updated":"2026-01-19 18:47:27.000000000","message":"Done","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[{"line_number":767,"context_line":"        exp_labels \u003d {"},{"line_number":768,"context_line":"            \u0027method\u0027: \u0027PUT\u0027,"},{"line_number":769,"context_line":"            \u0027status\u0027: 200,"},{"line_number":770,"context_line":"            \u0027api\u0027: \u0027swift\u0027,"},{"line_number":771,"context_line":"            \u0027resource\u0027: \u0027container\u0027,"},{"line_number":772,"context_line":"            \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":773,"context_line":"            \u0027container\u0027: \u0027bucket\u0027}"}],"source_content_type":"text/x-python","patch_set":10,"id":"0d243d62_5e736955","line":770,"updated":"2026-01-19 13:13:23.000000000","message":"hmmm, the test name is\n``test_log_request_stat_type_good_PUT_s3_container`` but the api label is ``swift`` ?","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"95a294670d3745fa28f35a72e8d80057c9c32832","unresolved":false,"context_lines":[{"line_number":767,"context_line":"        exp_labels \u003d {"},{"line_number":768,"context_line":"            \u0027method\u0027: \u0027PUT\u0027,"},{"line_number":769,"context_line":"            \u0027status\u0027: 200,"},{"line_number":770,"context_line":"            \u0027api\u0027: \u0027swift\u0027,"},{"line_number":771,"context_line":"            \u0027resource\u0027: \u0027container\u0027,"},{"line_number":772,"context_line":"            \u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":773,"context_line":"            \u0027container\u0027: \u0027bucket\u0027}"}],"source_content_type":"text/x-python","patch_set":10,"id":"8423130c_feff3866","line":770,"in_reply_to":"0d243d62_5e736955","updated":"2026-01-19 18:47:27.000000000","message":"Done","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[{"line_number":799,"context_line":""},{"line_number":800,"context_line":"        exp_labels \u003d {"},{"line_number":801,"context_line":"            \u0027method\u0027: \u0027GET\u0027,"},{"line_number":802,"context_line":"            \u0027api\u0027: \u0027swift\u0027,"},{"line_number":803,"context_line":"            \u0027status\u0027: 200,"},{"line_number":804,"context_line":"            \u0027resource\u0027: \u0027object\u0027,"},{"line_number":805,"context_line":"            \u0027policy\u0027: \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"33253b25_f3758092","line":802,"updated":"2026-01-19 13:13:23.000000000","message":"ditto, s3 test -\u003e label is swift ??","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"95a294670d3745fa28f35a72e8d80057c9c32832","unresolved":false,"context_lines":[{"line_number":799,"context_line":""},{"line_number":800,"context_line":"        exp_labels \u003d {"},{"line_number":801,"context_line":"            \u0027method\u0027: \u0027GET\u0027,"},{"line_number":802,"context_line":"            \u0027api\u0027: \u0027swift\u0027,"},{"line_number":803,"context_line":"            \u0027status\u0027: 200,"},{"line_number":804,"context_line":"            \u0027resource\u0027: \u0027object\u0027,"},{"line_number":805,"context_line":"            \u0027policy\u0027: \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"f5b161f5_c55eafb0","line":802,"in_reply_to":"33253b25_f3758092","updated":"2026-01-19 18:47:27.000000000","message":"Done","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"7c7ee54064af8e3303a4941ddff5807ddba60daa","unresolved":true,"context_lines":[{"line_number":1066,"context_line":"                FakeApp(), {}, logger\u003dself.logger)"},{"line_number":1067,"context_line":"            app.statsd \u003d self.statsd"},{"line_number":1068,"context_line":"            req \u003d Request.blank(\u0027/v1/a/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: method})"},{"line_number":1069,"context_line":"            app.update_swift_base_labels(req)"},{"line_number":1070,"context_line":"            now \u003d 10000.0"},{"line_number":1071,"context_line":"            app.log_request(req, 299, 11, 3, now, now + 1.17)"},{"line_number":1072,"context_line":"            self.assertTiming(\u0027account.%s.299.timing\u0027 % exp_method, app,"}],"source_content_type":"text/x-python","patch_set":10,"id":"28164202_79f62c39","line":1069,"updated":"2026-01-17 02:14:04.000000000","message":"This is worth mentioning in the commit that we didn\u0027t have coverage for `update_swift_base_labels` this method before this patch","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[{"line_number":1827,"context_line":"            self._do_test_swift_base_labels("},{"line_number":1828,"context_line":"                mw_conf, \u0027/bucket/obj\u0027, req_hdrs, extra_environ\u003dextra_environ))"},{"line_number":1829,"context_line":""},{"line_number":1830,"context_line":"    def test_update_swift_base_labels_s3_request(self):"},{"line_number":1831,"context_line":"        mw_conf \u003d {}"},{"line_number":1832,"context_line":"        req_hdrs \u003d {"},{"line_number":1833,"context_line":"            \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9ed42b6d_70092e34","line":1830,"updated":"2026-01-19 13:13:23.000000000","message":"ideally this test would cover both v2 and v4 s3 requests","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"95a294670d3745fa28f35a72e8d80057c9c32832","unresolved":false,"context_lines":[{"line_number":1827,"context_line":"            self._do_test_swift_base_labels("},{"line_number":1828,"context_line":"                mw_conf, \u0027/bucket/obj\u0027, req_hdrs, extra_environ\u003dextra_environ))"},{"line_number":1829,"context_line":""},{"line_number":1830,"context_line":"    def test_update_swift_base_labels_s3_request(self):"},{"line_number":1831,"context_line":"        mw_conf \u003d {}"},{"line_number":1832,"context_line":"        req_hdrs \u003d {"},{"line_number":1833,"context_line":"            \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"23813f48_0f856ca5","line":1830,"in_reply_to":"9ed42b6d_70092e34","updated":"2026-01-19 18:47:27.000000000","message":"Done","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ec48342600b6d8f19cf3186c0fe2e5d7a2995c6c","unresolved":true,"context_lines":[{"line_number":2610,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":2611,"context_line":"        ])"},{"line_number":2612,"context_line":""},{"line_number":2613,"context_line":"    def get_v4_amz_date_header(self, offset\u003dNone):"},{"line_number":2614,"context_line":"        when \u003d datetime.now(timezone.utc)"},{"line_number":2615,"context_line":"        if offset is not None:"},{"line_number":2616,"context_line":"            when +\u003d offset"}],"source_content_type":"text/x-python","patch_set":10,"id":"fcf4192e_1ac84904","line":2613,"updated":"2026-01-19 13:13:23.000000000","message":"offset doesn\u0027t appear to be used","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"95a294670d3745fa28f35a72e8d80057c9c32832","unresolved":false,"context_lines":[{"line_number":2610,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":2611,"context_line":"        ])"},{"line_number":2612,"context_line":""},{"line_number":2613,"context_line":"    def get_v4_amz_date_header(self, offset\u003dNone):"},{"line_number":2614,"context_line":"        when \u003d datetime.now(timezone.utc)"},{"line_number":2615,"context_line":"        if offset is not None:"},{"line_number":2616,"context_line":"            when +\u003d offset"}],"source_content_type":"text/x-python","patch_set":10,"id":"6e3c3c6b_33d00d63","line":2613,"in_reply_to":"fcf4192e_1ac84904","updated":"2026-01-19 18:47:27.000000000","message":"Done","commit_id":"510200509cbb99c11a1e578543a42a11415eacbe"}]}
