From 55bba2ab47b22b924a342631d8c1d8d6747e87d9 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Tue, 26 Nov 2024 17:50:28 -0500 Subject: [PATCH] Added defensive checks for null values in telemetry (#278) --- .../LanguageServerTelemetryProvider.java | 27 ++++++++++++++++--- .../telemetry/ToolkitTelemetryProvider.java | 8 +++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/LanguageServerTelemetryProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/LanguageServerTelemetryProvider.java index 728a32bf..b95006a6 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/LanguageServerTelemetryProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/LanguageServerTelemetryProvider.java @@ -34,7 +34,12 @@ public static void setManifestStartPoint(final Instant start) { } public static void emitSetupGetManifest(final Result result, final RecordLspSetupArgs args) { - args.setDuration(Duration.between(manifestStartPoint, Instant.now()).toMillis()); + if (result == null || args == null) { + return; + } + if (manifestStartPoint != null) { + args.setDuration(Duration.between(manifestStartPoint, Instant.now()).toMillis()); + } emitSetupMetric(result, args, LanguageServerSetupStage.GET_MANIFEST); if (result == Result.FAILED && args.getManifestLocation() == ManifestLocation.UNKNOWN) { emitSetupAll(Result.FAILED, args); @@ -42,6 +47,9 @@ public static void emitSetupGetManifest(final Result result, final RecordLspSetu } public static void emitSetupGetServer(final Result result, final RecordLspSetupArgs args) { + if (result == null || args == null) { + return; + } emitSetupMetric(result, args, LanguageServerSetupStage.GET_SERVER); if (result == Result.FAILED && args.getLocation() == LanguageServerLocation.UNKNOWN) { emitSetupAll(Result.FAILED, args); @@ -49,20 +57,33 @@ public static void emitSetupGetServer(final Result result, final RecordLspSetupA } public static void emitSetupValidate(final Result result, final RecordLspSetupArgs args) { + if (result == null || args == null) { + return; + } emitSetupMetric(result, args, LanguageServerSetupStage.VALIDATE); if (result == Result.FAILED && args.getLocation() != LanguageServerLocation.OVERRIDE) { emitSetupAll(Result.FAILED, args); } } public static void emitSetupInitialize(final Result result, final RecordLspSetupArgs args) { - args.setDuration(Duration.between(initStartPoint, Instant.now()).toMillis()); + if (result == null || args == null) { + return; + } + if (initStartPoint != null) { + args.setDuration(Duration.between(initStartPoint, Instant.now()).toMillis()); + } emitSetupMetric(result, args, LanguageServerSetupStage.INITIALIZE); //final step completing makes call to complete full process emitSetupAll(result, args); } public static void emitSetupAll(final Result result, final RecordLspSetupArgs args) { - args.setDuration(Duration.between(allStartPoint, Instant.now()).toMillis()); + if (result == null || args == null) { + return; + } + if (allStartPoint != null) { + args.setDuration(Duration.between(allStartPoint, Instant.now()).toMillis()); + } emitSetupMetric(result, args, LanguageServerSetupStage.ALL); } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/ToolkitTelemetryProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/ToolkitTelemetryProvider.java index 9dbcbcea..a8703dfb 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/ToolkitTelemetryProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/telemetry/ToolkitTelemetryProvider.java @@ -8,8 +8,10 @@ import software.aws.toolkits.telemetry.TelemetryDefinitions.Result; import software.aws.toolkits.telemetry.ToolkitTelemetry; import java.time.Instant; +import java.util.Set; public final class ToolkitTelemetryProvider { + private static final Set NON_PASSIVE = Set.of("ellipsesMenu", "statusBar", "shortcut"); private ToolkitTelemetryProvider() { //prevent instantiation @@ -30,9 +32,9 @@ public static void emitExecuteCommandMetric(final ExecuteParams params) { public static void emitOpenModuleEventMetric(final String module, final String source, final String failureReason) { Result result = Result.SUCCEEDED; - boolean isPassive = (!source.equals("ellipsesMenu") && !source.equals("statusBar") && !source.equals("shortcut")); + boolean isPassive = (source != null && !NON_PASSIVE.contains(source)); - if (!failureReason.equals("none")) { + if (failureReason != null && !failureReason.equals("none")) { result = Result.FAILED; ToolkitTelemetry.OpenModuleEvent().reason(failureReason); } @@ -47,7 +49,7 @@ public static void emitOpenModuleEventMetric(final String module, final String s Activator.getTelemetryService().emitMetric(metadata); } public static void emitCloseModuleEventMetric(final String module, final String failureReason) { - Result result = (failureReason.equals("none")) ? Result.SUCCEEDED : Result.FAILED; + Result result = (failureReason == null || failureReason.equals("none")) ? Result.SUCCEEDED : Result.FAILED; MetricDatum metadata = ToolkitTelemetry.CloseModuleEvent() .module(mapModuleId(module)) .result(result)