diff --git a/echo-telemetry/src/main/java/com/netflix/spinnaker/echo/telemetry/TelemetryEventListener.java b/echo-telemetry/src/main/java/com/netflix/spinnaker/echo/telemetry/TelemetryEventListener.java index 9e676f9c4..638a35b58 100644 --- a/echo-telemetry/src/main/java/com/netflix/spinnaker/echo/telemetry/TelemetryEventListener.java +++ b/echo-telemetry/src/main/java/com/netflix/spinnaker/echo/telemetry/TelemetryEventListener.java @@ -33,6 +33,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @@ -109,8 +110,14 @@ public void processEvent(Event event) { Execution.Trigger.Type.valueOf( trigger.getOrDefault("type", "UNKNOWN").toString().toUpperCase()); - List stages = (List) execution.getOrDefault("stages", new ArrayList<>()); - List protoStages = stages.stream().map(this::toStage).collect(Collectors.toList()); + List> stages = + (List>) execution.getOrDefault("stages", new ArrayList<>()); + List protoStages = + stages.stream() + .map(this::toStage) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); Execution.Builder executionBuilder = Execution.newBuilder() @@ -147,7 +154,15 @@ public void processEvent(Event event) { } } - private Stage toStage(Map stage) { + @SuppressWarnings("unchecked") + private Optional toStage(Map stage) { + // Only interested in user-configured stages. + if (stage.get("syntheticStageOwner") != null + && !stage.get("syntheticStageOwner").toString().isEmpty()) { + log.debug("Discarding synthetic stage"); + return Optional.empty(); + } + Status status = Status.valueOf(stage.getOrDefault("status", "UNKNOWN").toString().toUpperCase()); Stage.Builder stageBuilder = @@ -164,7 +179,7 @@ private Stage toStage(Map stage) { // TODO(ttomsu): Figure out how to detect Kubernetes "flavor" - i.e. GKE, EKS, vanilla, etc. } - return stageBuilder.build(); + return Optional.of(stageBuilder.build()); } private String hash(String clearText) { diff --git a/echo-telemetry/src/test/groovy/com/netflix/spinnaker/echo/telemetry/TelemetryEventListenerSpec.groovy b/echo-telemetry/src/test/groovy/com/netflix/spinnaker/echo/telemetry/TelemetryEventListenerSpec.groovy index 89771b4b1..ce54bafb7 100644 --- a/echo-telemetry/src/test/groovy/com/netflix/spinnaker/echo/telemetry/TelemetryEventListenerSpec.groovy +++ b/echo-telemetry/src/test/groovy/com/netflix/spinnaker/echo/telemetry/TelemetryEventListenerSpec.groovy @@ -106,6 +106,15 @@ class TelemetryEventListenerSpec extends Specification { stages : [ [ type : "deploy", + status: "SUCCEEDED", + syntheticStageOwner: null, + context: [ + "cloudProvider": "nine" + ] + ], + [ + type: "removed", + syntheticStageOwner: "somethingNonNull", status: "SUCCEEDED" ], [ @@ -151,6 +160,7 @@ class TelemetryEventListenerSpec extends Specification { Stage stage1 = stages.get(0) assert stage1.type == "deploy" assert stage1.status == Status.SUCCEEDED + assert stage1.cloudProvider.id == "nine" Stage stage2 = stages.get(1) assert stage2.type == "wait"