Skip to content

Commit

Permalink
Исправить подсчет времени выполнения запросов в батче (#230)
Browse files Browse the repository at this point in the history
* Теперь можно использовать 'limit' c `get_all()`, но выдается предупреждение

* Внутри батчей учитывать время выполнения для каждого метода раздельно

* Предупреждение, если пользователь загружает все поля
  • Loading branch information
leshchenko1979 authored Mar 23, 2024
1 parent 7efa74c commit 0f0f813
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 6 deletions.
2 changes: 1 addition & 1 deletion API.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#### Параметры
* `method: str` - метод REST API для запроса к серверу.

* `params: dict` - параметры для передачи методу. Используется именно тот формат, который указан в документации к REST API Битрикс24. `get_all()` не поддерживает параметры `start`, `limit` и `order`.
* `params: dict` - параметры для передачи методу. Используется именно тот формат, который указан в документации к REST API Битрикс24. `get_all()` не поддерживает параметры `start` и `order`.

Возвращает полный список сущностей, имеющихся на сервере, согласно заданным методу и параметрам.

Expand Down
16 changes: 13 additions & 3 deletions fast_bitrix24/srh.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,7 @@ async def request_attempt(self, method, params=None) -> dict:

logger.debug("Response: %s", json)

request_run_time = json["time"]["operating"]
self.method_throttlers[method].add_request_record(request_run_time)
self.leaky_bucket_throttler.add_request_record()
self.add_throttler_records(method, params, json)

return json

Expand All @@ -175,6 +173,18 @@ async def request_attempt(self, method, params=None) -> dict:

raise

def add_throttler_records(self, method, params: dict, json: dict):
if "result_time" in json:
for cmd_name, cmd_url in params["cmd"].items():
item_method = cmd_url.split("?")[0]
item_time = json["result_time"][cmd_name]
self.method_throttlers[item_method].add_request_record(item_time)
else:
request_run_time = json["time"]["operating"]
self.method_throttlers[method].add_request_record(request_run_time)

self.leaky_bucket_throttler.add_request_record()

def success(self):
"""Увеличить счетчик удачных попыток."""

Expand Down
23 changes: 21 additions & 2 deletions fast_bitrix24/user_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ async def run(self):
class GetAllUserRequest(UserRequestAbstract):
@icontract.require(
lambda self: not self.st_params
or set(self.st_params.keys()).isdisjoint({"START", "LIMIT", "ORDER"}),
"get_all() doesn't support parameters " "'start', 'limit' or 'order'",
or set(self.st_params.keys()).isdisjoint({"START", "ORDER"}),
"get_all() doesn't support parameters 'start' or 'order'",
)
@icontract.require(
lambda self: not self.st_method.startswith("tasks.elapseditem."),
Expand All @@ -131,6 +131,25 @@ def check_special_limitations(self):
stacklevel=get_warning_stack_level(TOP_MOST_LIBRARY_MODULES),
)

if self.st_params and "LIMIT" in self.st_params:
warnings.warn(
"Bitrix servers don't seem to support the 'LIMIT' parameter.",
UserWarning,
stacklevel=get_warning_stack_level(TOP_MOST_LIBRARY_MODULES),
)

if (
self.st_params
and "SELECT" in self.st_params
and "*" in self.st_params["SELECT"]
):
warnings.warn(
"You are selecting all fields. Beware that this is time-consuming and "
"may lead to penalties from the Bitrix server.",
UserWarning,
stacklevel=get_warning_stack_level(TOP_MOST_LIBRARY_MODULES),
)

return True

async def run(self):
Expand Down

0 comments on commit 0f0f813

Please sign in to comment.