In a previous post we learned how to add build information to the /info
endpoint in our application. We can add custom information to the /info
endpoint via our application configuration or via a bean by implementing the InfoSource
interface. Remember we need to add the io.micronaut:management
dependency to our application for this feature.
Any configuration property that is prefixed with info
will be exposed via the /info
endpoint. We can define the properties in configuration files, using Java system properties or system environment variables. In the following example configuration file we add the property info.sample.message
:
1 2 3 4 | // File: src/main/resources/application.yml ... info: sample: message: Micronaut is awesome |
Another option is to create a new class that implements the InfoSource
interface. We need to override the getSource
method to return a Publisher
with a PropertySource
. In our example application we have a ConferenceRepository
bean that can access a database with data about conferences. In the following example InfoSource
implementation we want to return the number of conferences that are stored in the database:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | package mrhaki.micronaut; import io.micronaut.context.annotation.Requires; import io.micronaut.context.env.MapPropertySource; import io.micronaut.context.env.PropertySource; import io.micronaut.core.async.SupplierUtil; import io.micronaut.management.endpoint.info.InfoEndpoint; import io.micronaut.management.endpoint.info.InfoSource; import io.micronaut.runtime.context.scope.Refreshable; import io.reactivex.Flowable; import org.reactivestreams.Publisher; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; // Component is refreshable via a refresh event @Refreshable // Only create this component when the following // requirements are met: @Requires (beans = InfoEndpoint. class ) @Requires (property = "endpoints.info.config.enabled" , notEquals = "false" ) public class DatabaseInfoSource implements InfoSource { /** * Repository to fetch count of conferences in the database. */ private final ConferenceRepository conferenceRepository; /** * Supplier for returning result. */ private final Supplier<PropertySource> supplier; public DatabaseInfoSource( final ConferenceRepository conferenceRepository) { this .conferenceRepository = conferenceRepository; // Cache result from database. // This component is refreshable via // a refresh event to get the latest value // from the database. this .supplier = SupplierUtil.memoized( this ::retrieveDatabaseInfo); } /** * Return information. * * @return Information about the database. */ @Override public Publisher<PropertySource> getSource() { return Flowable.just(supplier.get()); } /** * Get information from the database via the {@link #conferenceRepository} instance. * * @return Number of conferences in the database. */ private MapPropertySource retrieveDatabaseInfo() { final Map<String, Long> databaseInfo = new HashMap<>(); databaseInfo.put( "db.conferences.count" , conferenceRepository.count()); return new MapPropertySource( "database" , databaseInfo); } } |
Let's run our Micronaut application and invoke the /info
endpoint. We see the following response if we have 42 conference records in our database:
{ "db": { "conferences": { "count": 42 } }, "sample": { "message": "Micronaut is awesome" } } |
Written with Micronaut 1.0.0.M4.