Skip to content

Commit ea4f53b

Browse files
committed
Stats calculation tiny refactoring
1 parent 92831da commit ea4f53b

File tree

13 files changed

+139
-127
lines changed

13 files changed

+139
-127
lines changed

proxy/src/main/java/ru/qatools/gridrouter/ProxyServlet.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.springframework.beans.factory.annotation.Autowired;
99
import ru.qatools.gridrouter.json.JsonMessage;
1010
import ru.qatools.gridrouter.json.JsonMessageFactory;
11-
import ru.qatools.gridrouter.sessions.SessionStorage;
11+
import ru.qatools.gridrouter.sessions.StatsCounter;
1212

1313
import javax.servlet.ServletConfig;
1414
import javax.servlet.ServletException;
@@ -42,10 +42,10 @@ public class ProxyServlet extends org.eclipse.jetty.proxy.ProxyServlet {
4242
private static final Logger LOGGER = LoggerFactory.getLogger(ProxyServlet.class);
4343

4444
@Autowired
45-
private ConfigRepository config;
45+
private transient ConfigRepository config;
4646

4747
@Autowired
48-
private SessionStorage sessionStorage;
48+
private transient StatsCounter statsCounter;
4949

5050
@Override
5151
public void init(ServletConfig config) throws ServletException {
@@ -87,9 +87,9 @@ protected String rewriteTarget(HttpServletRequest request) {
8787

8888
if (isSessionDeleteRequest(request, command)) {
8989
LOGGER.info("[SESSION_DELETED] [{}] [{}] [{}]", remoteHost, route, command);
90-
sessionStorage.remove(getFullSessionId(uri));
90+
statsCounter.deleteSession(getFullSessionId(uri));
9191
} else {
92-
sessionStorage.update(getFullSessionId(uri));
92+
statsCounter.updateSession(getFullSessionId(uri));
9393
}
9494

9595
try {

proxy/src/main/java/ru/qatools/gridrouter/QuotaServlet.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
import org.apache.commons.io.IOUtils;
44
import org.springframework.beans.factory.annotation.Autowired;
55

6-
import javax.servlet.ServletConfig;
76
import javax.servlet.ServletException;
87
import javax.servlet.annotation.HttpConstraint;
98
import javax.servlet.annotation.ServletSecurity;
109
import javax.servlet.annotation.WebServlet;
11-
import javax.servlet.http.HttpServlet;
1210
import javax.servlet.http.HttpServletRequest;
1311
import javax.servlet.http.HttpServletResponse;
1412
import java.io.IOException;
@@ -17,24 +15,17 @@
1715
import static java.nio.charset.StandardCharsets.UTF_8;
1816
import static javax.servlet.http.HttpServletResponse.SC_OK;
1917
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
20-
import static org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext;
2118
import static ru.qatools.gridrouter.json.JsonFormatter.toJson;
2219

2320
/**
2421
* @author Innokenty Shuvalov [email protected]
2522
*/
2623
@WebServlet(urlPatterns = {"/quota"}, asyncSupported = true)
2724
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"user"}))
28-
public class QuotaServlet extends HttpServlet {
25+
public class QuotaServlet extends SpringHttpServlet {
2926

3027
@Autowired
31-
private ConfigRepository config;
32-
33-
@Override
34-
public void init(ServletConfig config) throws ServletException {
35-
super.init(config);
36-
processInjectionBasedOnServletContext(this, config.getServletContext());
37-
}
28+
private transient ConfigRepository config;
3829

3930
@Override
4031
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

proxy/src/main/java/ru/qatools/gridrouter/RouteServlet.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@
2020
import ru.qatools.gridrouter.json.JsonCapabilities;
2121
import ru.qatools.gridrouter.json.JsonMessage;
2222
import ru.qatools.gridrouter.json.JsonMessageFactory;
23-
import ru.qatools.gridrouter.sessions.SessionStorage;
23+
import ru.qatools.gridrouter.sessions.StatsCounter;
2424

25-
import javax.servlet.ServletConfig;
2625
import javax.servlet.ServletException;
2726
import javax.servlet.annotation.HttpConstraint;
2827
import javax.servlet.annotation.ServletSecurity;
2928
import javax.servlet.annotation.WebServlet;
30-
import javax.servlet.http.HttpServlet;
3129
import javax.servlet.http.HttpServletRequest;
3230
import javax.servlet.http.HttpServletResponse;
3331
import java.io.IOException;
@@ -42,7 +40,6 @@
4240
import static javax.servlet.http.HttpServletResponse.SC_OK;
4341
import static org.apache.http.HttpHeaders.ACCEPT;
4442
import static org.apache.http.entity.ContentType.APPLICATION_JSON;
45-
import static org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext;
4643
import static ru.qatools.gridrouter.RequestUtils.getRemoteHost;
4744

4845
/**
@@ -53,27 +50,21 @@
5350
*/
5451
@WebServlet(urlPatterns = {"/wd/hub/session"}, asyncSupported = true)
5552
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"user"}))
56-
public class RouteServlet extends HttpServlet {
53+
public class RouteServlet extends SpringHttpServlet {
5754

5855
private static final Logger LOGGER = LoggerFactory.getLogger(RouteServlet.class);
5956

6057
@Autowired
61-
private ConfigRepository config;
58+
private transient ConfigRepository config;
6259

6360
@Autowired
64-
private HostSelectionStrategy hostSelectionStrategy;
61+
private transient HostSelectionStrategy hostSelectionStrategy;
6562

6663
@Autowired
67-
private SessionStorage sessionStorage;
64+
private transient StatsCounter statsCounter;
6865

6966
@Autowired
70-
private CapabilityProcessorFactory capabilityProcessorFactory;
71-
72-
@Override
73-
public void init(ServletConfig config) throws ServletException {
74-
super.init(config);
75-
processInjectionBasedOnServletContext(this, config.getServletContext());
76-
}
67+
private transient CapabilityProcessorFactory capabilityProcessorFactory;
7768

7869
@Override
7970
protected void doPost(HttpServletRequest request, HttpServletResponse response)
@@ -125,7 +116,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
125116
replyWithOk(hubMessage, response);
126117
LOGGER.info("[SESSION_CREATED] [{}] [{}] [{}] [{}] [{}] [{}]",
127118
user, remoteHost, browser, route, sessionId, attempt);
128-
sessionStorage.put(hubMessage.getSessionId(), user, browser, actualVersion.getNumber());
119+
statsCounter.startSession(hubMessage.getSessionId(), user, browser, actualVersion.getNumber());
129120
return;
130121
}
131122
LOGGER.warn("[SESSION_FAILED] [{}] [{}] [{}] [{}] - {}",

proxy/src/main/java/ru/qatools/gridrouter/SessionStorageEvictionScheduler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.springframework.context.annotation.Configuration;
66
import org.springframework.scheduling.annotation.EnableScheduling;
77
import org.springframework.scheduling.annotation.Scheduled;
8-
import ru.qatools.gridrouter.sessions.SessionStorage;
8+
import ru.qatools.gridrouter.sessions.StatsCounter;
99

1010
import java.time.Duration;
1111

@@ -20,10 +20,10 @@ public class SessionStorageEvictionScheduler {
2020
private int timeout;
2121

2222
@Autowired
23-
private SessionStorage sessionStorage;
23+
private StatsCounter statsCounter;
2424

2525
@Scheduled(cron = "${grid.router.evict.sessions.cron}")
2626
public void expireOldSessions() {
27-
sessionStorage.expireSessionsOlderThan(Duration.ofSeconds(timeout));
27+
statsCounter.expireSessionsOlderThan(Duration.ofSeconds(timeout));
2828
}
2929
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package ru.qatools.gridrouter;
2+
3+
import javax.servlet.ServletConfig;
4+
import javax.servlet.ServletException;
5+
import javax.servlet.http.HttpServlet;
6+
7+
import static org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext;
8+
9+
/**
10+
* @author Ilya Sadykov
11+
*/
12+
public abstract class SpringHttpServlet extends HttpServlet {
13+
@Override
14+
public void init(ServletConfig config) throws ServletException {
15+
super.init(config);
16+
processInjectionBasedOnServletContext(this, config.getServletContext());
17+
}
18+
}

proxy/src/main/java/ru/qatools/gridrouter/StatsServlet.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@
33
import org.apache.commons.io.IOUtils;
44
import org.springframework.beans.factory.annotation.Autowired;
55
import ru.qatools.gridrouter.json.JsonFormatter;
6-
import ru.qatools.gridrouter.sessions.SessionStorage;
6+
import ru.qatools.gridrouter.sessions.StatsCounter;
77

8-
import javax.servlet.ServletConfig;
98
import javax.servlet.ServletException;
109
import javax.servlet.annotation.HttpConstraint;
1110
import javax.servlet.annotation.ServletSecurity;
1211
import javax.servlet.annotation.WebServlet;
13-
import javax.servlet.http.HttpServlet;
1412
import javax.servlet.http.HttpServletRequest;
1513
import javax.servlet.http.HttpServletResponse;
1614
import java.io.IOException;
@@ -19,23 +17,16 @@
1917
import static java.nio.charset.StandardCharsets.UTF_8;
2018
import static javax.servlet.http.HttpServletResponse.SC_OK;
2119
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
22-
import static org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext;
2320

2421
/**
2522
* @author Dmitry Baev [email protected]
2623
*/
2724
@WebServlet(urlPatterns = {"/stats"}, asyncSupported = true)
2825
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"user"}))
29-
public class StatsServlet extends HttpServlet {
26+
public class StatsServlet extends SpringHttpServlet {
3027

3128
@Autowired
32-
private SessionStorage sessionStorage;
33-
34-
@Override
35-
public void init(ServletConfig config) throws ServletException {
36-
super.init(config);
37-
processInjectionBasedOnServletContext(this, config.getServletContext());
38-
}
29+
private transient StatsCounter statsCounter;
3930

4031
@Override
4132
protected void doGet(HttpServletRequest request, HttpServletResponse response)
@@ -44,7 +35,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
4435
response.setContentType(APPLICATION_JSON_VALUE);
4536
try (OutputStream output = response.getOutputStream()) {
4637
IOUtils.write(JsonFormatter.toJson(
47-
sessionStorage.getBrowsersCountFor(request.getRemoteUser())
38+
statsCounter.getStats(request.getRemoteUser())
4839
), output, UTF_8);
4940
}
5041
}

proxy/src/main/java/ru/qatools/gridrouter/sessions/BrowsersCountMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/**
88
* @author Innokenty Shuvalov [email protected]
99
*/
10-
public class BrowsersCountMap extends HashMap<String, Map<String, Integer>> {
10+
public class BrowsersCountMap extends HashMap<String, Map<String, Integer>> implements GridRouterUserStats {
1111

1212
public void increment(String browser, String version) {
1313
putIfAbsent(browser, new HashMap<>());
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ru.qatools.gridrouter.sessions;
2+
3+
import java.io.Serializable;
4+
5+
/**
6+
* @author Ilya Sadykov
7+
*/
8+
public interface GridRouterUserStats extends Serializable {
9+
}

proxy/src/main/java/ru/qatools/gridrouter/sessions/MemorySessionStorage.java renamed to proxy/src/main/java/ru/qatools/gridrouter/sessions/MemoryStatsCounter.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,23 @@
55
import java.util.HashMap;
66
import java.util.List;
77
import java.util.Map;
8+
import java.util.Set;
89

910
import static java.time.ZonedDateTime.now;
1011
import static java.util.stream.Collectors.toList;
1112

1213
/**
1314
* @author Innokenty Shuvalov [email protected]
1415
*/
15-
public class MemorySessionStorage implements SessionStorage {
16+
public class MemoryStatsCounter implements StatsCounter {
1617

1718
private final Map<String, Temporal> session2instant = new HashMap<>();
1819
private final Map<String, String> session2user = new HashMap<>();
1920
private final Map<String, BrowserVersion> session2browserVersion = new HashMap<>();
2021
private final Map<String, BrowsersCountMap> user2browserCount = new HashMap<>();
2122

2223
@Override
23-
public synchronized void put(String sessionId, String user, String browser, String version) {
24+
public synchronized void startSession(String sessionId, String user, String browser, String version) {
2425
if (session2instant.put(sessionId, now()) == null) {
2526
session2user.put(sessionId, user);
2627
session2browserVersion.put(sessionId, new BrowserVersion(browser, version));
@@ -30,12 +31,12 @@ public synchronized void put(String sessionId, String user, String browser, Stri
3031
}
3132

3233
@Override
33-
public void update(String sessionId) {
34+
public void updateSession(String sessionId) {
3435
session2instant.replace(sessionId, now());
3536
}
3637

3738
@Override
38-
public synchronized void remove(String sessionId) {
39+
public synchronized void deleteSession(String sessionId) {
3940
if (session2instant.remove(sessionId) != null) {
4041
String user = session2user.remove(sessionId);
4142
BrowserVersion browser = session2browserVersion.remove(sessionId);
@@ -44,17 +45,21 @@ public synchronized void remove(String sessionId) {
4445
}
4546

4647
@Override
47-
public synchronized List<String> expireSessionsOlderThan(Duration duration) {
48+
public void expireSessionsOlderThan(Duration duration) {
4849
List<String> sessions2delete = session2instant.entrySet().stream()
4950
.filter(e -> duration.compareTo(Duration.between(e.getValue(), now())) < 0)
5051
.map(Map.Entry::getKey)
5152
.collect(toList());
52-
sessions2delete.stream().forEach(this::remove);
53-
return sessions2delete;
53+
sessions2delete.stream().forEach(this::deleteSession);
5454
}
5555

5656
@Override
57-
public synchronized BrowsersCountMap getBrowsersCountFor(String user) {
57+
public Set<String> getActiveSessions() {
58+
return session2instant.keySet();
59+
}
60+
61+
@Override
62+
public synchronized BrowsersCountMap getStats(String user) {
5863
return user2browserCount.getOrDefault(user, new BrowsersCountMap());
5964
}
6065
}

proxy/src/main/java/ru/qatools/gridrouter/sessions/SessionStorage.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)