commit
6287aa44ab
|
@ -25,6 +25,10 @@
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- LDAP Dependencies -->
|
<!-- LDAP Dependencies -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.baeldung;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
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.WebMvcConfigurerAdapter;
|
||||||
|
|
||||||
|
@ -11,6 +12,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
|
||||||
* class to run up a Jetty Server (on http://localhost:8080)
|
* class to run up a Jetty Server (on http://localhost:8080)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@EnableScheduling
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
@ComponentScan("org.baeldung")
|
@ComponentScan("org.baeldung")
|
||||||
public class SampleLDAPApplication extends WebMvcConfigurerAdapter {
|
public class SampleLDAPApplication extends WebMvcConfigurerAdapter {
|
||||||
|
@ -22,6 +24,7 @@ public class SampleLDAPApplication extends WebMvcConfigurerAdapter {
|
||||||
@Override
|
@Override
|
||||||
public void addViewControllers(ViewControllerRegistry registry) {
|
public void addViewControllers(ViewControllerRegistry registry) {
|
||||||
registry.addViewController("/login").setViewName("login");
|
registry.addViewController("/login").setViewName("login");
|
||||||
|
registry.addViewController("/graph").setViewName("graph");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -7,11 +7,15 @@ import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.baeldung.metric.MetricService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
import org.springframework.security.core.GrantedAuthority;
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Spring Controller Definitions.
|
* Spring Controller Definitions.
|
||||||
|
@ -19,6 +23,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@Controller
|
@Controller
|
||||||
public class MyController {
|
public class MyController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MetricService metricService;
|
||||||
|
|
||||||
@RequestMapping("/")
|
@RequestMapping("/")
|
||||||
public String init(Map<String, Object> model, Principal principal) {
|
public String init(Map<String, Object> model, Principal principal) {
|
||||||
model.put("title", "PUBLIC AREA");
|
model.put("title", "PUBLIC AREA");
|
||||||
|
@ -37,6 +44,12 @@ public class MyController {
|
||||||
return "home";
|
return "home";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/metric-graph-data", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public Object[][] getMetricData() {
|
||||||
|
return metricService.getGraphData();
|
||||||
|
}
|
||||||
|
|
||||||
private String getUserName(Principal principal) {
|
private String getUserName(Principal principal) {
|
||||||
if (principal == null) {
|
if (principal == null) {
|
||||||
return "anonymous";
|
return "anonymous";
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
package org.baeldung.metric;
|
||||||
|
|
||||||
|
import javax.servlet.Filter;
|
||||||
|
import javax.servlet.FilterChain;
|
||||||
|
import javax.servlet.FilterConfig;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
import javax.servlet.ServletResponse;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class MetricFilter implements Filter {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MetricService metricService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(final FilterConfig config) throws ServletException {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws java.io.IOException, ServletException {
|
||||||
|
chain.doFilter(request, response);
|
||||||
|
|
||||||
|
final int status = ((HttpServletResponse) response).getStatus();
|
||||||
|
metricService.increaseCount(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
package org.baeldung.metric;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
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.MetricRepository;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class MetricService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MetricRepository repo;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CounterService counter;
|
||||||
|
|
||||||
|
private ArrayList<ArrayList<Integer>> statusMetric;
|
||||||
|
private List<String> statusList;
|
||||||
|
|
||||||
|
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
|
public MetricService() {
|
||||||
|
super();
|
||||||
|
statusMetric = new ArrayList<ArrayList<Integer>>();
|
||||||
|
statusList = new ArrayList<String>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void increaseCount(final int status) {
|
||||||
|
counter.increment("status." + status);
|
||||||
|
if (!statusList.contains("counter.status." + status)) {
|
||||||
|
statusList.add("counter.status." + status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Scheduled(fixedDelay = 60000)
|
||||||
|
private void exportMetrics() {
|
||||||
|
Metric<?> metric;
|
||||||
|
ArrayList<Integer> statusCount = new ArrayList<Integer>();
|
||||||
|
for (String status : statusList) {
|
||||||
|
metric = repo.findOne(status);
|
||||||
|
if (metric != null) {
|
||||||
|
statusCount.add(metric.getValue().intValue());
|
||||||
|
repo.reset(status);
|
||||||
|
} else {
|
||||||
|
statusCount.add(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
statusMetric.add(statusCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[][] getGraphData() {
|
||||||
|
Date current = new Date();
|
||||||
|
int colCount = statusList.size() + 1;
|
||||||
|
int rowCount = statusMetric.size() + 1;
|
||||||
|
|
||||||
|
Object[][] result = new Object[rowCount][colCount];
|
||||||
|
result[0][0] = "Time";
|
||||||
|
|
||||||
|
int j = 1;
|
||||||
|
for (final String status : statusList) {
|
||||||
|
result[0][j] = status;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<Integer> temp;
|
||||||
|
for (int i = 1; i < rowCount; i++) {
|
||||||
|
temp = statusMetric.get(i - 1);
|
||||||
|
result[i][0] = dateFormat.format(new Date(current.getTime() - (60000 * (rowCount - i))));
|
||||||
|
for (j = 1; j <= temp.size(); j++) {
|
||||||
|
result[i][j] = temp.get(j - 1);
|
||||||
|
}
|
||||||
|
while (j < colCount) {
|
||||||
|
result[i][j] = 0;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Metric Graph</title>
|
||||||
|
<script
|
||||||
|
src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
google.load("visualization", "1", {
|
||||||
|
packages : [ "corechart" ]
|
||||||
|
});
|
||||||
|
|
||||||
|
function drawChart() {
|
||||||
|
$.get("http://localhost:8080/metric-graph-data",
|
||||||
|
function(mydata) {
|
||||||
|
|
||||||
|
var data = google.visualization.arrayToDataTable(mydata);
|
||||||
|
var options = {
|
||||||
|
title : 'Website Metric',
|
||||||
|
hAxis : {
|
||||||
|
title : 'Time',
|
||||||
|
titleTextStyle : {
|
||||||
|
color : '#333'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
vAxis : {
|
||||||
|
minValue : 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var chart = new google.visualization.AreaChart(document
|
||||||
|
.getElementById('chart_div'));
|
||||||
|
chart.draw(data, options);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body onload="drawChart()">
|
||||||
|
<div id="chart_div" style="width: 900px; height: 500px;"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -9,13 +9,15 @@ import javax.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.springframework.web.context.support.WebApplicationContextUtils;
|
||||||
|
|
||||||
public class MetricFilter implements Filter {
|
public class MetricFilter implements Filter {
|
||||||
|
|
||||||
private MetricService metricService;
|
private MetricService metricService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(final FilterConfig config) throws ServletException {
|
public void init(final FilterConfig config) throws ServletException {
|
||||||
metricService = new MetricService();
|
metricService = (MetricService) WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()).getBean("metricService");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -11,13 +11,16 @@ import org.springframework.stereotype.Service;
|
||||||
@Service
|
@Service
|
||||||
public class MetricService {
|
public class MetricService {
|
||||||
|
|
||||||
private static HashMap<String, HashMap<Integer, Integer>> metricMap = new HashMap<String, HashMap<Integer, Integer>>();
|
private HashMap<String, HashMap<Integer, Integer>> metricMap;
|
||||||
private static HashMap<Integer, Integer> statusMetric = new HashMap<Integer, Integer>();
|
private HashMap<Integer, Integer> statusMetric;
|
||||||
private static HashMap<String, HashMap<Integer, Integer>> timeMap = new HashMap<String, HashMap<Integer, Integer>>();
|
private HashMap<String, HashMap<Integer, Integer>> timeMap;
|
||||||
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
public MetricService() {
|
public MetricService() {
|
||||||
super();
|
super();
|
||||||
|
metricMap = new HashMap<String, HashMap<Integer, Integer>>();
|
||||||
|
statusMetric = new HashMap<Integer, Integer>();
|
||||||
|
timeMap = new HashMap<String, HashMap<Integer, Integer>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void increaseCount(final String request, final int status) {
|
public void increaseCount(final String request, final int status) {
|
||||||
|
|
Loading…
Reference in New Issue