Skip to content

Commit 6cb77de

Browse files
committed
Merge pull request #20 from smecsia/stats
Sessions stats calculation
2 parents 0cf393a + b4592a8 commit 6cb77de

30 files changed

+650
-273
lines changed

config/src/main/java/ru/qatools/gridrouter/config/WithHosts.java

-22
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
package ru.qatools.gridrouter.config;
22

33
import java.util.HashMap;
4+
import java.util.List;
45
import java.util.Map;
56

67
/**
78
* @author Dmitry Baev charlie@yandex-team.ru
89
* @author Innokenty Shuvalov innokenty@yandex-team.ru
910
*/
10-
public interface WithRoutesMap extends WithHosts {
11+
public interface WithRoutesMap {
12+
13+
List<Browser> getBrowsers();
1114

1215
default Map<String, String> getRoutesMap() {
13-
Map<String, String> routes = new HashMap<>();
14-
getHosts().forEach(h -> routes.put(h.getRouteId(), h.getRoute()));
16+
HashMap<String, String> routes = new HashMap<>();
17+
getBrowsers().stream()
18+
.flatMap(b -> b.getVersions().stream())
19+
.flatMap(v -> v.getRegions().stream())
20+
.flatMap(r -> r.getHosts().stream())
21+
.forEach(h -> routes.put(h.getRouteId(), h.getRoute()));
1522
return routes;
1623
}
1724
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ public Map<String, Browsers> getQuotaMap() {
7676
return userBrowsers;
7777
}
7878

79-
public Map<String, String> getRoutes() {
80-
return routes;
79+
public String getRoute(String routeId) {
80+
return routes.get(routeId);
8181
}
8282

8383
public Version findVersion(String user, JsonCapabilities caps) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package ru.qatools.gridrouter;
2+
3+
import org.apache.http.client.utils.URIBuilder;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
7+
import javax.servlet.http.HttpServletRequest;
8+
import java.io.UnsupportedEncodingException;
9+
import java.net.URISyntaxException;
10+
import java.net.URLDecoder;
11+
12+
import static java.nio.charset.StandardCharsets.UTF_8;
13+
import static org.springframework.http.HttpMethod.DELETE;
14+
15+
/**
16+
* @author Alexander Andyashin aandryashin@yandex-team.ru
17+
* @author Innokenty Shuvalov innokenty@yandex-team.ru
18+
* @author Dmitry Baev charlie@yandex-team.ru
19+
* @author Artem Eroshenko eroshenkoam@yandex-team.ru
20+
*/
21+
public final class JsonWireUtils {
22+
23+
private static final Logger LOGGER = LoggerFactory.getLogger(JsonWireUtils.class);
24+
25+
public static final String WD_HUB_SESSION = "/wd/hub/session/";
26+
27+
public static final int SESSION_HASH_LENGTH = 32;
28+
29+
private JsonWireUtils() {
30+
}
31+
32+
public static boolean isUriValid(String uri) {
33+
return uri.length() > getUriPrefixLength();
34+
}
35+
36+
public static boolean isSessionDeleteRequest(HttpServletRequest request, String command) {
37+
return DELETE.name().equalsIgnoreCase(request.getMethod()) && !command.contains("/");
38+
}
39+
40+
public static String getSessionHash(String uri) {
41+
return uri.substring(WD_HUB_SESSION.length(), getUriPrefixLength());
42+
}
43+
44+
public static String getFullSessionId(String uri) {
45+
String tail = uri.substring(WD_HUB_SESSION.length());
46+
int end = tail.indexOf('/');
47+
if (end < 0) {
48+
return tail;
49+
}
50+
return tail.substring(0, end);
51+
}
52+
53+
public static int getUriPrefixLength() {
54+
return WD_HUB_SESSION.length() + SESSION_HASH_LENGTH;
55+
}
56+
57+
public static String redirectionUrl(String host, String command) throws URISyntaxException {
58+
return new URIBuilder(host).setPath(WD_HUB_SESSION + command).build().toString();
59+
}
60+
61+
public static String getCommand(String uri) {
62+
String encodedCommand = uri.substring(getUriPrefixLength());
63+
try {
64+
return URLDecoder.decode(encodedCommand, UTF_8.name());
65+
} catch (UnsupportedEncodingException e) {
66+
LOGGER.error("[UNABLE_TO_DECODE_COMMAND] - could not decode command: {}", encodedCommand, e);
67+
return encodedCommand;
68+
}
69+
}
70+
}

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

+9-50
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package ru.qatools.gridrouter;
22

33
import org.apache.commons.io.IOUtils;
4-
import org.apache.http.client.utils.URIBuilder;
54
import org.eclipse.jetty.client.api.Request;
65
import org.eclipse.jetty.client.util.StringContentProvider;
76
import org.slf4j.Logger;
87
import org.slf4j.LoggerFactory;
98
import org.springframework.beans.factory.annotation.Autowired;
10-
import ru.qatools.gridrouter.json.GridStats;
119
import ru.qatools.gridrouter.json.JsonMessage;
1210
import ru.qatools.gridrouter.json.JsonMessageFactory;
11+
import ru.qatools.gridrouter.sessions.StatsCounter;
1312

1413
import javax.servlet.ServletConfig;
1514
import javax.servlet.ServletException;
@@ -18,13 +17,10 @@
1817
import javax.servlet.http.HttpServletRequest;
1918
import javax.servlet.http.HttpServletResponse;
2019
import java.io.IOException;
21-
import java.io.UnsupportedEncodingException;
22-
import java.net.URISyntaxException;
23-
import java.net.URLDecoder;
2420

2521
import static java.nio.charset.StandardCharsets.UTF_8;
26-
import static org.springframework.http.HttpMethod.DELETE;
2722
import static org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext;
23+
import static ru.qatools.gridrouter.JsonWireUtils.*;
2824
import static ru.qatools.gridrouter.RequestUtils.getRemoteHost;
2925

3026
/**
@@ -34,7 +30,7 @@
3430
* @author Artem Eroshenko eroshenkoam@yandex-team.ru
3531
*/
3632
@WebServlet(
37-
urlPatterns = {ProxyServlet.WD_HUB_SESSION + "*"},
33+
urlPatterns = {WD_HUB_SESSION + "*"},
3834
asyncSupported = true,
3935
initParams = {
4036
@WebInitParam(name = "timeout", value = "300000"),
@@ -45,15 +41,11 @@ public class ProxyServlet extends org.eclipse.jetty.proxy.ProxyServlet {
4541

4642
private static final Logger LOGGER = LoggerFactory.getLogger(ProxyServlet.class);
4743

48-
public static final String WD_HUB_SESSION = "/wd/hub/session/";
49-
50-
public static final int SESSION_HASH_LENGTH = 32;
51-
5244
@Autowired
53-
private ConfigRepository config;
45+
private transient ConfigRepository config;
5446

5547
@Autowired
56-
private GridStats stats;
48+
private transient StatsCounter statsCounter;
5749

5850
@Override
5951
public void init(ServletConfig config) throws ServletException {
@@ -85,7 +77,7 @@ protected String rewriteTarget(HttpServletRequest request) {
8577
return null;
8678
}
8779

88-
String route = getRoute(uri);
80+
String route = config.getRoute(getSessionHash(uri));
8981
String command = getCommand(uri);
9082

9183
if (route == null) {
@@ -95,7 +87,9 @@ protected String rewriteTarget(HttpServletRequest request) {
9587

9688
if (isSessionDeleteRequest(request, command)) {
9789
LOGGER.info("[SESSION_DELETED] [{}] [{}] [{}]", remoteHost, route, command);
98-
stats.stopSession();
90+
statsCounter.deleteSession(getFullSessionId(uri), route);
91+
} else {
92+
statsCounter.updateSession(getFullSessionId(uri), route);
9993
}
10094

10195
try {
@@ -132,39 +126,4 @@ private String removeSessionIdSafe(String content, String remoteHost) {
132126
}
133127
return content;
134128
}
135-
136-
protected String redirectionUrl(String host, String command) throws URISyntaxException {
137-
return new URIBuilder(host).setPath(WD_HUB_SESSION + command).build().toString();
138-
}
139-
140-
protected String getRoute(String uri) {
141-
return config.getRoutes().get(getSessionHash(uri));
142-
}
143-
144-
protected String getCommand(String uri) {
145-
String encodedCommand = uri.substring(getUriPrefixLength());
146-
try {
147-
return URLDecoder.decode(encodedCommand, UTF_8.name());
148-
} catch (UnsupportedEncodingException e) {
149-
LOGGER.error("[UNABLE_TO_DECODE_COMMAND] - could not decode command: {}", encodedCommand, e);
150-
return encodedCommand;
151-
}
152-
}
153-
154-
protected boolean isUriValid(String uri) {
155-
return uri.length() > getUriPrefixLength();
156-
}
157-
158-
protected boolean isSessionDeleteRequest(HttpServletRequest request, String command) {
159-
return DELETE.name().equalsIgnoreCase(request.getMethod())
160-
&& !command.contains("/");
161-
}
162-
163-
protected String getSessionHash(String uri) {
164-
return uri.substring(WD_HUB_SESSION.length(), getUriPrefixLength());
165-
}
166-
167-
protected int getUriPrefixLength() {
168-
return WD_HUB_SESSION.length() + SESSION_HASH_LENGTH;
169-
}
170129
}

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

+2-11
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 innokenty@yandex-team.ru
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 {

0 commit comments

Comments
 (0)