Skip to content

Commit fc287dc

Browse files
committed
FFM-11022 Add logging
1 parent 4be9efb commit fc287dc

File tree

1 file changed

+43
-16
lines changed

1 file changed

+43
-16
lines changed

src/metrics.ts

+43-16
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ import {
2525
import { Options, Target } from './types';
2626
import { VERSION } from './version';
2727
import {
28+
infoEvaluationMetricsExceeded,
2829
infoMetricsSuccess,
2930
infoMetricsThreadExited,
31+
infoTargetMetricsExceeded,
3032
warnPostMetricsFailed,
3133
} from './sdk_codes';
3234
import { Logger } from './log';
@@ -63,6 +65,9 @@ export class MetricsProcessor implements MetricsProcessorInterface {
6365
// Maximum sizes for caches
6466
private MAX_EVALUATION_ANALYTICS_SIZE = 10000;
6567
private MAX_TARGET_ANALYTICS_SIZE = 100000;
68+
private evaluationAnalyticsExceeded = false;
69+
private targetAnalyticsExceeded = false;
70+
6671
private syncInterval?: NodeJS.Timeout;
6772
private api: MetricsApi;
6873
private readonly log: Logger;
@@ -118,28 +123,48 @@ export class MetricsProcessor implements MetricsProcessorInterface {
118123
variation,
119124
count: 0,
120125
};
126+
this.storeEvaluationAnalytic(event);
127+
this.storeTargetAnalytic(target);
128+
}
121129

122-
if (this.evaluationAnalytics.size < this.MAX_EVALUATION_ANALYTICS_SIZE) {
123-
const key = this._formatKey(event);
124-
const found = this.evaluationAnalytics.get(key);
125-
if (found) {
126-
found.count++;
127-
} else {
128-
event.count = 1;
129-
this.evaluationAnalytics.set(key, event);
130+
private storeTargetAnalytic(target: Target) {
131+
if (this.targetAnalytics.size >= this.MAX_TARGET_ANALYTICS_SIZE) {
132+
if (!this.targetAnalyticsExceeded) {
133+
this.targetAnalyticsExceeded = true;
134+
infoTargetMetricsExceeded(this.log);
130135
}
136+
137+
return;
131138
}
132139

133-
if (this.targetAnalytics.size < this.MAX_TARGET_ANALYTICS_SIZE) {
134-
if (target && !target.anonymous) {
135-
// If target has been seen then ignore it
136-
if (this.seenTargets.has(target.identifier)) {
137-
return;
138-
}
140+
if (target && !target.anonymous) {
141+
// If target has been seen then ignore it
142+
if (this.seenTargets.has(target.identifier)) {
143+
return;
144+
}
145+
146+
this.seenTargets.add(target.identifier);
147+
this.targetAnalytics.set(target.identifier, target);
148+
}
149+
}
139150

140-
this.seenTargets.add(target.identifier);
141-
this.targetAnalytics.set(target.identifier, target);
151+
private storeEvaluationAnalytic(event: AnalyticsEvent) {
152+
if (this.evaluationAnalytics.size >= this.MAX_EVALUATION_ANALYTICS_SIZE) {
153+
if (!this.evaluationAnalyticsExceeded) {
154+
this.evaluationAnalyticsExceeded = true;
155+
infoEvaluationMetricsExceeded(this.log);
142156
}
157+
158+
return;
159+
}
160+
161+
const key = this._formatKey(event);
162+
const found = this.evaluationAnalytics.get(key);
163+
if (found) {
164+
found.count++;
165+
} else {
166+
event.count = 1;
167+
this.evaluationAnalytics.set(key, event);
143168
}
144169
}
145170

@@ -159,6 +184,8 @@ export class MetricsProcessor implements MetricsProcessorInterface {
159184
const clonedTargetAnalytics = new Map(this.targetAnalytics);
160185
this.evaluationAnalytics.clear();
161186
this.targetAnalytics.clear();
187+
this.evaluationAnalyticsExceeded = false;
188+
this.targetAnalyticsExceeded = false;
162189

163190
clonedEvaluationAnalytics.forEach((event) => {
164191
const metricsAttributes: KeyValue[] = [

0 commit comments

Comments
 (0)