Expose OS information as an InfoContributor

See gh-28907
This commit is contained in:
Jonatan Ivanov 2021-12-04 17:21:10 -08:00 committed by Stephane Nicoll
parent b9a7c2f179
commit c700f686c6
8 changed files with 210 additions and 2 deletions

View File

@ -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();
}
}

View File

@ -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 OS info.",
"defaultValue": false
},
{
"name": "management.metrics.binders.files.enabled",
"type": "java.lang.Boolean",

View File

@ -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<String, Object> content = invokeContributor(context.getBean(OsInfoContributor.class));
assertThat(content).containsKey("os");
assertThat(content.get("os")).isInstanceOf(OsInfo.class);
});
}
private Map<String, Object> invokeContributor(InfoContributor contributor) {
Info.Builder builder = new Info.Builder();
contributor.contribute(builder);

View File

@ -0,0 +1,40 @@
/*
* Copyright 2012-2021 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);
}
}

View File

@ -0,0 +1,42 @@
/*
* Copyright 2012-2021 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.JavaInfo;
import org.springframework.boot.info.OsInfo;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link OsInfoContributor}
*
* @author Jonatan Ivanov
*/
public 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);
}
}

View File

@ -1169,13 +1169,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.<id>.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.
You can enable them by setting the configprop:management.info.env.enabled[], configprop:management.info.java.enabled[] or configprop:management.info.os.enabled[] properties to `true`.
The `build` and `git` info contributors are enabled by default.
Each can be disabled by setting its `management.info.<id>.enabled` property to `false`.
@ -1266,6 +1271,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.

View File

@ -0,0 +1,51 @@
/*
* Copyright 2012-2021 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;
}
}

View File

@ -0,0 +1,38 @@
/*
* Copyright 2012-2021 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"));
}
}