apitally 0.11.2__tar.gz → 0.11.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apitally
3
- Version: 0.11.2
3
+ Version: 0.11.3
4
4
  Summary: Simple API monitoring & analytics for REST APIs built with FastAPI, Flask, Django, Starlette and Litestar.
5
5
  Home-page: https://apitally.io
6
6
  License: MIT
@@ -0,0 +1 @@
1
+ __version__ = "0.11.3"
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import logging
5
+ import random
5
6
  import time
6
7
  from functools import partial
7
8
  from typing import Any, Dict, Optional, Tuple
@@ -82,18 +83,21 @@ class ApitallyClient(ApitallyClientBase):
82
83
  data = self.get_sync_data()
83
84
  self._sync_data_queue.put_nowait((time.time(), data))
84
85
 
85
- failed_items = []
86
+ i = 0
86
87
  while not self._sync_data_queue.empty():
87
88
  timestamp, data = self._sync_data_queue.get_nowait()
88
89
  try:
89
90
  if (time_offset := time.time() - timestamp) <= MAX_QUEUE_TIME:
91
+ if i > 0:
92
+ await asyncio.sleep(random.uniform(0.1, 0.3))
90
93
  data["time_offset"] = time_offset
91
94
  await self._send_sync_data(client, data)
92
- self._sync_data_queue.task_done()
95
+ i += 1
93
96
  except httpx.HTTPError:
94
- failed_items.append((timestamp, data))
95
- for item in failed_items:
96
- self._sync_data_queue.put_nowait(item)
97
+ self._sync_data_queue.put_nowait((timestamp, data))
98
+ break
99
+ finally:
100
+ self._sync_data_queue.task_done()
97
101
 
98
102
  @retry(raise_on_giveup=False)
99
103
  async def _send_startup_data(self, client: httpx.AsyncClient, data: Dict[str, Any]) -> None:
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import queue
5
+ import random
5
6
  import time
6
7
  from functools import partial
7
8
  from threading import Event, Thread
@@ -95,18 +96,21 @@ class ApitallyClient(ApitallyClientBase):
95
96
  data = self.get_sync_data()
96
97
  self._sync_data_queue.put_nowait((time.time(), data))
97
98
 
98
- failed_items = []
99
+ i = 0
99
100
  while not self._sync_data_queue.empty():
100
101
  timestamp, data = self._sync_data_queue.get_nowait()
101
102
  try:
102
103
  if (time_offset := time.time() - timestamp) <= MAX_QUEUE_TIME:
104
+ if i > 0:
105
+ time.sleep(random.uniform(0.1, 0.3))
103
106
  data["time_offset"] = time_offset
104
107
  self._send_sync_data(session, data)
105
- self._sync_data_queue.task_done()
108
+ i += 1
106
109
  except requests.RequestException:
107
- failed_items.append((timestamp, data))
108
- for item in failed_items:
109
- self._sync_data_queue.put_nowait(item)
110
+ self._sync_data_queue.put_nowait((timestamp, data))
111
+ break
112
+ finally:
113
+ self._sync_data_queue.task_done()
110
114
 
111
115
  @retry(raise_on_giveup=False)
112
116
  def _send_startup_data(self, session: requests.Session, data: Dict[str, Any]) -> None:
@@ -94,7 +94,7 @@ class ApitallyMiddleware:
94
94
  response = self.get_response(request)
95
95
  response_time = time.perf_counter() - start_time
96
96
  path = self.get_path(request)
97
- if request.method is not None and path is not None:
97
+ if request.method is not None and request.method != "OPTIONS" and path is not None:
98
98
  try:
99
99
  consumer = self.get_consumer(request)
100
100
  consumer_identifier = consumer.identifier if consumer else None
@@ -93,7 +93,7 @@ class ApitallyMiddleware:
93
93
  response_headers: Headers,
94
94
  ) -> None:
95
95
  rule, is_handled_path = self.get_rule(environ)
96
- if is_handled_path or not self.filter_unhandled_paths:
96
+ if (is_handled_path or not self.filter_unhandled_paths) and environ["REQUEST_METHOD"] != "OPTIONS":
97
97
  consumer = self.get_consumer()
98
98
  consumer_identifier = consumer.identifier if consumer else None
99
99
  self.client.consumer_registry.add_or_update_consumer(consumer)
@@ -92,7 +92,7 @@ class ApitallyMiddleware(BaseHTTPMiddleware):
92
92
  exception: Optional[BaseException] = None,
93
93
  ) -> None:
94
94
  path_template, is_handled_path = self.get_path_template(request)
95
- if is_handled_path or not self.filter_unhandled_paths:
95
+ if (is_handled_path or not self.filter_unhandled_paths) and request.method != "OPTIONS":
96
96
  consumer = self.get_consumer(request)
97
97
  consumer_identifier = consumer.identifier if consumer else None
98
98
  self.client.consumer_registry.add_or_update_consumer(consumer)
@@ -4,7 +4,7 @@ build-backend = "poetry_dynamic_versioning.backend"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "apitally"
7
- version = "0.11.2"
7
+ version = "0.11.3"
8
8
  description = "Simple API monitoring & analytics for REST APIs built with FastAPI, Flask, Django, Starlette and Litestar."
9
9
  readme = "README.md"
10
10
  authors = ["Apitally <hello@apitally.io>"]
@@ -51,7 +51,7 @@ pre-commit = [
51
51
  { version = "^3.5.0", python = "<3.9" },
52
52
  { version = "^3.7.0", python = ">=3.9" }
53
53
  ]
54
- ruff = "^0.5.0"
54
+ ruff = "^0.6.0"
55
55
 
56
56
  [tool.poetry.group.test.dependencies]
57
57
  pytest = [
@@ -1 +0,0 @@
1
- __version__ = "0.11.2"
File without changes
File without changes
File without changes
File without changes
File without changes