Skip to content

Commit 24026a3

Browse files
feat: feat(queues): add queues metrics endpoint
* feat(queues): add queues metrics endpoint
1 parent 9707100 commit 24026a3

6 files changed

Lines changed: 232 additions & 3 deletions

File tree

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 2194
1+
configured_endpoints: 2195
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/cloudflare%2Fcloudflare-0ce49e6bb0d3819f135b9a567b661205fdf5df21cff157eab2b7abd7b5b50347.yml
33
openapi_spec_hash: 512a5bb3a32860590c8949765605d65a
4-
config_hash: 5367ae3e3a9a0d6578c2756965a99e3a
4+
config_hash: 6f813d0ef66c7bf6daf8e0df5638e7a3

src/cloudflare/resources/queues/api.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Types:
44

55
```python
6-
from cloudflare.types.queues import Queue, QueueDeleteResponse
6+
from cloudflare.types.queues import Queue, QueueDeleteResponse, QueueGetMetricsResponse
77
```
88

99
Methods:
@@ -14,6 +14,7 @@ Methods:
1414
- <code title="delete /accounts/{account_id}/queues/{queue_id}">client.queues.<a href="./src/cloudflare/resources/queues/queues.py">delete</a>(queue_id, \*, account_id) -> <a href="./src/cloudflare/types/queues/queue_delete_response.py">QueueDeleteResponse</a></code>
1515
- <code title="patch /accounts/{account_id}/queues/{queue_id}">client.queues.<a href="./src/cloudflare/resources/queues/queues.py">edit</a>(queue_id, \*, account_id, \*\*<a href="src/cloudflare/types/queues/queue_edit_params.py">params</a>) -> <a href="./src/cloudflare/types/queues/queue.py">Optional[Queue]</a></code>
1616
- <code title="get /accounts/{account_id}/queues/{queue_id}">client.queues.<a href="./src/cloudflare/resources/queues/queues.py">get</a>(queue_id, \*, account_id) -> <a href="./src/cloudflare/types/queues/queue.py">Optional[Queue]</a></code>
17+
- <code title="get /accounts/{account_id}/queues/{queue_id}/metrics">client.queues.<a href="./src/cloudflare/resources/queues/queues.py">get_metrics</a>(queue_id, \*, account_id) -> <a href="./src/cloudflare/types/queues/queue_get_metrics_response.py">Optional[QueueGetMetricsResponse]</a></code>
1718

1819
## Messages
1920

src/cloudflare/resources/queues/queues.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
from ...types.queues import queue_edit_params, queue_create_params, queue_update_params
5555
from ...types.queues.queue import Queue
5656
from ...types.queues.queue_delete_response import QueueDeleteResponse
57+
from ...types.queues.queue_get_metrics_response import QueueGetMetricsResponse
5758

5859
__all__ = ["QueuesResource", "AsyncQueuesResource"]
5960

@@ -364,6 +365,52 @@ def get(
364365
cast_to=cast(Type[Optional[Queue]], ResultWrapper[Queue]),
365366
)
366367

368+
def get_metrics(
369+
self,
370+
queue_id: str,
371+
*,
372+
account_id: str,
373+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
374+
# The extra values given here take precedence over values defined on the client or passed to this method.
375+
extra_headers: Headers | None = None,
376+
extra_query: Query | None = None,
377+
extra_body: Body | None = None,
378+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
379+
) -> Optional[QueueGetMetricsResponse]:
380+
"""Return best-effort metrics for a queue.
381+
382+
Values may be approximate due to the
383+
distributed nature of queues.
384+
385+
Args:
386+
account_id: A Resource identifier.
387+
388+
queue_id: A Resource identifier.
389+
390+
extra_headers: Send extra headers
391+
392+
extra_query: Add additional query parameters to the request
393+
394+
extra_body: Add additional JSON properties to the request
395+
396+
timeout: Override the client-level default timeout for this request, in seconds
397+
"""
398+
if not account_id:
399+
raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}")
400+
if not queue_id:
401+
raise ValueError(f"Expected a non-empty value for `queue_id` but received {queue_id!r}")
402+
return self._get(
403+
path_template("/accounts/{account_id}/queues/{queue_id}/metrics", account_id=account_id, queue_id=queue_id),
404+
options=make_request_options(
405+
extra_headers=extra_headers,
406+
extra_query=extra_query,
407+
extra_body=extra_body,
408+
timeout=timeout,
409+
post_parser=ResultWrapper[Optional[QueueGetMetricsResponse]]._unwrapper,
410+
),
411+
cast_to=cast(Type[Optional[QueueGetMetricsResponse]], ResultWrapper[QueueGetMetricsResponse]),
412+
)
413+
367414

