snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
68
zilencer/management/commands/profile_request.py
Normal file
68
zilencer/management/commands/profile_request.py
Normal file
@@ -0,0 +1,68 @@
|
||||
import cProfile
|
||||
import logging
|
||||
import tempfile
|
||||
from typing import Any
|
||||
|
||||
from django.contrib.sessions.backends.base import SessionBase
|
||||
from django.core.management.base import CommandParser
|
||||
from django.http import HttpRequest, HttpResponseBase
|
||||
from typing_extensions import override
|
||||
|
||||
from zerver.lib.management import ZulipBaseCommand
|
||||
from zerver.lib.request import RequestNotes
|
||||
from zerver.lib.test_helpers import HostRequestMock
|
||||
from zerver.middleware import LogRequests
|
||||
from zerver.models import UserMessage
|
||||
from zerver.views.message_fetch import get_messages_backend
|
||||
|
||||
|
||||
class MockSession(SessionBase):
|
||||
def __init__(self) -> None:
|
||||
self.modified = False
|
||||
|
||||
|
||||
def profile_request(request: HttpRequest, num_before: int, num_after: int) -> HttpResponseBase:
|
||||
def get_response(request: HttpRequest) -> HttpResponseBase:
|
||||
return prof.runcall(
|
||||
get_messages_backend,
|
||||
request,
|
||||
request.user,
|
||||
num_before=num_before,
|
||||
num_after=num_after,
|
||||
apply_markdown=True,
|
||||
)
|
||||
|
||||
prof = cProfile.Profile()
|
||||
with tempfile.NamedTemporaryFile(prefix="profile.data.", delete=False) as stats_file:
|
||||
response = LogRequests(get_response)(request)
|
||||
assert isinstance(response, HttpResponseBase) # async responses not supported here for now
|
||||
prof.dump_stats(stats_file.name)
|
||||
logging.info("Profiling data written to %s", stats_file.name)
|
||||
return response
|
||||
|
||||
|
||||
class Command(ZulipBaseCommand):
|
||||
@override
|
||||
def add_arguments(self, parser: CommandParser) -> None:
|
||||
parser.add_argument("email", metavar="<email>", help="Email address of the user")
|
||||
self.add_realm_args(parser)
|
||||
|
||||
@override
|
||||
def handle(self, *args: Any, **options: Any) -> None:
|
||||
realm = self.get_realm(options)
|
||||
user = self.get_user(options["email"], realm)
|
||||
anchor = UserMessage.objects.filter(user_profile=user).order_by("-message")[200].message_id
|
||||
mock_request = HostRequestMock(
|
||||
post_data={
|
||||
"anchor": anchor,
|
||||
"num_before": 1200,
|
||||
"num_after": 200,
|
||||
},
|
||||
user_profile=user,
|
||||
meta_data={"REMOTE_ADDR": "127.0.0.1"},
|
||||
path="/",
|
||||
)
|
||||
mock_request.session = MockSession()
|
||||
RequestNotes.get_notes(mock_request).log_data = None
|
||||
|
||||
profile_request(mock_request, num_before=1200, num_after=200)
|
||||
Reference in New Issue
Block a user