Skip to content

Commit dc8da35

Browse files
DevendraDevendra
authored andcommitted
cleanup and add support for using fine grained sampling
1 parent eaf23c4 commit dc8da35

File tree

5 files changed

+42
-57
lines changed

5 files changed

+42
-57
lines changed

moesif-servlet/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.moesif.servlet</groupId>
55
<artifactId>moesif-servlet</artifactId>
6-
<version>1.6.0</version>
6+
<version>1.6.1</version>
77
<packaging>jar</packaging>
88
<name>moesif-servlet</name>
99
<description>Moesif SDK for Java Servlet to log and analyze API calls</description>
@@ -61,7 +61,7 @@
6161
<dependency>
6262
<groupId>com.moesif.api</groupId>
6363
<artifactId>moesifapi</artifactId>
64-
<version>1.6.3</version>
64+
<version>1.6.4</version>
6565
</dependency>
6666
<dependency>
6767
<groupId>com.fasterxml.jackson.core</groupId>

moesif-servlet/src/main/java/com/moesif/servlet/MoesifFilter.java

Lines changed: 36 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,11 @@
1818

1919
import com.moesif.api.models.*;
2020

21-
import com.moesif.api.APIHelper;
2221
import com.moesif.api.MoesifAPIClient;
2322
import com.moesif.api.http.client.APICallBack;
2423
import com.moesif.api.http.client.HttpContext;
2524
import com.moesif.api.http.response.HttpResponse;
2625
import com.moesif.api.controllers.APIController;
27-
import com.moesif.api.Configuration;
2826
import com.moesif.api.IpAddress;
2927
import com.moesif.api.BodyParser;
3028

