@@ -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
0 commit comments