From 073560e91e95dec68084445d6f6abff0faaedd4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=99=93=E9=A3=9E?= Date: Wed, 25 Sep 2024 12:52:56 +0800 Subject: [PATCH] =?UTF-8?q?Mongo=E4=BC=9A=E8=AF=9D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=98=BE=E7=A4=BA=E5=AD=97=E6=AE=B5=20(#2785?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/engines/mongo.py | 12 ++++++++++++ sql/engines/tests.py | 19 ++++++++++++++----- sql/templates/dbdiagnostic.html | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/sql/engines/mongo.py b/sql/engines/mongo.py index fe491c6057..534971fd8f 100644 --- a/sql/engines/mongo.py +++ b/sql/engines/mongo.py @@ -1253,6 +1253,18 @@ def processlist(self, command_type, **kwargs): "client" ] + # 获取此会话的用户名 + effective_users_key = "effectiveUsers_user" + effective_users = operation.get("effectiveUsers", []) + if isinstance(effective_users, list) and effective_users: + first_user = effective_users[0] + if isinstance(first_user, dict): + operation[effective_users_key] = first_user.get("user", []) + else: + operation[effective_users_key] = None + else: + operation[effective_users_key] = None + # client_s 只是处理的mongos,并不是实际客户端 # client 在sharding获取不到? if command_type in ["Full"]: diff --git a/sql/engines/tests.py b/sql/engines/tests.py index 4638708213..2cd119b761 100644 --- a/sql/engines/tests.py +++ b/sql/engines/tests.py @@ -1841,16 +1841,25 @@ def test_fill_query_columns(self): @patch("sql.engines.mongo.MongoEngine.get_connection") def test_processlist(self, mock_get_connection): - class Aggregate: + # 模拟 MongoDB aggregate 的游标行为 + class AggregateCursor: def __enter__(self): - yield {"client": "single_client"} - yield {"clientMetadata": {"mongos": {"client": "sharding_client"}}} + yield { + "client": "single_client", + "effectiveUsers": [{"user": "user_1"}], + "clientMetadata": {"mongos": {"client": "sharding_client"}}, + } + yield { + "clientMetadata": {"mongos": {}}, + "effectiveUsers": [{"user": "user_2"}], + } + yield {"effectiveUsers": []} - def __exit__(self, *arg, **kwargs): + def __exit__(self, exc_type, exc_value, traceback): pass mock_conn = Mock() - mock_conn.admin.aggregate.return_value = Aggregate() + mock_conn.admin.aggregate.return_value = AggregateCursor() mock_get_connection.return_value = mock_conn command_types = ["Full", "All", "Inner", "Active"] for command_type in command_types: diff --git a/sql/templates/dbdiagnostic.html b/sql/templates/dbdiagnostic.html index 76eb34aaf1..6f5f263495 100644 --- a/sql/templates/dbdiagnostic.html +++ b/sql/templates/dbdiagnostic.html @@ -197,11 +197,29 @@ title: 'type', field: 'type', sortable: true + }, { + title: 'active', + field: 'active', + sortable: true }, { title: 'desc', field: 'desc', sortable: true + }, { + title: 'ns', + field: 'ns', + sortable: true }, { + title: 'effectiveUsers_user', + field: 'effectiveUsers_user', + sortable: true + } + , { + title: 'secs_running', + field: 'secs_running', + sortable: true + } + , { title: 'microsecs_running', field: 'microsecs_running', sortable: true