reach_commons 0.18.23__py3-none-any.whl → 0.18.25__py3-none-any.whl

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.
@@ -146,6 +146,99 @@ class SQSClient(BaseSQSClient):
146
146
 
147
147
  return True
148
148
 
149
+ def get_visible_messages_count(self) -> int:
150
+ try:
151
+ resp = self.client.get_queue_attributes(
152
+ QueueUrl=self.topic_name,
153
+ AttributeNames=[
154
+ "ApproximateNumberOfMessages",
155
+ "ApproximateNumberOfMessagesNotVisible",
156
+ "ApproximateNumberOfMessagesDelayed",
157
+ ],
158
+ )
159
+ visible = int(resp["Attributes"].get("ApproximateNumberOfMessages", 0))
160
+ in_flight = int(
161
+ resp["Attributes"].get("ApproximateNumberOfMessagesNotVisible", 0)
162
+ )
163
+ delayed = int(
164
+ resp["Attributes"].get("ApproximateNumberOfMessagesDelayed", 0)
165
+ )
166
+
167
+ return visible, in_flight, delayed
168
+ except ClientError as exc:
169
+ self.logger.error(
170
+ "error_fetching_queue_attributes, topic_name=%s, error=%s",
171
+ self.topic_name,
172
+ str(exc),
173
+ )
174
+ # If there's an error, return 0 so as not to block the caller.
175
+ return 0, 0, 0
176
+
177
+ def publish_with_capacity_guard(
178
+ self,
179
+ message_data: dict,
180
+ max_capacity: int,
181
+ delay_seconds: int = 60,
182
+ message_attributes: dict = None,
183
+ ) -> dict:
184
+ """
185
+ Attempts to publish a message while enforcing an approximate queue capacity limit.
186
+
187
+ Behavior:
188
+ - If the queue is below `max_capacity`, the message is published normally.
189
+ - If the queue is at or above `max_capacity`, the message is NOT published.
190
+
191
+ Returns a dict with:
192
+ - posted: bool -> whether the message was actually published
193
+ - visible_count: int -> ApproximateNumberOfMessages at publication time
194
+ - max_capacity: int -> the capacity threshold used
195
+
196
+ Example:
197
+ sqs = SQSClient(topic_name="<enviroment>-messages-queue")
198
+
199
+ Result = sqs.publish_with_capacity_guard(
200
+ message_data={"foo": "bar"},
201
+ max_capacity=100_000,
202
+ delay_seconds=30,
203
+ message_attributes={"service_name": "TestClient"},
204
+ )
205
+
206
+ if not Result["posted"]:
207
+ print("Queue is over capacity:", Result)
208
+ """
209
+ (
210
+ visible_count,
211
+ in_flight_count,
212
+ delayed_count,
213
+ ) = self.get_visible_messages_count()
214
+
215
+ if visible_count >= max_capacity:
216
+ self.logger.warning(
217
+ "queue_over_capacity, topic_name=%s, visible=%s, max_capacity=%s",
218
+ self.topic_name,
219
+ visible_count,
220
+ max_capacity,
221
+ )
222
+ return {
223
+ "posted": False,
224
+ "visible_count": visible_count,
225
+ "max_capacity": max_capacity,
226
+ }
227
+
228
+ self.publish(
229
+ message_data=message_data,
230
+ delay_seconds=delay_seconds,
231
+ message_attributes=message_attributes,
232
+ )
233
+
234
+ return {
235
+ "posted": True,
236
+ "visible_count": visible_count,
237
+ "in_flight_count": in_flight_count,
238
+ "delayed_count": delayed_count,
239
+ "max_capacity": max_capacity,
240
+ }
241
+
149
242
 
150
243
  class MessageFilter:
151
244
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reach_commons
3
- Version: 0.18.23
3
+ Version: 0.18.25
4
4
  Summary: Reach Commons is a versatile utility library designed to streamline and enhance development workflows within the Reach ecosystem.
5
5
  License: MIT
6
6
  Author: Engineering
@@ -21,12 +21,12 @@ reach_commons/reach_aws/exceptions.py,sha256=x0RL5ktNtzxg0KykhEVWReBq_dEtciK6B2v
21
21
  reach_commons/reach_aws/firehose.py,sha256=1xFKLWMv3bNo3PPW5gtaL6NqzUDyVil6B768slj2wbY,5674
22
22
  reach_commons/reach_aws/kms.py,sha256=ZOfyJMQUgxJEojRoB7-aCxtATpNx1Ig522IUYH11NZ4,4678
23
23
  reach_commons/reach_aws/s3.py,sha256=2MLlDNFx0SROJBpE_KjJefyrB7lMqTlrYuRhSZx4iKs,3945
24
- reach_commons/reach_aws/sqs.py,sha256=LKQ42vRJko2HTE8gO_lRvftnstIMI3DeFZakvLUM0BQ,15864
24
+ reach_commons/reach_aws/sqs.py,sha256=lxdBzvCZ_cUy29se5LhUrIenPWdJcPHtRtFXazzhg-A,19214
25
25
  reach_commons/reach_base_model.py,sha256=vgdGDcZr3iXMmyRhmBhOf_LKWB_6QzT3r_Yiyo6OmEk,3009
26
26
  reach_commons/redis_manager.py,sha256=SgUtdtt0eV4bUwsWDankIa9Bjfgcm2DKcmVMQT6ptF0,2946
27
27
  reach_commons/sms_smart_encoding.py,sha256=92y0RmZ0l4ONHpC9qeO5KfViSNq64yE2rc7lhNDSZqE,1241
28
28
  reach_commons/utils.py,sha256=dMgKIGqTgoSItuBI8oz81gKtW3qi21Jkljv9leS_V88,8475
29
29
  reach_commons/validations.py,sha256=CJdWg8qc9ILe3rYHYTLdr2upRspsM_8ghhm4IXX4Pg8,1028
30
- reach_commons-0.18.23.dist-info/METADATA,sha256=rNrFAbeMVQa6i0ALab7iTY7VDXuPI5tF794nCu_PPJM,1965
31
- reach_commons-0.18.23.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
32
- reach_commons-0.18.23.dist-info/RECORD,,
30
+ reach_commons-0.18.25.dist-info/METADATA,sha256=CBq0zcdO1OOmh8Eq76u6Fa6ECC55JEtU5L3-F5C0Wa8,1965
31
+ reach_commons-0.18.25.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
32
+ reach_commons-0.18.25.dist-info/RECORD,,