Merge pull request #28907 from jonatan-ivanov

* pr/28907:
  Polish "Expose OS information as an InfoContributor"
  Expose OS information as an InfoContributor

Closes gh-28907
This commit is contained in:
Stephane Nicoll 2022-01-04 14:23:40 +01:00
commit 988decdd3f
8 changed files with 212 additions and 5 deletions

View File

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

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

View File

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

View File

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

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.
Whether 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.
Each can be enabled by setting its `management.info.<id>.enabled` property 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-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;
}
}

View File

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