From 05eca30beda138f644f2b7ddf07e8bc6023ed533 Mon Sep 17 00:00:00 2001 From: Omur Date: Tue, 17 Jun 2025 11:32:41 +0200 Subject: [PATCH] spring-actuator-demo starter --- .../original/spring-actuator-demo/Readme.md | 35 +++++++++ .../original/spring-actuator-demo/pom.xml | 72 +++++++++++++++++++ .../actuatordemo/ActuatorDemoApplication.java | 12 ++++ .../config/ActuatorSecurityConfig.java | 42 +++++++++++ .../controller/SampleController.java | 29 ++++++++ .../health/CustomHealthIndicator.java | 19 +++++ .../src/main/resources/application.properties | 23 ++++++ .../src/main/resources/prometheus.yml | 28 ++++++++ .../ActuatorDemoApplicationTests.java | 16 +++++ 9 files changed, 276 insertions(+) create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/Readme.md create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/pom.xml create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/ActuatorDemoApplication.java create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/config/ActuatorSecurityConfig.java create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/controller/SampleController.java create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/health/CustomHealthIndicator.java create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/application.properties create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/prometheus.yml create mode 100644 jdk_8_maven/cs/rest/original/spring-actuator-demo/src/test/java/com/example/actuatordemo/ActuatorDemoApplicationTests.java diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/Readme.md b/jdk_8_maven/cs/rest/original/spring-actuator-demo/Readme.md new file mode 100644 index 000000000..284d10dd4 --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/Readme.md @@ -0,0 +1,35 @@ +# Spring Boot Actuator: Health Check, Auditing, Metrics Gathering and Monitoring + +## Tutorials + +1. [Spring Boot Actuator: Health check, Auditing, Metrics gathering and Monitoring](https://www.callicoder.com/spring-boot-actuator/) +2. [Spring Boot Actuator metrics monitoring with Prometheus and Grafana](https://www.callicoder.com/spring-boot-actuator-metrics-monitoring-dashboard-prometheus-grafana/) + +## Steps to Setup + +**1. Clone the application** + +```bash +git clone https://github.com/callicoder/spring-boot-actuator-demo.git +``` + +**2. Build and run the app using maven** + +```bash +mvn package +java -jar target/actuator-demo-0.0.1-SNAPSHOT.jar +``` + +Alternatively, you can run the app directly without packaging like this - + +```bash +mvn spring-boot:run +``` + +The app will start running at . + +## Explore Actuator Endpoints + +All the actuator endpoints will be available at . + +Some of the actuator endpoints are protected with Spring Security's HTTP Basic Authentication. You can use the username `actuator` and password `actuator` for http basic authentication. \ No newline at end of file diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/pom.xml b/jdk_8_maven/cs/rest/original/spring-actuator-demo/pom.xml new file mode 100644 index 000000000..afc8947a2 --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + com.example + actuator-demo + 0.0.1-SNAPSHOT + jar + + actuator-demo + Spring Boot Actuator Demo Project + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-web + + + + + io.micrometer + micrometer-registry-prometheus + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/ActuatorDemoApplication.java b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/ActuatorDemoApplication.java new file mode 100644 index 000000000..2938cab37 --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/ActuatorDemoApplication.java @@ -0,0 +1,12 @@ +package com.example.actuatordemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ActuatorDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(ActuatorDemoApplication.class, args); + } +} diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/config/ActuatorSecurityConfig.java b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/config/ActuatorSecurityConfig.java new file mode 100644 index 000000000..aa50666f5 --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/config/ActuatorSecurityConfig.java @@ -0,0 +1,42 @@ +package com.example.actuatordemo.config; + +import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; +import org.springframework.boot.actuate.context.ShutdownEndpoint; +import org.springframework.boot.autoconfigure.security.servlet.PathRequest; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter { + + /* + This spring security configuration does the following + + 1. Restrict access to the Shutdown endpoint to the ACTUATOR_ADMIN role. + 2. Allow access to all other actuator endpoints. + 3. Allow access to static resources. + 4. Allow access to the home page (/). + 5. All other requests need to be authenticated. + 5. Enable http basic authentication to make the configuration complete. + You are free to use any other form of authentication. + */ + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .requestMatchers(EndpointRequest.to(ShutdownEndpoint.class)) + .hasRole("ACTUATOR_ADMIN") + .requestMatchers(EndpointRequest.toAnyEndpoint()) + .permitAll() + .requestMatchers(PathRequest.toStaticResources().atCommonLocations()) + .permitAll() + .antMatchers("/", "/slowApi") + .permitAll() + .antMatchers("/**") + .authenticated() + .and() + .httpBasic(); + } +} diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/controller/SampleController.java b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/controller/SampleController.java new file mode 100644 index 000000000..729c17874 --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/controller/SampleController.java @@ -0,0 +1,29 @@ +package com.example.actuatordemo.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@RestController +public class SampleController { + + @GetMapping("/") + public String sayHello(@RequestParam(value = "name", defaultValue = "Guest") String name) { + return "Hello " + name + "!!"; + } + + @GetMapping("/slowApi") + public String timeConsumingAPI(@RequestParam(value = "delay", defaultValue = "0") Integer delay) throws InterruptedException { + if(delay == 0) { + Random random = new Random(); + delay = random.nextInt(10); + } + + TimeUnit.SECONDS.sleep(delay); + return "Result"; + } + +} diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/health/CustomHealthIndicator.java b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/health/CustomHealthIndicator.java new file mode 100644 index 000000000..dda4e97bd --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/java/com/example/actuatordemo/health/CustomHealthIndicator.java @@ -0,0 +1,19 @@ +package com.example.actuatordemo.health; + +import org.springframework.boot.actuate.health.AbstractHealthIndicator; +import org.springframework.boot.actuate.health.Health; +import org.springframework.stereotype.Component; + +@Component +public class CustomHealthIndicator extends AbstractHealthIndicator { + + @Override + protected void doHealthCheck(Health.Builder builder) throws Exception { + // Use the builder to build the health status details that should be reported. + // If you throw an exception, the status will be DOWN with the exception message. + + builder.up() + .withDetail("app", "Alive and Kicking") + .withDetail("error", "Nothing! I'm good."); + } +} \ No newline at end of file diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/application.properties b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/application.properties new file mode 100644 index 000000000..59bca2b36 --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/application.properties @@ -0,0 +1,23 @@ +# Logging +logging.file=app.log + +# Spring Security default user name and password +spring.security.user.name=actuator +spring.security.user.password=actuator +spring.security.user.roles=ACTUATOR_ADMIN + +# INFO ENDPOINT CONFIGURATION +info.app.name=@project.name@ +info.app.description=@project.description@ +info.app.version=@project.version@ +info.app.encoding=@project.build.sourceEncoding@ +info.app.java.version=@java.version@ + +# SHUTDOWN ENDPOINT (ShutdownEndpoint) +management.endpoint.shutdown.enabled=true + +# HEALTH ENDPOINT +management.endpoint.health.show-details=always + +# ENDPOINTS WEB CONFIGURATION +management.endpoints.web.exposure.include=* \ No newline at end of file diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/prometheus.yml b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/prometheus.yml new file mode 100644 index 000000000..2e82c40ed --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/main/resources/prometheus.yml @@ -0,0 +1,28 @@ +# my global config +global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + +# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. +rule_files: + # - "first_rules.yml" + # - "second_rules.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + - job_name: 'prometheus' + + # metrics_path defaults to '/metrics' + # scheme defaults to 'http'. + + static_configs: + - targets: ['127.0.0.1:9090'] + + - job_name: 'spring-actuator' + metrics_path: '/actuator/prometheus' + scrape_interval: 5s + static_configs: + - targets: ['HOST_IP:8080'] diff --git a/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/test/java/com/example/actuatordemo/ActuatorDemoApplicationTests.java b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/test/java/com/example/actuatordemo/ActuatorDemoApplicationTests.java new file mode 100644 index 000000000..9f50111da --- /dev/null +++ b/jdk_8_maven/cs/rest/original/spring-actuator-demo/src/test/java/com/example/actuatordemo/ActuatorDemoApplicationTests.java @@ -0,0 +1,16 @@ +package com.example.actuatordemo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ActuatorDemoApplicationTests { + + @Test + public void contextLoads() { + } + +}