Skip to content

PYTHON-5745 Consolidate command logging and monitoring logic#2822

Draft
blink1073 wants to merge 22 commits into
mongodb:masterfrom
blink1073:PYTHON-5745
Draft

PYTHON-5745 Consolidate command logging and monitoring logic#2822
blink1073 wants to merge 22 commits into
mongodb:masterfrom
blink1073:PYTHON-5745

Conversation

@blink1073
Copy link
Copy Markdown
Member

@blink1073 blink1073 commented May 27, 2026

[PYTHON-5745]

Changes in this PR

Introduces pymongo/_telemetry.py with a _CommandTelemetry context manager that unifies debug logging and APM event publishing into a single call site, eliminating duplicated telemetry blocks at each command call site. This is a prerequisite for PYTHON-5052 (OpenTelemetry support).

Based on the spike in #2720.

Test Plan

  • just typing passes
  • just lint passes
  • Full CI covers command monitoring and logging specs

Checklist

Checklist for Author

  • Did you update the changelog (if necessary)?
  • Is there test coverage?
  • Is any followup work tracked in a JIRA ticket? If so, add link(s).

Checklist for Reviewer

  • Does the title of the PR reference a JIRA Ticket?
  • Do you fully understand the implementation? (Would you be comfortable explaining how this code works to someone else?)
  • Is all relevant documentation (README or docstring) updated?

@blink1073 blink1073 changed the title PYTHON-5745 Consolidate command logging and monitoring into _CommandTelemetry PYTHON-5745 Consolidate command logging and monitoring logic May 27, 2026
@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented May 27, 2026

Codecov Report

❌ Patch coverage is 88.29268% with 24 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.19%. Comparing base (537aa0b) to head (7e94258).
⚠️ Report is 6 commits behind head on master.

Files with missing lines Patch % Lines
pymongo/asynchronous/network.py 77.08% 8 Missing and 3 partials ⚠️
pymongo/synchronous/network.py 77.08% 8 Missing and 3 partials ⚠️
pymongo/asynchronous/client_bulk.py 85.71% 1 Missing ⚠️
pymongo/synchronous/client_bulk.py 85.71% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #2822      +/-   ##
==========================================
+ Coverage   82.46%   88.19%   +5.73%     
==========================================
  Files         140      142       +2     
  Lines       24173    24193      +20     
  Branches     4128     4081      -47     
