Skip to content

Commit e2ec0d2

Browse files
committed
Append metrics data to error context
1 parent c5bdc9f commit e2ec0d2

3 files changed

Lines changed: 47 additions & 37 deletions

File tree

core/src/main/java/dev/faststats/ErrorTrackingSink.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ final class ErrorTrackingSink {
3838
final Set<SimpleErrorTracker> errorTrackers = new CopyOnWriteArraySet<>();
3939
final Set<ScheduledFuture<?>> submissionJobs = new CopyOnWriteArraySet<>();
4040

41-
private @Nullable SimpleErrorTracker internalErrorTracker;
41+
private volatile @Nullable SimpleErrorTracker internalErrorTracker;
4242
private volatile @Nullable ScheduledExecutorService submissionScheduler;
4343
private volatile @Nullable ScheduledFuture<?> errorSubmissionJob;
4444

@@ -104,28 +104,12 @@ private static URI getErrorTrackerServerUrl() {
104104
return URI.create("https://metrics.faststats.dev/v1/error");
105105
}
106106

107-
JsonArray getData() {
108-
final var data = new JsonArray();
109-
if (internalErrorTracker != null) data.addAll(internalErrorTracker.getData());
110-
errorTrackers.forEach(tracker -> data.addAll(tracker.getData()));
111-
return data;
112-
}
113-
114107
// todo: improve logging to be less cluttered; dedupe code
115108
void submit() {
116109
if (!context.getConfig().errorTracking()) return;
117110

118-
final var errors = getData();
119-
if (errors.isEmpty()) return;
120-
121-
final var data = new JsonObject();
122-
context.getSdkInfo().getBuildId().ifPresent(id -> data.addProperty("buildId", id));
123-
data.addProperty("identifier", context.getConfig().serverId().toString());
124-
data.addProperty("project_name", context.getProjectName());
125-
data.addProperty("sdk_name", context.getSdkInfo().getName());
126-
data.addProperty("sdk_version", context.getSdkInfo().getVersion());
127-
// data.add("context", ); // todo: add global attributes and default and custom metrics
128-
data.add("errors", errors);
111+
final var data = createData();
112+
if (data == null) return;
129113

130114
try (final var byteOutput = new ByteArrayOutputStream();
131115
final var output = new GZIPOutputStream(byteOutput)) {
@@ -171,8 +155,34 @@ void submit() {
171155
}
172156
}
173157

158+
private @Nullable JsonObject createData() {
159+
final var internal = internalErrorTracker;
160+
if (internal == null && errorTrackers.isEmpty()) return null;
161+
162+
final var data = new JsonObject();
163+
context.getSdkInfo().getBuildId().ifPresent(id -> data.addProperty("buildId", id));
164+
data.addProperty("identifier", context.getConfig().serverId().toString());
165+
data.addProperty("project_name", context.getProjectName());
166+
data.addProperty("sdk_name", context.getSdkInfo().getName());
167+
data.addProperty("sdk_version", context.getSdkInfo().getVersion());
168+
169+
final var defaultContext = new JsonObject();
170+
context.metrics().ifPresent(metrics -> {
171+
final var simpleMetrics = (SimpleMetrics) metrics;
172+
simpleMetrics.appendData(defaultContext);
173+
});
174+
data.add("context", defaultContext);
175+
176+
final var errors = new JsonArray();
177+
if (internal != null) errors.addAll(internal.getData());
178+
errorTrackers.forEach(tracker -> errors.addAll(tracker.getData()));
179+
data.add("errors", errors);
180+
return data;
181+
}
182+
174183
void clear() {
175-
if (internalErrorTracker != null) internalErrorTracker.clear();
184+
final var internal = internalErrorTracker;
185+
if (internal != null) internal.clear();
176186
errorTrackers.forEach(SimpleErrorTracker::clear);
177187
}
178188

core/src/main/java/dev/faststats/SimpleMetrics.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -179,33 +179,38 @@ public boolean submit() {
179179
private static final String osVersion = System.getProperty("os.version");
180180
private static final int coreCount = Runtime.getRuntime().availableProcessors();
181181

182-
protected JsonObject createData() {
183-
final var data = new JsonObject();
184-
final var metrics = new JsonObject();
185-
182+
private void appendInternalData(final JsonObject metrics) {
186183
metrics.addProperty("core_count", coreCount);
187184
metrics.addProperty("java_vendor", javaVendor);
188185
metrics.addProperty("java_version", javaVersion);
189186
metrics.addProperty("os_arch", osArch);
190187
metrics.addProperty("os_name", osName);
191188
metrics.addProperty("os_version", osVersion);
189+
}
192190

193-
try {
194-
appendDefaultData(metrics);
195-
} catch (final Throwable t) {
196-
logger.error("Failed to append default data", t);
197-
context.trackInternalError(t);
198-
}
199-
191+
private void appendCustomData(final JsonObject metrics) {
200192
this.metrics.forEach(metric -> {
201193
try {
194+
// todo: prevent overriding and log warning if multiple similar metric ids are used
202195
metric.getData().ifPresent(element -> metrics.add(metric.getId(), element));
203196
} catch (final Throwable t) {
204-
logger.error("Failed to build metric data: %s", t, metric.getId());
197+
logger.error("Failed to append custom metric data: %s", t, metric.getId());
205198
context.trackInternalError(t);
206199
}
207200
});
201+
}
202+
203+
public final void appendData(final JsonObject metrics) {
204+
appendInternalData(metrics);
205+
appendDefaultData(metrics);
206+
appendCustomData(metrics);
207+
}
208+
209+
private JsonObject createData() {
210+
final var data = new JsonObject();
211+
final var metrics = new JsonObject();
208212

213+
appendData(metrics);
209214

210215
data.addProperty("project_name", context.getProjectName());
211216
data.addProperty("identifier", context.getConfig().serverId().toString());

core/src/test/java/dev/faststats/MockMetrics.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,6 @@ void startTestSubmitting() {
1818
startSubmitting();
1919
}
2020

21-
@Override
22-
public JsonObject createData() {
23-
return super.createData();
24-
}
25-
2621
@Override
2722
protected void appendDefaultData(final JsonObject metrics) {
2823
}

0 commit comments

Comments
 (0)