diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfiguration.java index c996e02cf5..32b68176e2 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import org.springframework.boot.actuate.info.EnvironmentInfoContributor; import org.springframework.boot.actuate.info.GitInfoContributor; import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.boot.actuate.info.JavaInfoContributor; +import org.springframework.boot.actuate.info.OsInfoContributor; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -86,4 +87,11 @@ public class InfoContributorAutoConfiguration { return new JavaInfoContributor(); } + @Bean + @ConditionalOnEnabledInfoContributor(value = "os", fallback = InfoContributorFallback.DISABLE) + @Order(DEFAULT_ORDER) + public OsInfoContributor osInfoContributor() { + return new OsInfoContributor(); + } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index cf5e58d7c4..782a13e319 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -279,6 +279,12 @@ "description": "Whether to enable Java info.", "defaultValue": false }, + { + "name": "management.info.os.enabled", + "type": "java.lang.Boolean", + "description": "Whether to enable Operating System info.", + "defaultValue": false + }, { "name": "management.metrics.binders.files.enabled", "type": "java.lang.Boolean", diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfigurationTests.java index 3e62f70734..faa2f8befe 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/info/InfoContributorAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,10 +27,12 @@ import org.springframework.boot.actuate.info.GitInfoContributor; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.boot.actuate.info.JavaInfoContributor; +import org.springframework.boot.actuate.info.OsInfoContributor; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.info.BuildProperties; import org.springframework.boot.info.GitProperties; import org.springframework.boot.info.JavaInfo; +import org.springframework.boot.info.OsInfo; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -151,6 +153,16 @@ class InfoContributorAutoConfigurationTests { }); } + @Test + void osInfoContributor() { + this.contextRunner.withPropertyValues("management.info.os.enabled=true").run((context) -> { + assertThat(context).hasSingleBean(OsInfoContributor.class); + Map content = invokeContributor(context.getBean(OsInfoContributor.class)); + assertThat(content).containsKey("os"); + assertThat(content.get("os")).isInstanceOf(OsInfo.class); + }); + } + private Map invokeContributor(InfoContributor contributor) { Info.Builder builder = new Info.Builder(); contributor.contribute(builder); diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/OsInfoContributor.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/OsInfoContributor.java new file mode 100644 index 0000000000..b7fe75347b --- /dev/null +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/OsInfoContributor.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.info; + +import org.springframework.boot.info.OsInfo; + +/** + * An {@link InfoContributor} that exposes {@link OsInfo}. + * + * @author Jonatan Ivanov + * @since 2.7.0 + */ +public class OsInfoContributor implements InfoContributor { + + private final OsInfo osInfo; + + public OsInfoContributor() { + this.osInfo = new OsInfo(); + } + + @Override + public void contribute(Info.Builder builder) { + builder.withDetail("os", this.osInfo); + } + +} diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/info/OsInfoContributorTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/info/OsInfoContributorTests.java new file mode 100644 index 0000000000..333a683c46 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/info/OsInfoContributorTests.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.info; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.info.OsInfo; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link OsInfoContributor} + * + * @author Jonatan Ivanov + */ +class OsInfoContributorTests { + + @Test + void osInfoShouldBeAdded() { + OsInfoContributor osInfoContributor = new OsInfoContributor(); + Info.Builder builder = new Info.Builder(); + osInfoContributor.contribute(builder); + Info info = builder.build(); + assertThat(info.getDetails().get("os")).isInstanceOf(OsInfo.class); + } + +} diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/endpoints.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/endpoints.adoc index 486fa9962d..d6e5eeaec2 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/endpoints.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/endpoints.adoc @@ -1165,13 +1165,18 @@ When appropriate, Spring auto-configures the following `InfoContributor` beans: | Exposes Java runtime information. | None. +| `os` +| {spring-boot-actuator-module-code}/info/OsInfoContributor.java[`OsInfoContributor`] +| Exposes Operating System information. +| None. + |=== -Whether or not an individual contributor is enabled is controlled by its `management.info..enabled` property. +Whether an individual contributor is enabled is controlled by its `management.info..enabled` property. Different contributors have different defaults for this property, depending on their prerequisites and the nature of the information that they expose. -With no prerequisites to indicate that they should be enabled, the `env` and `java` contributors are disabled by default. -You can enable them by setting the configprop:management.info.env.enabled[] or configprop:management.info.java.enabled[] properties to `true`. +With no prerequisites to indicate that they should be enabled, the `env`, `java`, and `os` contributors are disabled by default. +Each can be enabled by setting its `management.info..enabled` property to `true`. The `build` and `git` info contributors are enabled by default. Each can be disabled by setting its `management.info..enabled` property to `false`. @@ -1262,6 +1267,12 @@ The `info` endpoint publishes information about your Java runtime environment, s +[[actuator.endpoints.info.os-information]] +==== OS Information +The `info` endpoint publishes information about your Operating System, see {spring-boot-module-api}/info/OsInfo.html[`OsInfo`] for more details. + + + [[actuator.endpoints.info.writing-custom-info-contributors]] ==== Writing Custom InfoContributors To provide custom application information, you can register Spring beans that implement the {spring-boot-actuator-module-code}/info/InfoContributor.java[`InfoContributor`] interface. diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/info/OsInfo.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/info/OsInfo.java new file mode 100644 index 0000000000..947628bf4e --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/info/OsInfo.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.info; + +/** + * Information about the Operating System the application is running on. + * + * @author Jonatan Ivanov + * @since 2.7.0 + */ +public class OsInfo { + + private final String name; + + private final String version; + + private final String arch; + + public OsInfo() { + this.name = System.getProperty("os.name"); + this.version = System.getProperty("os.version"); + this.arch = System.getProperty("os.arch"); + } + + public String getName() { + return this.name; + } + + public String getVersion() { + return this.version; + } + + public String getArch() { + return this.arch; + } + +} diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/info/OsInfoTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/info/OsInfoTests.java new file mode 100644 index 0000000000..14a3eaa96e --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/info/OsInfoTests.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.info; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link OsInfo}. + * + * @author Jonatan Ivanov + */ +public class OsInfoTests { + + @Test + void osInfoIsAvailable() { + OsInfo osInfo = new OsInfo(); + assertThat(osInfo.getName()).isEqualTo(System.getProperty("os.name")); + assertThat(osInfo.getVersion()).isEqualTo(System.getProperty("os.version")); + assertThat(osInfo.getArch()).isEqualTo(System.getProperty("os.arch")); + } + +}