368415
class AsyncQueuesResource(AsyncAPIResource):
369416
@cached_property
@@ -671,6 +718,52 @@ async def get(
671718
cast_to=cast(Type[Optional[Queue]], ResultWrapper[Queue]),
672719
)
673720

721+
async def get_metrics(
722+
self,
723+
queue_id: str,
724+
*,
725+
account_id: str,
726+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
727+
# The extra values given here take precedence over values defined on the client or passed to this method.
728+
extra_headers: Headers | None = None,
729+
extra_query: Query | None = None,
730+
extra_body: Body | None = None,
731+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
732+
) -> Optional[QueueGetMetricsResponse]:
733+
"""Return best-effort metrics for a queue.
734+
735+
Values may be approximate due to the
736+
distributed nature of queues.
737+
738+
Args:
739+
account_id: A Resource identifier.
740+
741+
queue_id: A Resource identifier.
742+
743+
extra_headers: Send extra headers
744+
745+
extra_query: Add additional query parameters to the request
746+
747+
extra_body: Add additional JSON properties to the request
748+
749+
timeout: Override the client-level default timeout for this request, in seconds
750+
"""
751+
if not account_id:
752+
raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}")
753+
if not queue_id:
754+
raise ValueError(f"Expected a non-empty value for `queue_id` but received {queue_id!r}")
755+
return await self._get(
756+
path_template("/accounts/{account_id}/queues/{queue_id}/metrics", account_id=account_id, queue_id=queue_id),
757+
options=make_request_options(
758+
extra_headers=extra_headers,
759+
extra_query=extra_query,
760+
extra_body=extra_body,
761+
timeout=timeout,
762+
post_parser=ResultWrapper[Optional[QueueGetMetricsResponse]]._unwrapper,
763+
),
764+
cast_to=cast(Type[Optional[QueueGetMetricsResponse]], ResultWrapper[QueueGetMetricsResponse]),
765+
)
766+
674767

675768
class QueuesResourceWithRawResponse:
676769
def __init__(self, queues: QueuesResource) -> None:
@@ -694,6 +787,9 @@ def __init__(self, queues: QueuesResource) -> None:
694787
self.get = to_raw_response_wrapper(
695788
queues.get,
696789
)
790+
self.get_metrics = to_raw_response_wrapper(
791+
queues.get_metrics,
792+
)
697793

698794
@cached_property
699795
def messages(self) -> MessagesResourceWithRawResponse:
@@ -734,6 +830,9 @@ def __init__(self, queues: AsyncQueuesResource) -> None:
734830
self.get = async_to_raw_response_wrapper(
735831
queues.get,
736832
)
833+
self.get_metrics = async_to_raw_response_wrapper(
834+
queues.get_metrics,
835+
)
737836

738837
@cached_property
739838
def messages(self) -> AsyncMessagesResourceWithRawResponse:
@@ -774,6 +873,9 @@ def __init__(self, queues: QueuesResource) -> None:
774873
self.get = to_streamed_response_wrapper(
775874
queues.get,
776875
)
876+
self.get_metrics = to_streamed_response_wrapper(
877+
queues.get_metrics,
878+
)
777879

778880
@cached_property
779881
def messages(self) -> MessagesResourceWithStreamingResponse:
@@ -814,6 +916,9 @@ def __init__(self, queues: AsyncQueuesResource) -> None:
814916
self.get = async_to_streamed_response_wrapper(
815917
queues.get,
816918
)
919+
self.get_metrics = async_to_streamed_response_wrapper(
920+
queues.get_metrics,
921+
)
817922

818923
@cached_property
819924
def messages(self) -> AsyncMessagesResourceWithStreamingResponse:

src/cloudflare/types/queues/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from .subscription_list_params import SubscriptionListParams as SubscriptionListParams
2424
from .subscription_get_response import SubscriptionGetResponse as SubscriptionGetResponse
2525
from .message_bulk_push_response import MessageBulkPushResponse as MessageBulkPushResponse
26+
from .queue_get_metrics_response import QueueGetMetricsResponse as QueueGetMetricsResponse
2627
from .subscription_create_params import SubscriptionCreateParams as SubscriptionCreateParams
2728
from .subscription_list_response import SubscriptionListResponse as SubscriptionListResponse
2829
from .subscription_update_params import SubscriptionUpdateParams as SubscriptionUpdateParams
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from ..._models import BaseModel
4+
5+
__all__ = ["QueueGetMetricsResponse"]
6+
7+
8+
class QueueGetMetricsResponse(BaseModel):
9+
"""Best-effort metrics for the queue.
10+
11+
Values may be approximate due to the distributed nature of queues.
12+
"""
13+
14+
backlog_bytes: float
15+
"""The size in bytes of unacknowledged messages in the queue."""
16+
17+
backlog_count: float
18+
"""The number of unacknowledged messages in the queue."""
19+
20+
oldest_message_timestamp_ms: float
21+
"""Unix timestamp in milliseconds of the oldest unacknowledged message in the
22+
queue.
23+
24+
Returns 0 if unknown.
25+
"""

