Skip to content

Expose Operating System information as an info contributor #28907

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
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;
Expand Down Expand Up @@ -86,4 +87,11 @@ public JavaInfoContributor javaInfoContributor() {
return new JavaInfoContributor();
}

@Bean
@ConditionalOnEnabledInfoContributor(value = "os", fallback = InfoContributorFallback.DISABLE)
@Order(DEFAULT_ORDER)
public OsInfoContributor osInfoContributor() {
return new OsInfoContributor();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@
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;
Expand Down Expand Up @@ -151,6 +153,16 @@ void javaInfoContributor() {
});
}

@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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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"));
}

}