==========================================
+ Hits        19935    21338    +1403     
+ Misses       3362     1983    -1379     
+ Partials      876      872       -4     
Flag Coverage Δ
auth-aws-rhel8-test-auth-aws-rapid-web-identity-python3.14-cov 35.42% <41.95%> (+0.40%) ⬆️
auth-aws-win64-test-auth-aws-rapid-web-identity-python3.14-cov 35.44% <41.95%> (+0.42%) ⬆️
auth-enterprise-macos-test-standard-auth-latest-python3.11-auth-ssl-sharded-cluster-cov 44.15% <56.09%> (+0.39%) ⬆️
auth-enterprise-rhel8-test-standard-auth-latest-python3.11-auth-ssl-sharded-cluster-cov 44.14% <56.09%> (+0.38%) ⬆️
auth-enterprise-win64-test-standard-auth-latest-python3.11-auth-ssl-sharded-cluster-cov 44.16% <56.09%> (+0.36%) ⬆️
auth-oidc-local-ubuntu-22-test-auth-oidc-default 48.92% <68.78%> (?)
compression-snappy-rhel8-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.65% <65.85%> (+0.32%) ⬆️
compression-snappy-rhel8-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.85% <65.85%> (+0.34%) ⬆️
compression-snappy-rhel8-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.44% <63.90%> (+0.36%) ⬆️
compression-snappy-rhel8-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.31% <65.85%> (+0.32%) ⬆️
compression-zlib-rhel8-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.65% <65.85%> (+0.31%) ⬆️
compression-zlib-rhel8-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.86% <65.85%> (+0.36%) ⬆️
compression-zlib-rhel8-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.44% <63.90%> (+0.35%) ⬆️
compression-zlib-rhel8-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.29% <65.85%> (+0.30%) ⬆️
compression-zstd-rhel8-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.65% <65.85%> (+0.29%) ⬆️
compression-zstd-rhel8-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.84% <65.85%> (+0.37%) ⬆️
compression-zstd-rhel8-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.43% <63.90%> (+0.34%) ⬆️
compression-zstd-rhel8-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.29% <65.85%> (+0.28%) ⬆️
compression-zstd-ubuntu-22-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.27% <65.85%> (+0.30%) ⬆️
coverage-report-coverage-report 88.09% <88.29%> (+5.65%) ⬆️
disable-test-commands-rhel8-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.64% <65.85%> (+0.30%) ⬆️
disable-test-commands-rhel8-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.86% <65.85%> (+0.36%) ⬆️
disable-test-commands-rhel8-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.43% <63.90%> (+0.34%) ⬆️
disable-test-commands-rhel8-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.29% <65.85%> (+0.30%) ⬆️
encryption-crypt_shared-macos-test-non-standard-latest-python3.13-noauth-nossl-standalone-cov 53.41% <67.80%> (?)
encryption-crypt_shared-macos-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 55.15% <67.80%> (?)
encryption-crypt_shared-macos-test-non-standard-latest-python3.14t-noauth-ssl-replica-set-cov 54.95% <67.80%> (?)
encryption-crypt_shared-rhel8-test-non-standard-latest-python3.13-noauth-nossl-standalone-cov 53.40% <67.80%> (?)
encryption-crypt_shared-rhel8-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 55.02% <67.80%> (?)
encryption-crypt_shared-rhel8-test-non-standard-latest-python3.14t-noauth-ssl-replica-set-cov 54.93% <67.80%> (?)
encryption-crypt_shared-win64-test-non-standard-latest-python3.13-noauth-nossl-standalone-cov 53.31% <67.80%> (?)
encryption-crypt_shared-win64-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 55.13% <67.80%> (?)
encryption-crypt_shared-win64-test-non-standard-latest-python3.14t-noauth-ssl-replica-set-cov 54.95% <67.80%> (?)
encryption-macos-test-non-standard-latest-python3.13-noauth-nossl-standalone-cov 53.39% <67.80%> (?)
encryption-macos-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 55.15% <67.80%> (?)
encryption-macos-test-non-standard-latest-python3.14t-noauth-ssl-replica-set-cov 54.93% <67.80%> (?)
encryption-pyopenssl-rhel8-test-non-standard-latest-python3.13-noauth-nossl-standalone-cov 54.07% <67.80%> (?)
encryption-pyopenssl-rhel8-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 55.70% <67.80%> (?)
encryption-pyopenssl-rhel8-test-non-standard-latest-python3.14t-noauth-ssl-replica-set-cov 55.61% <67.80%> (?)
encryption-rhel8-test-non-standard-latest-python3.13-noauth-nossl-standalone-cov 53.40% <67.80%> (?)
encryption-rhel8-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 55.01% <67.80%> (?)
encryption-rhel8-test-non-standard-latest-python3.14t-noauth-ssl-replica-set-cov 54.94% <67.80%> (?)
encryption-win64-test-non-standard-latest-python3.13-noauth-nossl-standalone-cov 53.34% <67.80%> (?)
encryption-win64-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 55.14% <67.80%> (?)
encryption-win64-test-non-standard-latest-python3.14t-noauth-ssl-replica-set-cov 55.01% <67.80%> (?)
load-balancer-test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov 48.72% <66.82%> (?)
mongodb-latest-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 61.81% <63.90%> (+0.34%) ⬆️
mongodb-latest-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 59.65% <65.85%> (+0.33%) ⬆️
mongodb-latest-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 59.83% <60.00%> (+0.33%) ⬆️
mongodb-latest-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 59.93% <61.95%> (+0.32%) ⬆️
mongodb-latest-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 61.76% <65.85%> (+0.34%) ⬆️
mongodb-rapid-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 61.81% <63.90%> (+0.33%) ⬆️
mongodb-rapid-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 59.64% <65.85%> (+0.32%) ⬆️
mongodb-rapid-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 59.83% <60.00%> (+0.33%) ⬆️
mongodb-rapid-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 59.92% <61.95%> (+0.34%) ⬆️
mongodb-rapid-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 61.74% <65.85%> (+0.34%) ⬆️
mongodb-v4.2-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 57.57% <61.46%> (+0.41%) ⬆️
mongodb-v4.2-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 56.00% <63.41%> (+0.38%) ⬆️
mongodb-v4.2-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 57.43% <57.56%> (+0.37%) ⬆️
mongodb-v4.2-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 57.54% <59.51%> (+0.38%) ⬆️
mongodb-v4.2-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 57.75% <63.41%> (+0.40%) ⬆️
mongodb-v4.4-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 59.95% <61.46%> (+0.36%) ⬆️
mongodb-v4.4-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 57.95% <63.41%> (+0.35%) ⬆️
mongodb-v4.4-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 57.94% <57.56%> (+0.38%) ⬆️
mongodb-v4.4-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 58.02% <59.51%> (+0.37%) ⬆️
mongodb-v4.4-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 59.74% <63.41%> (+0.39%) ⬆️
mongodb-v5.0-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 60.14% <61.46%> (+0.40%) ⬆️
mongodb-v5.0-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 58.10% <63.41%> (+0.34%) ⬆️
mongodb-v5.0-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 58.14% <57.56%> (+0.38%) ⬆️
mongodb-v5.0-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 58.26% <59.51%> (+0.38%) ⬆️
mongodb-v5.0-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 59.95% <63.41%> (+0.36%) ⬆️
mongodb-v6.0-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 60.17% <61.46%> (+0.40%) ⬆️
mongodb-v6.0-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 58.13% <63.41%> (+0.39%) ⬆️
mongodb-v6.0-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 58.16% <57.56%> (+0.38%) ⬆️
mongodb-v6.0-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 58.31% <59.51%> (+0.38%) ⬆️
mongodb-v6.0-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 60.13% <63.41%> (+0.42%) ⬆️
mongodb-v7.0-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 60.18% <61.46%> (+0.39%) ⬆️
mongodb-v7.0-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 58.13% <63.41%> (+0.42%) ⬆️
mongodb-v7.0-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 58.21% <57.56%> (+0.38%) ⬆️
mongodb-v7.0-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 58.32% <59.51%> (+0.40%) ⬆️
mongodb-v7.0-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 60.12% <63.41%> (+0.40%) ⬆️
mongodb-v8.0-test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov 61.82% <63.90%> (+0.36%) ⬆️
mongodb-v8.0-test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov 59.68% <65.85%> (+0.33%) ⬆️
mongodb-v8.0-test-server-version-python3.10-sync-auth-ssl-sharded-cluster-min-deps-cov 59.83% <60.00%> (+0.34%) ⬆️
mongodb-v8.0-test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov 59.92% <61.95%> (+0.34%) ⬆️
mongodb-v8.0-test-server-version-python3.11-async-noauth-nossl-replica-set-cov 61.75% <65.85%> (+0.35%) ⬆️
no-c-ext-rhel8-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 60.85% <65.85%> (+0.31%) ⬆️
no-c-ext-rhel8-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 63.07% <65.85%> (+0.39%) ⬆️
no-c-ext-rhel8-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 62.64% <63.90%> (+0.35%) ⬆️
no-c-ext-rhel8-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 60.52% <65.85%> (+0.33%) ⬆️
ocsp-rhel8-test-ocsp-ecdsa-valid-cert-server-staples-latest-python3.14-cov 34.60% <33.65%> (?)
ocsp-rhel8-test-ocsp-rsa-valid-cert-server-staples-latest-python3.14-cov 34.62% <33.65%> (?)
pyopenssl-macos-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 62.06% <65.85%> (?)
pyopenssl-rhel8-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 62.06% <65.85%> (?)
pyopenssl-win64-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 62.00% <65.85%> (?)
stable-api-accept-v2-rhel8-auth-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.65% <65.85%> (+0.31%) ⬆️
stable-api-accept-v2-rhel8-auth-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.29% <65.85%> (+0.30%) ⬆️
stable-api-require-v1-rhel8-auth-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.62% <65.85%> (+0.32%) ⬆️
stable-api-require-v1-rhel8-auth-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.31% <63.90%> (+0.35%) ⬆️
stable-api-require-v1-rhel8-auth-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.28% <65.85%> (+0.30%) ⬆️
storage-inmemory-rhel8-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.65% <65.85%> (+0.32%) ⬆️
storage-inmemory-rhel8-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.29% <65.85%> (+0.28%) ⬆️
test-macos-arm64-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.62% <65.85%> (+0.32%) ⬆️
test-macos-arm64-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.86% <65.85%> (+0.40%) ⬆️
test-macos-arm64-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.43% <63.90%> (+0.34%) ⬆️
test-macos-arm64-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.27% <65.85%> (+0.30%) ⬆️
test-macos-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.65% <65.85%> (+0.31%) ⬆️
test-macos-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.83% <65.85%> (+0.36%) ⬆️
test-macos-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.43% <63.90%> (+0.35%) ⬆️
test-macos-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.28% <65.85%> (+0.30%) ⬆️
test-numpy-macos-arm64-test-numpy-python3.14-python3.14-cov 32.95% <18.53%> (+0.33%) ⬆️
test-numpy-macos-test-numpy-python3.14-python3.14-cov 32.95% <18.53%> (+0.33%) ⬆️
test-numpy-rhel8-test-numpy-python3.14-python3.14-cov 32.94% <18.53%> (+0.32%) ⬆️
test-numpy-win32-test-numpy-python3.14-python3.14-cov 32.93% <18.53%> (+0.33%) ⬆️
test-numpy-win64-test-numpy-python3.14-python3.14-cov 32.93% <18.53%> (+0.32%) ⬆️
test-win32-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.52% <65.85%> (+0.31%) ⬆️
test-win32-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.78% <65.85%> (+0.35%) ⬆️
test-win32-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.40% <63.90%> (+0.38%) ⬆️
test-win32-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.17% <65.85%> (+0.30%) ⬆️
test-win64-test-standard-latest-python3.11-async-noauth-nossl-standalone-cov 59.54% <65.85%> (+0.35%) ⬆️
test-win64-test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov 61.78% <65.85%> (+0.35%) ⬆️
test-win64-test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov 61.40% <63.90%> (+0.34%) ⬆️
test-win64-test-standard-latest-python3.14-async-noauth-nossl-standalone-cov 59.17% <65.85%> (+0.30%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

try:
result = await bwc.conn.unack_write(msg, max_doc_size) # type: ignore[func-returns-value, misc, override]
duration = datetime.datetime.now() - bwc.start_time
if result is not None:
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A note about this block and the equivalent in client_bulk.py: unack_write always returns None so there will never be a result. The spec says that we always need to emit a log, so this logic was incorrect before.

blink1073 added 16 commits May 28, 2026 12:02
…etwork.command signature

- _CommandTelemetry now accepts a conn object and reads topology_id, address,
  connection IDs, service_id, and listeners directly from it
- network.command() no longer accepts is_mongos, address, max_bson_size,
  compression_ctx, use_op_msg, or unacknowledged — all read from conn
- _CommandTelemetry lifecycle moved into AsyncConnection.write_command and
  AsyncConnection.unack_write; bulk.py and client_bulk.py simplified accordingly
- Sync files regenerated via synchro.sh; all files formatted with ruff 0.1.3
- Revert files that had only ruff formatting whitespace changes (not part of
  this PR's scope)
- Remove AsyncMongoClient._topology_id (no longer needed since _CommandTelemetry
  reads topology_id directly from the connection's pool reference)
- Update _CommandTelemetry docstring to reflect new conn-based API
…e files

Restore gridfs/grid_file_shared.py, pymongo/message.py,
change_stream.py, client_session.py, monitor.py, and all test files
to master state — these were modified by earlier branch commits that
are not part of this PR's scope.
…sses

These were lost when pymongo/message.py was reverted to master.
prepare_command extracts the field-setting logic that _CommandTelemetry
needs to see the complete command spec before publishing started events.
…sing cases

unasync raises import-not-found when absent (CI) and import-untyped when
present but untyped (local). Suppress both codes and add a mypy override
for the synchro module to allow whichever is unused in each environment.
…command logging

Restore original behavior where network.command() only emits debug log
messages when a client is present. Internal pool commands (hello/ismaster
handshake) pass client=None and should not appear in command logs.
…te contexts

These methods published command events directly; they are now superseded
by _CommandTelemetry and are no longer called anywhere.
Ruff introduced blank lines between module docstrings and
`from __future__ import annotations` in bulk.py, client_bulk.py,
network.py, and server.py. Remove them to match master's style.
Assign is_mongos, use_op_msg, max_bson_size from conn at the top of
the function so the rest of the body uses the same local names as
before, keeping the diff minimal.
Add AsyncConnection.run_operation() that owns the _CommandTelemetry
context, send/receive, unpack, and error checking for find/getMore
operations. handle_succeeded() now returns the elapsed duration so
callers don't need a separate datetime.now() call. Server.run_operation()
is simplified to delegate to the new method and handle decryption and
Response construction.
…_operation

- Replace write_command and unack_write with a single bulk_write_command
  that takes acknowledged=True keyword parameter; when False, sends
  without waiting for a reply and returns synthetic {"ok": 1}
- Rename run_operation to cursor_operation
- Update all call sites in bulk.py, client_bulk.py, and server.py
…Telemetry

bulk_write_command and cursor_operation become free functions in network.py
(alongside the existing command function), consolidating all _CommandTelemetry
usage in one module. _CURSOR_DOC_FIELDS moves there too. AsyncConnection loses
those methods and the imports they required (_CommandTelemetry, timedelta,
Callable, _GetMore, _Query, _DocumentOut).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants