Skip to content

Commit 7efd0e8

Browse files
authored
Merge pull request #2947 from Agenta-AI/fix/year-month-miscalculation
[Fix] fix cron jobs and add plenty of logs to report
2 parents 9ae6a07 + 15b0d6c commit 7efd0e8

File tree

4 files changed

+249
-111
lines changed

4 files changed

+249
-111
lines changed

api/ee/src/core/meters/service.py

Lines changed: 130 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -68,106 +68,166 @@ async def report(self):
6868
log.warn("Missing Stripe API Key.")
6969
return
7070

71+
log.info("[report] Starting meter report job")
72+
7173
try:
7274
meters = await self.dump()
73-
75+
log.info(f"[report] Dumped {len(meters)} meters to sync")
7476
except Exception as e: # pylint: disable=broad-exception-caught
7577
log.error("Error dumping meters: %s", e)
7678
return
7779

78-
try:
79-
for meter in meters:
80-
if meter.subscription is None:
81-
continue
82-
83-
try:
84-
if meter.key.value in REPORTS:
85-
subscription_id = meter.subscription.subscription_id
86-
customer_id = meter.subscription.customer_id
87-
88-
if not subscription_id:
89-
continue
90-
91-
if not customer_id:
92-
continue
80+
reported_count = 0
81+
skipped_count = 0
82+
error_count = 0
83+
84+
for meter in meters:
85+
log.debug(
86+
f"[report] Processing meter {meter.organization_id}/{meter.key} (value={meter.value}, synced={meter.synced})"
87+
)
88+
89+
if meter.subscription is None:
90+
log.debug(
91+
f"[report] Skipping meter {meter.organization_id}/{meter.key} - no subscription"
92+
)
93+
skipped_count += 1
94+
continue
95+
96+
try:
97+
if meter.key.value in REPORTS:
98+
subscription_id = meter.subscription.subscription_id
99+
customer_id = meter.subscription.customer_id
100+
101+
if not subscription_id:
102+
log.warn(
103+
f"[report] Skipping meter {meter.organization_id}/{meter.key} - missing subscription_id"
104+
)
105+
skipped_count += 1
106+
continue
107+
108+
if not customer_id:
109+
log.warn(
110+
f"[report] Skipping meter {meter.organization_id}/{meter.key} - missing customer_id"
111+
)
112+
skipped_count += 1
113+
continue
114+
115+
if meter.key.name in Gauge.__members__.keys():
116+
try:
117+
price_id = (
118+
AGENTA_PRICING.get(meter.subscription.plan, {})
119+
.get("users", {})
120+
.get("price")
121+
)
93122

94-
if meter.key.name in Gauge.__members__.keys():
95-
try:
96-
price_id = (
97-
AGENTA_PRICING.get(meter.subscription.plan, {})
98-
.get("users", {})
99-
.get("price")
123+
if not price_id:
124+
log.warn(
125+
f"[report] Skipping meter {meter.organization_id}/{meter.key} - missing price_id for plan {meter.subscription.plan}"
100126
)
127+
skipped_count += 1
128+
continue
101129

102-
if not price_id:
103-
continue
104-
105-
_id = None
106-
for item in stripe.SubscriptionItem.list(
107-
subscription=subscription_id,
108-
).auto_paging_iter():
109-
if item.price.id == price_id:
110-
_id = item.id
111-
break
112-
113-
if not _id:
114-
continue
115-
116-
quantity = meter.value
117-
118-
items = [{"id": _id, "quantity": quantity}]
119-
120-
stripe.Subscription.modify(
121-
subscription_id,
122-
items=items,
130+
_id = None
131+
for item in stripe.SubscriptionItem.list(
132+
subscription=subscription_id,
133+
).auto_paging_iter():
134+
if item.price.id == price_id:
135+
_id = item.id
136+
break
137+
138+
if not _id:
139+
log.warn(
140+
f"[report] Skipping meter {meter.organization_id}/{meter.key} - subscription item not found for price_id {price_id}"
123141
)
124-
125-
except (
126-
Exception # pylint: disable=broad-exception-caught
127-
) as e:
128-
log.error("Error modifying subscription: %s", e)
142+
skipped_count += 1
129143
continue
130144

145+
quantity = meter.value
146+
items = [{"id": _id, "quantity": quantity}]
147+
148+
stripe.Subscription.modify(
149+
subscription_id,
150+
items=items,
151+
)
152+
153+
reported_count += 1
131154
log.info(
132155
f"[stripe] updating: {meter.organization_id} | | {'sync ' if meter.key.value in REPORTS else ' '} | {meter.key}: {meter.value}"
133156
)
134157

135-
if meter.key.name in Counter.__members__.keys():
136-
try:
137-
event_name = meter.key.value
138-
delta = meter.value - meter.synced
139-
payload = {"delta": delta, "customer_id": customer_id}
158+
except Exception as e: # pylint: disable=broad-exception-caught
159+
log.error(
160+
f"Error modifying subscription for {meter.organization_id}/{meter.key}: %s",
161+
e,
162+
)
163+
error_count += 1
164+
continue
165+
166+
if meter.key.name in Counter.__members__.keys():
167+
try:
168+
event_name = meter.key.value
169+
delta = meter.value - meter.synced
140170

141-
stripe.billing.MeterEvent.create(
142-
event_name=event_name,
143-
payload=payload,
171+
if delta <= 0:
172+
log.debug(
173+
f"[report] Skipping meter {meter.organization_id}/{meter.key} - delta is {delta}"
144174
)
145-
except (
146-
Exception # pylint: disable=broad-exception-caught
147-
) as e:
148-
log.error("Error creating meter event: %s", e)
175+
skipped_count += 1
149176
continue
150177

178+
payload = {"delta": delta, "customer_id": customer_id}
179+
180+
stripe.billing.MeterEvent.create(
181+
event_name=event_name,
182+
payload=payload,
183+
)
184+
185+
reported_count += 1
151186
log.info(
152187
f"[stripe] reporting: {meter.organization_id} | {(('0' if (meter.month != 0 and meter.month < 10) else '') + str(meter.month)) if meter.month != 0 else ' '}.{meter.year if meter.year else ' '} | {'sync ' if meter.key.value in REPORTS else ' '} | {meter.key}: {meter.value - meter.synced}"
153188
)
154189

155-
except Exception as e: # pylint: disable=broad-exception-caught
156-
log.error("Error reporting meter: %s", e)
190+
except Exception as e: # pylint: disable=broad-exception-caught
191+
log.error(
192+
f"Error creating meter event for {meter.organization_id}/{meter.key}: %s",
193+
e,
194+
)
195+
error_count += 1
196+
continue
157197

158-
except Exception as e: # pylint: disable=broad-exception-caught
159-
log.error("Error reporting meters: %s", e)
198+
except Exception as e: # pylint: disable=broad-exception-caught
199+
log.error(
200+
f"Error reporting meter {meter.organization_id}/{meter.key}: %s", e
201+
)
202+
error_count += 1
160203

161-
try:
162-
for meter in meters:
163-
meter.synced = meter.value
204+
log.info(
205+
f"[report] Reporting complete: {reported_count} reported, {skipped_count} skipped, {error_count} errors"
206+
)
164207

165-
except Exception as e: # pylint: disable=broad-exception-caught
166-
log.error("Error syncing meters: %s", e)
208+
log.info(f"[report] Setting synced values for {len(meters)} meters")
209+
synced_count = 0
210+
sync_error_count = 0
211+
212+
for meter in meters:
213+
try:
214+
meter.synced = meter.value
215+
synced_count += 1
216+
except Exception as e: # pylint: disable=broad-exception-caught
217+
log.error(
218+
f"Error setting synced value for {meter.organization_id}/{meter.key}: %s",
219+
e,
220+
)
221+
sync_error_count += 1
222+
223+
log.info(
224+
f"[report] Set synced values: {synced_count} success, {sync_error_count} errors"
225+
)
167226

168227
try:
228+
log.info(f"[report] Calling bump for {len(meters)} meters")
169229
await self.bump(meters=meters)
170-
230+
log.info(f"[report] Bump completed successfully")
171231
except Exception as e: # pylint: disable=broad-exception-caught
172232
log.error("Error bumping meters: %s", e)
173233
return

api/ee/src/crons/meters.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
* * * * * root echo "cron test $(date)" >> /proc/1/fd/1 2>&1
2-
0 * * * * root sh /meters.sh >> /proc/1/fd/1 2>&1
2+
* * * * * root sh /meters.sh >> /proc/1/fd/1 2>&1

0 commit comments

Comments
 (0)