@@ -41,8 +39,8 @@ public class MoesifFilter implements Filter {
4139
private MoesifAPIClient moesifApi;
4240
private boolean debug;
4341
private boolean logBody;
44-
private int samplingPercentage;
45-
private Map<String, Map<String, Object>> configDict;
42+
private AppConfigModel appConfigModel;
43+
private String cachedConfigEtag;
4644
private Date lastUpdatedTime;
4745

4846
/**
@@ -172,14 +170,8 @@ public void init(FilterConfig filterConfig) throws ServletException {
172170
this.logBody = false;
173171
}
174172
}
175-
176-
// Global dict
177-
this.configDict = new HashMap<String, Map<String, Object>>();
178-
try {
179-
this.samplingPercentage = getAppConfig(null);
180-
} catch (Throwable t) {
181-
this.samplingPercentage = 100;
182-
}
173+
174+
getAndUpdateAppConfig();
183175
}
184176

185177
@Override
@@ -189,41 +181,26 @@ public void destroy() {
189181
}
190182
}
191183

192-
// Get Config
193-
public int getAppConfig(String cachedConfigEtag) throws Throwable {
194-
int sampleRate = 100;
184+
// Get Config. called only when configEtagChange is detected
185+
public void getAndUpdateAppConfig() {
195186
try {
196-
// Calling the api
197-
HttpResponse configApiResponse = moesifApi.getAPI().getAppConfig();
198-
// Fetch the response ETag
199-
String responseConfigEtag = configApiResponse.getHeaders().get("x-moesif-config-etag");
200-
201-
if(cachedConfigEtag != null && !cachedConfigEtag.isEmpty() && this.configDict.containsKey(cachedConfigEtag)) {
202-
// Remove from the cache
203-
this.configDict.remove(cachedConfigEtag);
204-
}
205-
206-
// Read the response body
207-
ObjectMapper mapper = new ObjectMapper();
208-
Map<String, Object> jsonMap = mapper.readValue(configApiResponse.getRawBody(), Map.class);
209-
210-
// Add to the global dict
211-
this.configDict.put(responseConfigEtag, jsonMap);
212-
213-
try {
214-
Map<String, Object> appConfig = this.configDict.get(responseConfigEtag);
215-
// Get the sample rate and update last updated time
216-
if (!appConfig.isEmpty() && appConfig.containsKey("sample_rate")) {
217-
sampleRate = (Integer) appConfig.get("sample_rate");
218-
}
219-
} catch(Exception e) {
220-
logger.warning("getConfig() call failed " + e.toString());
221-
}
222-
} catch(Exception e) {
187+
// Calling the api
188+
HttpResponse configApiResponse = moesifApi.getAPI().getAppConfig();
189+
// Fetch the response ETag
190+
String responseConfigEtag = configApiResponse.getHeaders().get("x-moesif-config-etag");
191+
192+
// Read the response body
193+
ObjectMapper mapper = new ObjectMapper();
194+
AppConfigModel newConfig = mapper.readValue(configApiResponse.getRawBody(), AppConfigModel.class);
195+
196+
this.appConfigModel = newConfig;
197+
this.cachedConfigEtag = responseConfigEtag;
198+
} catch(Throwable e) {
223199
logger.warning("getConfig() call failed " + e.toString());
200+
this.appConfigModel = new AppConfigModel();
201+
this.appConfigModel.setSampleRate(100);
224202
}
225203
this.lastUpdatedTime = new Date();
226-
return sampleRate;
227204
}
228205

229206
public void updateUser(UserModel userModel) throws Throwable{
@@ -504,13 +481,13 @@ public void onFailure(HttpContext context, Throwable error) {
504481

505482
// Generate random number
506483
double randomPercentage = Math.random() * 100;
507-
484+
485+
int samplingPercentage = getSampleRateToUse(userId, companyId);
486+
508487
// Compare percentage to send event
509-
if (this.samplingPercentage >= randomPercentage) {
488+
if (samplingPercentage >= randomPercentage) {
510489
// Send Event
511490
Map<String, String> eventApiResponse = moesifApi.getAPI().createEvent(maskedEvent);
512-
// Get the key from the global dict
513-
String cachedConfigEtag = this.configDict.keySet().iterator().next();
514491
// Get the etag from event api response
515492
String eventResponseConfigEtag = eventApiResponse.get("x-moesif-config-etag");
516493

@@ -519,7 +496,7 @@ public void onFailure(HttpContext context, Throwable error) {
519496
&& !(eventResponseConfigEtag.equals(cachedConfigEtag))
520497
&& new Date().after(new Date(this.lastUpdatedTime.getTime() + 5 * 60 * 1000))) {
521498
// Call api to update samplingPercentage
522-
this.samplingPercentage = getAppConfig(cachedConfigEtag);
499+
getAndUpdateAppConfig();
523500
}
524501

525502
if (debug) {
@@ -528,7 +505,7 @@ && new Date().after(new Date(this.lastUpdatedTime.getTime() + 5 * 60 * 1000))) {
528505
}
529506
else {
530507
if(debug) {
531-
logger.info("Skipped Event due to SamplingPercentage " + this.samplingPercentage + " and randomPercentage " + randomPercentage);
508+
logger.info("Skipped Event due to SamplingPercentage " + samplingPercentage + " and randomPercentage " + randomPercentage);
532509
}
533510
}
534511

@@ -543,6 +520,16 @@ && new Date().after(new Date(this.lastUpdatedTime.getTime() + 5 * 60 * 1000))) {
543520
}
544521
}
545522

523+
public int getSampleRateToUse(String userId, String companyId) {
524+
int sampleRate = appConfigModel.getSampleRate();
525+
if (userId != null && appConfigModel.getUserSampleRate().containsKey(userId)) {
526+
sampleRate = appConfigModel.getUserSampleRate().get(userId);
527+
} else if (companyId != null && appConfigModel.getCompanySampleRate().containsKey(companyId)) {
528+
sampleRate = appConfigModel.getCompanySampleRate().get(companyId);
529+
}
530+
return sampleRate;
531+
}
532+
546533
static String getFullURL(HttpServletRequest request) {
547534
StringBuffer requestURL = request.getRequestURL();
548535
String queryString = request.getQueryString();

moesif-servlet/src/test/java/com/moesif/servlet/MoesifServletTests.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
import com.moesif.api.models.UserBuilder;
1414
import junit.framework.TestCase;
1515
import org.mockito.Mockito;
16-
import com.moesif.servlet.MoesifFilter;
17-
import com.moesif.servlet.MoesifConfiguration;
1816
import com.moesif.api.models.UserModel;
1917
import static org.mockito.Mockito.when;
2018

@@ -227,7 +225,7 @@ public void testUpdateCompaniesBatch() throws Throwable {
227225

228226
public void testGetAppConfig() throws Throwable{
229227
filter.init(filterConfig);
230-
int sampleRate = filter.getAppConfig(null);
228+
int sampleRate = filter.getSampleRateToUse(null, null);
231229
assertTrue("Sample Rate should be less than equal to 100", 100 >= sampleRate);
232230
}
233231
}

moesif-springrequest/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.moesif.springrequest</groupId>
55
<artifactId>moesif-springrequest</artifactId>
6-
<version>1.0.4</version>
6+
<version>1.0.5</version>
77
<packaging>jar</packaging>
88
<name>moesif-springrequest</name>
99
<description>Moesif SDK for Java to log and analyze outgoing API calls</description>
@@ -56,7 +56,7 @@
5656
<dependency>
5757
<groupId>com.moesif.api</groupId>
5858
<artifactId>moesifapi</artifactId>
59-
<version>1.6.3</version>
59+
<version>1.6.4</version>
6060
</dependency>
6161
<dependency>
6262
<groupId>org.springframework</groupId>

moesif-springrequest/src/main/java/com/moesif/springrequest/MoesifSpringRequestInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttp
219219

220220
eventModel = config.maskContent(eventModel);
221221

222-
if (api.shouldSendSampledEvent()) {
222+
if (api.shouldSendSampledEvent(eventModel)) {
223223
try {
224224
APICallBack<HttpResponse> callback = new APICallBack<HttpResponse>() {
225225
public void onSuccess(HttpContext context, HttpResponse response) {

0 commit comments

Comments
 (0)