[BAEL-13458] - Update Spring REST Metrics article, spring boot 2, micrometer implementation
This commit is contained in:
parent
37a5061c9d
commit
3b05e26abf
|
@ -8,10 +8,10 @@
|
||||||
<packaging>war</packaging>
|
<packaging>war</packaging>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-boot-1</artifactId>
|
<artifactId>parent-boot-2</artifactId>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<relativePath>../parent-boot-1</relativePath>
|
<relativePath>../parent-boot-2</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@ -129,6 +129,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.javassist</groupId>
|
<groupId>org.javassist</groupId>
|
||||||
<artifactId>javassist</artifactId>
|
<artifactId>javassist</artifactId>
|
||||||
|
<version>${javassist.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>mysql</groupId>
|
<groupId>mysql</groupId>
|
||||||
|
@ -287,6 +288,7 @@
|
||||||
<!-- util -->
|
<!-- util -->
|
||||||
<guava.version>19.0</guava.version>
|
<guava.version>19.0</guava.version>
|
||||||
<commons-lang3.version>3.5</commons-lang3.version>
|
<commons-lang3.version>3.5</commons-lang3.version>
|
||||||
|
<javassist.version>3.25.0-GA</javassist.version>
|
||||||
|
|
||||||
<!-- Maven plugins -->
|
<!-- Maven plugins -->
|
||||||
<cargo-maven2-plugin.version>1.6.1</cargo-maven2-plugin.version>
|
<cargo-maven2-plugin.version>1.6.1</cargo-maven2-plugin.version>
|
||||||
|
|
|
@ -17,7 +17,7 @@ public abstract class AbstractService<T extends Serializable> implements IOperat
|
||||||
@Override
|
@Override
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public T findOne(final long id) {
|
public T findOne(final long id) {
|
||||||
return getDao().findOne(id);
|
return getDao().findById(id).orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// read - all
|
// read - all
|
||||||
|
|
|
@ -7,7 +7,7 @@ import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
import org.springframework.boot.web.support.SpringBootServletInitializer;
|
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
import org.springframework.web.context.request.RequestContextListener;
|
import org.springframework.web.context.request.RequestContextListener;
|
||||||
|
|
|
@ -6,13 +6,13 @@ import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.web.servlet.ViewResolver;
|
import org.springframework.web.servlet.ViewResolver;
|
||||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||||
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
import org.springframework.web.servlet.view.InternalResourceViewResolver;
|
import org.springframework.web.servlet.view.InternalResourceViewResolver;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ComponentScan("org.baeldung.web")
|
@ComponentScan("org.baeldung.web")
|
||||||
@EnableWebMvc
|
@EnableWebMvc
|
||||||
public class WebConfig extends WebMvcConfigurerAdapter {
|
public class WebConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
public WebConfig() {
|
public WebConfig() {
|
||||||
super();
|
super();
|
||||||
|
@ -29,7 +29,6 @@ public class WebConfig extends WebMvcConfigurerAdapter {
|
||||||
// API
|
// API
|
||||||
@Override
|
@Override
|
||||||
public void addViewControllers(final ViewControllerRegistry registry) {
|
public void addViewControllers(final ViewControllerRegistry registry) {
|
||||||
super.addViewControllers(registry);
|
|
||||||
registry.addViewController("/graph.html");
|
registry.addViewController("/graph.html");
|
||||||
registry.addViewController("/homepage.html");
|
registry.addViewController("/homepage.html");
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,16 +6,18 @@ import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics;
|
|
||||||
import org.springframework.boot.actuate.metrics.Metric;
|
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.Counter;
|
||||||
|
import io.micrometer.core.instrument.Meter;
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class ActuatorMetricService implements IActuatorMetricService {
|
public class ActuatorMetricService implements IActuatorMetricService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MetricReaderPublicMetrics publicMetrics;
|
private MeterRegistry publicMetrics;
|
||||||
|
|
||||||
private final List<ArrayList<Integer>> statusMetricsByMinute;
|
private final List<ArrayList<Integer>> statusMetricsByMinute;
|
||||||
private final List<String> statusList;
|
private final List<String> statusList;
|
||||||
|
@ -68,7 +70,7 @@ public class ActuatorMetricService implements IActuatorMetricService {
|
||||||
private void exportMetrics() {
|
private void exportMetrics() {
|
||||||
final ArrayList<Integer> lastMinuteStatuses = initializeStatuses(statusList.size());
|
final ArrayList<Integer> lastMinuteStatuses = initializeStatuses(statusList.size());
|
||||||
|
|
||||||
for (final Metric<?> counterMetric : publicMetrics.metrics()) {
|
for (final Meter counterMetric : publicMetrics.getMeters()) {
|
||||||
updateMetrics(counterMetric, lastMinuteStatuses);
|
updateMetrics(counterMetric, lastMinuteStatuses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,17 +85,17 @@ public class ActuatorMetricService implements IActuatorMetricService {
|
||||||
return counterList;
|
return counterList;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateMetrics(final Metric<?> counterMetric, final ArrayList<Integer> statusCount) {
|
private void updateMetrics(final Meter counterMetric, final ArrayList<Integer> statusCount) {
|
||||||
String status = "";
|
String status = "";
|
||||||
int index = -1;
|
int index = -1;
|
||||||
int oldCount = 0;
|
int oldCount = 0;
|
||||||
|
|
||||||
if (counterMetric.getName().contains("counter.status.")) {
|
if (counterMetric.getId().getName().contains("counter.status.")) {
|
||||||
status = counterMetric.getName().substring(15, 18); // example 404, 200
|
status = counterMetric.getId().getName().substring(15, 18); // example 404, 200
|
||||||
appendStatusIfNotExist(status, statusCount);
|
appendStatusIfNotExist(status, statusCount);
|
||||||
index = statusList.indexOf(status);
|
index = statusList.indexOf(status);
|
||||||
oldCount = statusCount.get(index) == null ? 0 : statusCount.get(index);
|
oldCount = statusCount.get(index) == null ? 0 : statusCount.get(index);
|
||||||
statusCount.set(index, counterMetric.getValue().intValue() + oldCount);
|
statusCount.set(index, (int)((Counter) counterMetric).count() + oldCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,20 +6,18 @@ import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.actuate.metrics.CounterService;
|
|
||||||
import org.springframework.boot.actuate.metrics.Metric;
|
|
||||||
import org.springframework.boot.actuate.metrics.repository.InMemoryMetricRepository;
|
|
||||||
import org.springframework.boot.actuate.metrics.repository.MetricRepository;
|
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.Counter;
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
|
import io.micrometer.core.instrument.search.Search;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class CustomActuatorMetricService implements ICustomActuatorMetricService {
|
public class CustomActuatorMetricService implements ICustomActuatorMetricService {
|
||||||
|
|
||||||
private MetricRepository repo;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CounterService counter;
|
private MeterRegistry registry;
|
||||||
|
|
||||||
private final List<ArrayList<Integer>> statusMetricsByMinute;
|
private final List<ArrayList<Integer>> statusMetricsByMinute;
|
||||||
private final List<String> statusList;
|
private final List<String> statusList;
|
||||||
|
@ -27,7 +25,6 @@ public class CustomActuatorMetricService implements ICustomActuatorMetricService
|
||||||
|
|
||||||
public CustomActuatorMetricService() {
|
public CustomActuatorMetricService() {
|
||||||
super();
|
super();
|
||||||
repo = new InMemoryMetricRepository();
|
|
||||||
statusMetricsByMinute = new ArrayList<ArrayList<Integer>>();
|
statusMetricsByMinute = new ArrayList<ArrayList<Integer>>();
|
||||||
statusList = new ArrayList<String>();
|
statusList = new ArrayList<String>();
|
||||||
}
|
}
|
||||||
|
@ -36,9 +33,10 @@ public class CustomActuatorMetricService implements ICustomActuatorMetricService
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void increaseCount(final int status) {
|
public void increaseCount(final int status) {
|
||||||
counter.increment("status." + status);
|
String counterName = "counter.status." + status;
|
||||||
if (!statusList.contains("counter.status." + status)) {
|
registry.counter(counterName).increment(1);
|
||||||
statusList.add("counter.status." + status);
|
if (!statusList.contains(counterName)) {
|
||||||
|
statusList.add(counterName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,17 +76,16 @@ public class CustomActuatorMetricService implements ICustomActuatorMetricService
|
||||||
|
|
||||||
@Scheduled(fixedDelay = 60000)
|
@Scheduled(fixedDelay = 60000)
|
||||||
private void exportMetrics() {
|
private void exportMetrics() {
|
||||||
Metric<?> metric;
|
|
||||||
final ArrayList<Integer> statusCount = new ArrayList<Integer>();
|
final ArrayList<Integer> statusCount = new ArrayList<Integer>();
|
||||||
for (final String status : statusList) {
|
for (final String status : statusList) {
|
||||||
metric = repo.findOne(status);
|
Search search = registry.find(status);
|
||||||
if (metric != null) {
|
if (search != null) {
|
||||||
statusCount.add(metric.getValue().intValue());
|
Counter counter = search.counter();
|
||||||
repo.reset(status);
|
statusCount.add(counter != null ? ((int) counter.count()) : 0);
|
||||||
|
registry.remove(counter);
|
||||||
} else {
|
} else {
|
||||||
statusCount.add(0);
|
statusCount.add(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
statusMetricsByMinute.add(statusCount);
|
statusMetricsByMinute.add(statusCount);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
server.port=8082
|
server.port=8082
|
||||||
server.context-path=/spring-rest-full
|
server.servlet.context-path=/spring-rest-full
|
||||||
endpoints.metrics.enabled=true
|
endpoints.metrics.enabled=true
|
Loading…
Reference in New Issue