From 26f072d92bfb327dbbf328b2fd4e582a83e65e86 Mon Sep 17 00:00:00 2001 From: Jean Bisutti Date: Wed, 4 Dec 2024 12:33:50 +0100 Subject: [PATCH] Add Spring env self-diagnostics --- .../selfdiagnostics/ExecutionEnvSelfDiag.java | 41 ------------ .../selfdiagnostics/SelfDiagAutoConfig.java | 5 +- .../selfdiagnostics/SpringEnvSelfDiag.java | 67 +++++++++++++++++++ 3 files changed, 70 insertions(+), 43 deletions(-) delete mode 100644 sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/ExecutionEnvSelfDiag.java create mode 100644 sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SpringEnvSelfDiag.java diff --git a/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/ExecutionEnvSelfDiag.java b/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/ExecutionEnvSelfDiag.java deleted file mode 100644 index 87c5fea8c95d..000000000000 --- a/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/ExecutionEnvSelfDiag.java +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.spring.cloud.autoconfigure.monitor.implementation.selfdiagnostics; - -import org.slf4j.Logger; -import org.springframework.boot.CommandLineRunner; - -class ExecutionEnvSelfDiag implements CommandLineRunner { - private final Logger selfDiagnosticsLogger; - - ExecutionEnvSelfDiag(Logger selfDiagnosticsLogger) { - this.selfDiagnosticsLogger = selfDiagnosticsLogger; - } - - @Override - public void run(String... args) { - try { - executeExecutionEnvSelfDiagnostics(); - } catch (Exception e) { - selfDiagnosticsLogger.warn("An unexpected issue has happened during execution env self-diagnostics.", e); - } - } - - private void executeExecutionEnvSelfDiagnostics() { - if (selfDiagnosticsLogger.isDebugEnabled()) { - boolean nativeRuntimeExecution = isNativeRuntimeExecution(); - selfDiagnosticsLogger.debug("GraalVM native: " + nativeRuntimeExecution); - } - if (selfDiagnosticsLogger.isTraceEnabled()) { - selfDiagnosticsLogger.trace("OS: " + System.getProperty("os.name")); - selfDiagnosticsLogger.trace("Env: " + System.getenv()); - selfDiagnosticsLogger.trace("System properties: " + System.getProperties()); - } - } - - private static boolean isNativeRuntimeExecution() { - String imageCode = System.getProperty("org.graalvm.nativeimage.imagecode"); - return imageCode != null; - } -} diff --git a/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SelfDiagAutoConfig.java b/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SelfDiagAutoConfig.java index 22be23245c88..80e9a74e0dc5 100644 --- a/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SelfDiagAutoConfig.java +++ b/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SelfDiagAutoConfig.java @@ -10,6 +10,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.core.env.Environment; import java.util.Locale; @@ -45,7 +46,7 @@ OtelSelfDiag otelSelfDiag(ApplicationContext applicationContext, Logger selfDiag } @Bean - ExecutionEnvSelfDiag executionEnvSelfDiag(Logger selfDiagnosticsLogger) { - return new ExecutionEnvSelfDiag(selfDiagnosticsLogger); + SpringEnvSelfDiag springPropertiesSelfDiagnostic(Environment environment, Logger selfDiagnosticsLogger) { + return new SpringEnvSelfDiag(environment, selfDiagnosticsLogger); } } diff --git a/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SpringEnvSelfDiag.java b/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SpringEnvSelfDiag.java new file mode 100644 index 000000000000..6fda89d73900 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-starter-monitor/src/main/java/com/azure/spring/cloud/autoconfigure/monitor/implementation/selfdiagnostics/SpringEnvSelfDiag.java @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.monitor.implementation.selfdiagnostics; + +import org.slf4j.Logger; +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.core.env.PropertySource; + +import java.util.AbstractMap.SimpleEntry; +import java.util.Locale; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +class SpringEnvSelfDiag implements CommandLineRunner { + + private final Environment environment; + + private final Logger selfDiagnosticsLogger; + + SpringEnvSelfDiag(Environment environment, Logger selfDiagnosticsLogger) { + this.environment = environment; + this.selfDiagnosticsLogger = selfDiagnosticsLogger; + } + + @Override + public void run(String... args) { + if (!selfDiagnosticsLogger.isTraceEnabled()) { + return; + } + + try { + executeSpringEnvSelfDiag(); + } catch (Exception e) { + selfDiagnosticsLogger.warn("An unexpected issue has happened during Spring env self-diagnostics.", e); + } + } + + private void executeSpringEnvSelfDiag() { + if (environment instanceof ConfigurableEnvironment) { + ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment; + String env = buildEnvAsString(configurableEnvironment); + selfDiagnosticsLogger.trace("Env: " + env); + } + } + + private static String buildEnvAsString(ConfigurableEnvironment configurableEnvironment) { + return StreamSupport.stream(configurableEnvironment.getPropertySources().spliterator(), false) + .map(PropertySource::getSource) + .filter(source -> source instanceof Map) + .flatMap(source -> ((Map) source).entrySet().stream()) + .map(entry -> { + String value = isSensitive(entry) ? "***" : entry.getValue().toString(); + return new SimpleEntry<>(entry.getKey().toString(), value); + }) + .map(SimpleEntry::toString) + .collect(Collectors.joining(", ")); + } + + private static boolean isSensitive(Map.Entry entry) { + String key = entry.getKey().toString().toLowerCase(Locale.ROOT); + return key.contains("password") || key.contains("pwd") || key.contains("secret"); + } +}