tests/api_resources/test_queues.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from cloudflare.types.queues import (
1414
Queue,
1515
QueueDeleteResponse,
16+
QueueGetMetricsResponse,
1617
)
1718

1819
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -321,6 +322,54 @@ def test_path_params_get(self, client: Cloudflare) -> None:
321322
account_id="023e105f4ecef8ad9ca31a8372d0c353",
322323
)
323324

325+
@parametrize
326+
def test_method_get_metrics(self, client: Cloudflare) -> None:
327+
queue = client.queues.get_metrics(
328+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
329+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
330+
)
331+
assert_matches_type(Optional[QueueGetMetricsResponse], queue, path=["response"])
332+
333+
@parametrize
334+
def test_raw_response_get_metrics(self, client: Cloudflare) -> None:
335+
response = client.queues.with_raw_response.get_metrics(
336+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
337+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
338+
)
339+
340+
assert response.is_closed is True
341+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
342+
queue = response.parse()
343+
assert_matches_type(Optional[QueueGetMetricsResponse], queue, path=["response"])
344+
345+
@parametrize
346+
def test_streaming_response_get_metrics(self, client: Cloudflare) -> None:
347+
with client.queues.with_streaming_response.get_metrics(
348+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
349+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
350+
) as response:
351+
assert not response.is_closed
352+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
353+
354+
queue = response.parse()
355+
assert_matches_type(Optional[QueueGetMetricsResponse], queue, path=["response"])
356+
357+
assert cast(Any, response.is_closed) is True
358+
359+
@parametrize
360+
def test_path_params_get_metrics(self, client: Cloudflare) -> None:
361+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"):
362+
client.queues.with_raw_response.get_metrics(
363+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
364+
account_id="",
365+
)
366+
367+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `queue_id` but received ''"):
368+
client.queues.with_raw_response.get_metrics(
369+
queue_id="",
370+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
371+
)
372+
324373

325374
class TestAsyncQueues:
326375
parametrize = pytest.mark.parametrize(
@@ -626,3 +675,51 @@ async def test_path_params_get(self, async_client: AsyncCloudflare) -> None:
626675
queue_id="",
627676
account_id="023e105f4ecef8ad9ca31a8372d0c353",
628677
)
678+
679+
@parametrize
680+
async def test_method_get_metrics(self, async_client: AsyncCloudflare) -> None:
681+
queue = await async_client.queues.get_metrics(
682+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
683+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
684+
)
685+
assert_matches_type(Optional[QueueGetMetricsResponse], queue, path=["response"])
686+
687+
@parametrize
688+
async def test_raw_response_get_metrics(self, async_client: AsyncCloudflare) -> None:
689+
response = await async_client.queues.with_raw_response.get_metrics(
690+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
691+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
692+
)
693+
694+
assert response.is_closed is True
695+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
696+
queue = await response.parse()
697+
assert_matches_type(Optional[QueueGetMetricsResponse], queue, path=["response"])
698+
699+
@parametrize
700+
async def test_streaming_response_get_metrics(self, async_client: AsyncCloudflare) -> None:
701+
async with async_client.queues.with_streaming_response.get_metrics(
702+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
703+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
704+
) as response:
705+
assert not response.is_closed
706+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
707+
708+
queue = await response.parse()
709+
assert_matches_type(Optional[QueueGetMetricsResponse], queue, path=["response"])
710+
711+
assert cast(Any, response.is_closed) is True
712+
713+
@parametrize
714+
async def test_path_params_get_metrics(self, async_client: AsyncCloudflare) -> None:
715+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"):
716+
await async_client.queues.with_raw_response.get_metrics(
717+
queue_id="023e105f4ecef8ad9ca31a8372d0c353",
718+
account_id="",
719+
)
720+
721+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `queue_id` but received ''"):
722+
await async_client.queues.with_raw_response.get_metrics(
723+
queue_id="",
724+
account_id="023e105f4ecef8ad9ca31a8372d0c353",
725+
)

0 commit comments

Comments
 (0)