I’m not sure how I feel about this combination. I had high hopes but it’s been frustrating to get working. I guess if I had the time it would be useful to create a slick dashboard and alerts against Spring Actuator parameters.
Let’s get started building a working example. The source code is here.
Go to Spring Initializer and create an app called dashboard-demo including these dependencies: Spring Web, Spring Boot Actuator, Lombok, and Spring Boot Dev Tools.
Replace the DashboardDemoApplication class with MovieServiceApplication. This is a simple web application we can play with.
@SpringBootApplication
@RestController
@RequestMapping("/movies")
public class MovieServiceApplication {
public static void main(final String[] args) {
SpringApplication.run(MovieServiceApplication.class, args);
}
private final List<Movie> movieList = Arrays.asList(
Movie.builder().id(1L).title("Watchmen").director("Zack Snyder").build(),
Movie.builder().id(2L).title("The Color of Magic").director("Vadim Jean").build());
@GetMapping("")
public List<Movie> findAllBooks() {
return movieList;
}
@GetMapping("/{movieId}")
public Movie findBook(@PathVariable final Long movieId) {
return movieList.stream().filter(b -> b.getId().equals(movieId)).findFirst().orElse(null);
}
}
An create a Movie class
@Data
@Builder
public class Movie {
private String director;
private Long id;
private String title;
}
Now edit src/main/resources/application.properties to enable the actuator endpoints.
#Metrics related configurations
management.endpoint.metrics.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true
Now we just need to include the Prometheus dependencies that will expose the actuator values to the Prometheus server. Add these dependencies to build.gradle.
// Micormeter core dependecy
implementation 'io.micrometer:micrometer-core'
// Micrometer Prometheus registry -->
implementation 'io.micrometer:micrometer-registry-prometheus'
Run the application
gradlew bootRun
Open a browser to http://localhost:8080/actuator and you should see this
{"_links":{"self":
...
"prometheus":{"href":"http://localhost:8080/actuator/prometheus","templated":false},
...
}}
We will run these with docker compose. create a docker-compose.yml file.
version: '2'
services:
prometheus:
image: prom/prometheus:0.18.0
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '-config.file=/etc/prometheus/prometheus.yml'
ports:
- '9090:9090'
grafana:
image: grafana/grafana
ports:
- 3000:3000
We need to provide the configuration to prometheus so create prometheus.yml like this.
global:
scrape_interval: 5s
external_labels:
monitor: 'my-monitor'
scrape_configs:
- job_name: 'prometheus'
target_groups:
- targets: ['localhost:9090']
- job_name: 'movie-service'
metrics_path: '/actuator/prometheus'
target_groups:
- targets: ['host.docker.internal:8080']
Now launch them
docker-compose up
Open a browser to http://localhost:9090/graph for prometheus. Go to Status > Targets to make sure the Movie-Service is being monitored.
Now open a browser to http://localhost:3000/login. The default credentials are admin:admin. Once in you will want to add Prometheus as a data source. Set the URL to http://localhost:9090 and the Access to ‘Browser’. On the Dashboards tab you can import some prebuilt Prometheus dashboards to get started.