log-foundry 0.5.1.dev3__tar.gz → 0.5.1.dev4__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.
Files changed (51) hide show
  1. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/PKG-INFO +1 -1
  2. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/pyproject.toml +1 -1
  3. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/sqs.py +16 -13
  4. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/LICENSE +0 -0
  5. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/README.md +0 -0
  6. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/__init__.py +0 -0
  7. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/api.py +0 -0
  8. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/config.py +0 -0
  9. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/console.py +0 -0
  10. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/context.py +0 -0
  11. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/decorator.py +0 -0
  12. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/ids.py +0 -0
  13. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/model.py +0 -0
  14. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/py.typed +0 -0
  15. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/__init__.py +0 -0
  16. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/_chunk.py +0 -0
  17. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/_socket.py +0 -0
  18. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/_time.py +0 -0
  19. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/base.py +0 -0
  20. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/callback.py +0 -0
  21. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/clickhouse.py +0 -0
  22. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/datadog.py +0 -0
  23. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/elasticsearch.py +0 -0
  24. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/eventhubs.py +0 -0
  25. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/file.py +0 -0
  26. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/filtering.py +0 -0
  27. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/firehose.py +0 -0
  28. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/honeycomb.py +0 -0
  29. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/http.py +0 -0
  30. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/kafka.py +0 -0
  31. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/kinesis.py +0 -0
  32. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/logging_sink.py +0 -0
  33. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/logstash.py +0 -0
  34. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/loki.py +0 -0
  35. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/mongodb.py +0 -0
  36. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/multi.py +0 -0
  37. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/nats.py +0 -0
  38. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/newrelic.py +0 -0
  39. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/postgres.py +0 -0
  40. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/pubsub.py +0 -0
  41. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/rabbitmq.py +0 -0
  42. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/redis.py +0 -0
  43. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/sentry.py +0 -0
  44. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/sns.py +0 -0
  45. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/splunk.py +0 -0
  46. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/sqlite.py +0 -0
  47. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/stdout.py +0 -0
  48. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/syslog.py +0 -0
  49. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/transform.py +0 -0
  50. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/sinks/util.py +0 -0
  51. {log_foundry-0.5.1.dev3 → log_foundry-0.5.1.dev4}/src/log_foundry/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: log-foundry
3
- Version: 0.5.1.dev3
3
+ Version: 0.5.1.dev4
4
4
  Summary: Generate logs for your console and JSON events for downstream consumption.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -20,7 +20,7 @@ dependencies = [
20
20
  ]
21
21
 
22
22
  # Optional features. Install with: pip install log-foundry[aws]
23
- version = "0.5.1.dev3"
23
+ version = "0.5.1.dev4"
24
24
 
25
25
  [project.optional-dependencies]
26
26
  aws = ["boto3>=1.34"] # SQSSink, SNSSink, KinesisSink, FirehoseSink
@@ -148,13 +148,16 @@ class SQSSink:
148
148
  def _chunks(self, batch: list[dict[str, object]]) -> list[list[_Prepared]]:
149
149
  """Split ``batch`` into sends of ≤ ``MAX_BATCH`` entries and ≤ ``MAX_BYTES`` each.
150
150
 
151
- Each event is serialized once with ``json.dumps``. An event whose serialized size
152
- exceeds ``MAX_BYTES`` on its own can never fit a message, so it is dropped with a
153
- counted warning (FR-004) instead of stalling the batch judged on the body alone, so
154
- an event's droppability does not depend on which queue type it is bound for.
155
-
156
- On a FIFO queue the resolved ids are costed alongside the body (SPEC-016 FR-005): they
157
- travel in the same request, so leaving them out of the budget could overshoot 256 KB.
151
+ Each event is serialized once with ``json.dumps``, and on a FIFO queue its ids are
152
+ resolved once here too (SPEC-016 FR-005) they travel in the same request, so both the
153
+ running budget and the single-entry check below cost them alongside the body.
154
+
155
+ An entry whose costed size exceeds ``MAX_BYTES`` can never fit a message, so it is
156
+ dropped with a counted warning (FR-004) instead of stalling the batch. The check is made
157
+ on everything that travels, not the body alone: a body just under the limit plus up to
158
+ 256 bytes of FIFO ids would otherwise pass, then ship as a lone over-budget request that
159
+ SQS rejects as a sender fault — which FR-006 (rightly) never retries, losing the event
160
+ as an opaque failure instead of a labelled oversize drop.
158
161
  """
159
162
  chunks: list[list[_Prepared]] = []
160
163
  current: list[_Prepared] = []
@@ -162,6 +165,12 @@ class SQSSink:
162
165
  for event in batch:
163
166
  body = json.dumps(event)
164
167
  size = len(body.encode("utf-8"))
168
+ group_id: str | None = None
169
+ dedup_id: str | None = None
170
+ if self.fifo:
171
+ group_id = self._group_id(event)
172
+ dedup_id = self._dedup_id(event)
173
+ size += len(group_id.encode("utf-8")) + len(dedup_id.encode("utf-8"))
165
174
  if size > self.MAX_BYTES:
166
175
  self.dropped_oversized += 1
167
176
  sys.stderr.write(
@@ -169,12 +178,6 @@ class SQSSink:
169
178
  f"{self.MAX_BYTES}-byte SQS message limit\n"
170
179
  )
171
180
  continue
172
- group_id: str | None = None
173
- dedup_id: str | None = None
174
- if self.fifo:
175
- group_id = self._group_id(event)
176
- dedup_id = self._dedup_id(event)
177
- size += len(group_id.encode("utf-8")) + len(dedup_id.encode("utf-8"))
178
181
  if current and (
179
182
  len(current) >= self.MAX_BATCH or current_bytes + size > self.MAX_BYTES
180
183
  ):