From 099960cd8c16560cb8a3b9341bf52b18d4ac884c Mon Sep 17 00:00:00 2001 From: Travis Tomsu Date: Mon, 9 Dec 2019 15:49:53 -0500 Subject: [PATCH] feat(stats): Adds Telemetry validator, which prints a new Info level message that will get printed during all hal config telemetry enable|disable and hal deploy apply invocations --- .../cli/services/v1/ResponseUnwrapper.java | 3 ++ .../spinnaker/halyard/cli/ui/v1/AnsiUi.java | 16 ++++++++- .../config/model/v1/node/Telemetry.java | 4 +++ .../config/services/v1/DeploymentService.java | 3 +- .../validate/v1/TelemetryValidator.java | 33 +++++++++++++++++++ .../halyard/core/problem/v1/Problem.java | 3 ++ 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/validate/v1/TelemetryValidator.java diff --git a/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/services/v1/ResponseUnwrapper.java b/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/services/v1/ResponseUnwrapper.java index 990e734f0d..0528c525bb 100644 --- a/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/services/v1/ResponseUnwrapper.java +++ b/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/services/v1/ResponseUnwrapper.java @@ -235,6 +235,9 @@ private static void formatProblemSet(ProblemSet problemSet) { List options = problem.getOptions(); switch (severity) { + case INFO: + AnsiUi.info(message); + break; case FATAL: case ERROR: AnsiUi.error(message); diff --git a/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/ui/v1/AnsiUi.java b/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/ui/v1/AnsiUi.java index 2716893d58..cdc83c4549 100644 --- a/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/ui/v1/AnsiUi.java +++ b/halyard-cli/src/main/java/com/netflix/spinnaker/halyard/cli/ui/v1/AnsiUi.java @@ -37,7 +37,7 @@ public static void problemLocation(String message) { AnsiParagraphBuilder builder = new AnsiParagraphBuilder().setIndentFirstLine(false).setIndentWidth(2); - builder.addSnippet("Problems in "); + builder.addSnippet("Validation in "); builder.addSnippet(message).addStyle(AnsiStyle.BOLD); @@ -46,6 +46,20 @@ public static void problemLocation(String message) { AnsiPrinter.err.println(builder.toString()); } + public static void info(String message) { + AnsiParagraphBuilder builder = + new AnsiParagraphBuilder().setIndentFirstLine(false).setIndentWidth(2); + + builder + .addSnippet("- INFO ") + .setForegroundColor(AnsiForegroundColor.GREEN) + .addStyle(AnsiStyle.BOLD); + + builder.addSnippet(message); + + AnsiPrinter.out.println(builder.toString()); + } + public static void warning(String message) { AnsiParagraphBuilder builder = new AnsiParagraphBuilder().setIndentFirstLine(false).setIndentWidth(2); diff --git a/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/model/v1/node/Telemetry.java b/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/model/v1/node/Telemetry.java index 5d25fe71a8..9e416bbdf0 100644 --- a/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/model/v1/node/Telemetry.java +++ b/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/model/v1/node/Telemetry.java @@ -31,7 +31,11 @@ public String getNodeName() { return "telemetry"; } + @ValidForSpinnakerVersion( + lowerBound = "1.18.0", + tooLowMessage = "Telemetry is not available prior to this release.") private Boolean enabled = false; + private String endpoint = DEFAULT_TELEMETRY_ENDPOINT; private String instanceId = new ULID().nextULID(); private String spinnakerVersion; diff --git a/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/services/v1/DeploymentService.java b/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/services/v1/DeploymentService.java index 31b4678973..f74d028066 100644 --- a/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/services/v1/DeploymentService.java +++ b/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/services/v1/DeploymentService.java @@ -154,7 +154,8 @@ public ProblemSet validateDeployment(String deploymentName) { .withAnyProvider() .withAnyAccount() .setFeatures() - .setSecurity(); + .setSecurity() + .setTelemetry(); if (storage.getPersistentStoreType() != null) { filter.setPersistentStore(storage.getPersistentStoreType().getId()); diff --git a/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/validate/v1/TelemetryValidator.java b/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/validate/v1/TelemetryValidator.java new file mode 100644 index 0000000000..9bc4244637 --- /dev/null +++ b/halyard-config/src/main/java/com/netflix/spinnaker/halyard/config/validate/v1/TelemetryValidator.java @@ -0,0 +1,33 @@ +package com.netflix.spinnaker.halyard.config.validate.v1; + +import com.netflix.spinnaker.halyard.config.model.v1.node.Telemetry; +import com.netflix.spinnaker.halyard.config.model.v1.node.Validator; +import com.netflix.spinnaker.halyard.config.problem.v1.ConfigProblemSetBuilder; +import com.netflix.spinnaker.halyard.core.problem.v1.Problem.Severity; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class TelemetryValidator extends Validator { + + @Override + public void validate(ConfigProblemSetBuilder p, Telemetry t) { + StringBuilder msg = new StringBuilder(); + msg.append("Telemetry is currently "); + if (t.getEnabled()) { + msg.append("ENABLED. Usage statistics are being collected—Thank you! "); + msg.append("These stats inform improvements to the product, and that helps the community. "); + msg.append("To disable, run `hal config telemetry disable`. "); + } else { + msg.append("DISABLED. Usage statistics are not being collected. "); + msg.append("Please consider enabling statistic collection. "); + msg.append("These stats inform improvements to the product, and that helps the community. "); + msg.append("To enable, run `hal config telemetry enable`. "); + } + + msg.append("To learn more about what and how telemetry data is used, please see "); + msg.append("https://www.spinnaker.io/community/stats."); + p.addProblem(Severity.INFO, msg.toString()); + } +} diff --git a/halyard-core/src/main/java/com/netflix/spinnaker/halyard/core/problem/v1/Problem.java b/halyard-core/src/main/java/com/netflix/spinnaker/halyard/core/problem/v1/Problem.java index c711be966b..7c45f86553 100644 --- a/halyard-core/src/main/java/com/netflix/spinnaker/halyard/core/problem/v1/Problem.java +++ b/halyard-core/src/main/java/com/netflix/spinnaker/halyard/core/problem/v1/Problem.java @@ -30,6 +30,9 @@ public enum Severity { */ NONE, + /** Indicates no problem at all, just information that should be shared with the user. */ + INFO, + /** * Indicates the deployment of Spinnaker is going against our preferred/recommended practices. * For example: using an unauthenticated docker registry.