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