Skip to content

Commit e22d524

Browse files
committed
Make stat tracker verbose.
1 parent ae2bd0f commit e22d524

File tree

4 files changed

+32
-34
lines changed

4 files changed

+32
-34
lines changed

lib/src/data/cloud_database.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,14 @@ class FirestoreCloudDatabase extends CloudDatabase {
223223

224224
// Create project doc if missing.
225225
final snapshot = await rootRef.get();
226-
tracker.trackRead();
226+
tracker.trackRead('cloudDatabase/init');
227227

228228
// Do nothing if project doc exists.
229229
if (snapshot.exists) return;
230230

231231
// Create project doc if it does not exist.
232232
await rootRef.set({'project': identifier});
233-
tracker.trackWrite();
233+
tracker.trackWrite('cloudDatabase/init');
234234

235235
logger.log(_label, 'Done initializing for $identifier');
236236
}
@@ -307,7 +307,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
307307
if (autoGenerateId) {
308308
// if autoGenerateId is true, then skipCreationIfDocumentExists and docId is ignored.
309309
final document = await rootRef.collection(path).add(value);
310-
tracker.trackWrite();
310+
tracker.trackWrite('cloudDatabase/addDocument');
311311

312312
logger.log(_label, 'Document added: ${document.path}');
313313

@@ -327,7 +327,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
327327

328328
// Get snapshot to check if document exists.
329329
final snapshot = await docRef.get();
330-
tracker.trackRead();
330+
tracker.trackRead('cloudDatabase/addDocument');
331331

332332
if (skipCreationIfDocumentExists && snapshot.exists) {
333333
// if skipCreationIfDocumentExists is true, check if document exists.
@@ -338,7 +338,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
338338

339339
// Set document.
340340
await docRef.set(value);
341-
tracker.trackWrite();
341+
tracker.trackWrite('cloudDatabase/addDocument');
342342

343343
logger.log(_label, 'Document added: ${docRef.path}/$documentId');
344344
return true;
@@ -362,7 +362,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
362362

363363
// TODO: Should we do update instead of set?
364364
await docRef.set(value, SetOptions(merge: true));
365-
tracker.trackWrite();
365+
tracker.trackWrite('cloudDatabase/updateDocument');
366366

367367
logger.log(_label, 'Document updated: ${docRef.path}');
368368
return true;
@@ -373,13 +373,13 @@ class FirestoreCloudDatabase extends CloudDatabase {
373373
final docRef = getDocPath(path, documentId);
374374

375375
final snapshot = await docRef.get();
376-
tracker.trackRead();
376+
tracker.trackRead('cloudDatabase/removeDocument');
377377

378378
// TODO: Do we have to check for existence?
379379
if (!snapshot.exists) return false;
380380

381381
await docRef.delete();
382-
tracker.trackWrite();
382+
tracker.trackWrite('cloudDatabase/removeDocument');
383383

384384
return true;
385385
}
@@ -390,7 +390,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
390390
final docRef = getDocPath(path, documentId);
391391

392392
final snapshot = await docRef.get();
393-
tracker.trackRead();
393+
tracker.trackRead('cloudDatabase/getDocumentData');
394394

395395
final data = snapshot.data() ?? {};
396396
return sanitizeCloudDataForUse(data, docId: snapshot.id);
@@ -400,7 +400,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
400400
Stream<Map<String, dynamic>> streamDocument(String path, String documentId) {
401401
final docRef = getDocPath(path, documentId);
402402
return docRef.snapshots().map((snapshot) {
403-
tracker.trackRead();
403+
tracker.trackRead('cloudDatabase/streamDocument');
404404

405405
return snapshot.data()?.let(
406406
(value) => sanitizeCloudDataForUse(value, docId: snapshot.id)) ??
@@ -423,7 +423,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
423423
// Listen to the stream and update the variable.
424424
final subscription = stream.listen(
425425
(data) {
426-
tracker.trackRead();
426+
tracker.trackRead('cloudDatabase/streamDocumentToVariable');
427427

428428
logger.log(_label,
429429
'Document stream update from cloud storage: $path/$documentId');
@@ -500,7 +500,7 @@ class FirestoreCloudDatabase extends CloudDatabase {
500500
// Listen to the stream and update the variable.
501501
final subscription = stream.listen(
502502
(snapshot) {
503-
tracker.trackRead();
503+
tracker.trackRead('cloudDatabase/streamCollectionToVariable');
504504

505505
final docs = snapshot.docs
506506
.map((doc) => sanitizeCloudDataForUse(doc.data(), docId: doc.id))

lib/src/data/firebase_data_repository.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class FirebaseDataRepository extends NetworkDataRepository {
2626
firestore.collection(source.serverPath).doc(projectID);
2727

2828
return publishModelDoc.snapshots().map((event) {
29-
tracker.trackRead();
29+
tracker.trackRead('${source.serverPath}/streamPublishModel');
3030

3131
final Map<String, dynamic>? data = event.data();
3232
if (data == null || data.isEmpty) {
@@ -53,7 +53,7 @@ class FirebaseDataRepository extends NetworkDataRepository {
5353
.doc(layoutID);
5454

5555
return layoutDoc.get().then((value) {
56-
tracker.trackRead();
56+
tracker.trackRead('${source.serverPath}/downloadLayoutModel');
5757

5858
final Map<String, dynamic> data = value.data() ?? {};
5959

@@ -82,7 +82,7 @@ class FirebaseDataRepository extends NetworkDataRepository {
8282
.doc(fontID);
8383

8484
return fontDoc.get().then((value) {
85-
tracker.trackRead();
85+
tracker.trackRead('${source.serverPath}/downloadFontModel');
8686

8787
final Map<String, dynamic> data = value.data() ?? {};
8888

@@ -111,7 +111,7 @@ class FirebaseDataRepository extends NetworkDataRepository {
111111
.doc(apiId);
112112

113113
return apiDoc.get().then((value) {
114-
tracker.trackRead();
114+
tracker.trackRead('${source.serverPath}/downloadApi');
115115

116116
final Map<String, dynamic> data = value.data() ?? {};
117117

@@ -140,7 +140,7 @@ class FirebaseDataRepository extends NetworkDataRepository {
140140
.doc(layoutID);
141141

142142
return variablesDoc.get().then((value) {
143-
tracker.trackRead();
143+
tracker.trackRead('${source.serverPath}/downloadLayoutVariables');
144144

145145
final Map<String, dynamic> data = value.data() ?? {};
146146

@@ -170,7 +170,7 @@ class FirebaseDataRepository extends NetworkDataRepository {
170170
.doc(layoutID);
171171

172172
return conditionsDoc.get().then((value) {
173-
tracker.trackRead();
173+
tracker.trackRead('${source.serverPath}/downloadLayoutConditions');
174174

175175
final Map<String, dynamic> data = value.data() ?? {};
176176

lib/src/logging/stat_tracker.dart

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:cloud_firestore/cloud_firestore.dart';
22
import 'package:codelessly_api/codelessly_api.dart';
3-
import 'package:collection/collection.dart';
43

54
import '../constants.dart';
65
import '../utils/debouncer.dart';
@@ -15,10 +14,10 @@ abstract class StatTracker {
1514
void init(String projectId) => this.projectId = projectId;
1615

1716
/// Tracks one document read operation.
18-
Future<void> trackRead();
17+
Future<void> trackRead(String label);
1918

2019
/// Tracks one document write operation.
21-
Future<void> trackWrite();
20+
Future<void> trackWrite(String label);
2221

2322
/// Tracks one bundle download operation from the CDN.
2423
Future<void> trackBundleDownload();
@@ -48,21 +47,19 @@ final class FirestoreStatTracker extends StatTracker {
4847
/// with too many writes.
4948
final DeBouncer debouncer = DeBouncer(const Duration(seconds: 1));
5049

50+
/// Sends the batch of stats to the Firestore.
5151
Future<void> sendBatch() => debouncer.run(
5252
() async {
53-
print('Sending stat batch: $statBatch');
5453
// No need to await it. Send it and immediately start collecting more
5554
// stats.
5655
ref.set(
5756
{
58-
for (final entry in statBatch.entries
59-
.whereNot((entry) => entry.key == writesField))
57+
for (final entry in statBatch.entries)
6058
entry.key: FieldValue.increment(entry.value),
6159

6260
// Account for this stat tracking operation as an additional write
6361
// operation.
64-
writesField:
65-
FieldValue.increment((statBatch[writesField] ?? 0) + 1),
62+
'$writesField/stats': FieldValue.increment(1),
6663
},
6764
SetOptions(merge: true),
6865
);
@@ -76,14 +73,14 @@ final class FirestoreStatTracker extends StatTracker {
7673
}
7774

7875
@override
79-
Future<void> trackRead() {
80-
incrementField(readsField);
76+
Future<void> trackRead(String label) {
77+
incrementField('$readsField/$label');
8178
return sendBatch();
8279
}
8380

8481
@override
85-
Future<void> trackWrite() {
86-
incrementField(writesField);
82+
Future<void> trackWrite(String label) {
83+
incrementField('$writesField/$label');
8784
return sendBatch();
8885
}
8986

lib/src/utils/debouncer.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,8 @@ final class DeBouncer {
7474

7575
_counter++;
7676

77-
if (((forceRunAfter != null && forceRunAfter < _counter) ||
78-
immediateFirstRun) &&
79-
!isRunning) {
77+
if ((forceRunAfter != null && forceRunAfter <= _counter) ||
78+
(immediateFirstRun && !isRunning)) {
8079
// Reset the counter for forced runs.
8180
if (forceRunAfter != null) _counter = 0;
8281

@@ -106,7 +105,9 @@ final class DeBouncer {
106105

107106
// action is sync and returns a value.
108107
completer.complete(result);
109-
return completer.future;
108+
return completer.future.whenComplete(() {
109+
_counter = 0;
110+
});
110111
}
111112

112113
/// alias for [run]. This also makes it so that you can use the instance

0 commit comments

Comments
 (0)