Skip to content

Commit ba267cb

Browse files
committed
Merge branch 'main' into clean-services
2 parents c06e15f + 0288de6 commit ba267cb

39 files changed

+284
-131
lines changed

.github/workflows/greetings.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: Greetings
2+
3+
on: [pull_request, issues]
4+
5+
jobs:
6+
greeting:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- uses: actions/first-interaction@v1
10+
with:
11+
repo-token: ${{ secrets.GITHUB_TOKEN }}
12+
issue-message: 'Thanks for reporting this issue. We will get back to you in a while'
13+
pr-message: 'Great Job for your first PR in this repository'

.github/workflows/stale.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: Mark stale issues and pull requests
2+
3+
on:
4+
schedule:
5+
- cron: "30 1 * * *"
6+
7+
jobs:
8+
stale:
9+
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- uses: actions/stale@v3
14+
with:
15+
repo-token: ${{ secrets.GITHUB_TOKEN }}
16+
stale-issue-message: 'This issue is stale'
17+
stale-pr-message: 'This PR is stale'
18+
stale-issue-label: 'stale'
19+
stale-pr-label: 'stale'

Readme.md renamed to README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,31 @@ class ExampleApp{
3232
}
3333
```
3434

35+
**Builder Pattern**
36+
37+
We love our builders!!! This project heavily utilized the use of builders instead of traditional object creation
38+
using `new`. We do this with the help of Project Lombok's `@Builder` annotation. Read more about the
39+
project [here](https://projectlombok.org/features/all). Read more about the
40+
annotation [here](https://projectlombok.org/features/Builder). Read more about the builder
41+
pattern [here](https://refactoring.guru/design-patterns/builder).
42+
43+
_Example: Customizing your Event Queue implementation_
44+
45+
```
46+
EventQueueIF queue = //get your implementation
47+
Configuration configuration =
48+
Configuration.builder().serverUrl("http://your-server-url").apiKey("your-api-key").build();
49+
ConfigurationManager configurationManager =
50+
ConfigurationManager.builder().queue(queue).configuration(configuration).build();
51+
ExceptionlessClient client =
52+
ExceptionlessClient.builder().configurationManager(configurationManager).build();
53+
```
54+
55+
In this library we have made sure that all the values which are not set by builders fallback to reasonable defaults. So
56+
don't feel the pressure to supply values for all the fields. **Note:** Whenever customizing the client
57+
using `ConfigurationManager` never forget to supply your `serverUrl` and `apiKey` using a `Configuration` object as
58+
shown above.
59+
3560
## Spring Boot Users
3661

3762
You can observe `NoClassDefFoundError` in your Spring-boot apps because Spring-boot uses v3 of `OkHttpClient` while this client uses v4. In that case you have to explicitly declare v4 of the library in you `pom.xml/build.gradle`.

src/main/java/com/exceptionless/exceptionlessclient/ExceptionlessClient.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
import com.exceptionless.exceptionlessclient.configuration.Configuration;
44
import com.exceptionless.exceptionlessclient.configuration.ConfigurationManager;
5+
import com.exceptionless.exceptionlessclient.enums.EventPropertyKey;
6+
import com.exceptionless.exceptionlessclient.enums.EventType;
57
import com.exceptionless.exceptionlessclient.models.Event;
68
import com.exceptionless.exceptionlessclient.models.EventPluginContext;
79
import com.exceptionless.exceptionlessclient.models.PluginContext;
810
import com.exceptionless.exceptionlessclient.models.UserDescription;
9-
import com.exceptionless.exceptionlessclient.models.enums.EventPropertyKey;
10-
import com.exceptionless.exceptionlessclient.models.enums.EventType;
11-
import com.exceptionless.exceptionlessclient.models.submission.SubmissionResponse;
1211
import com.exceptionless.exceptionlessclient.plugins.EventPluginRunner;
12+
import com.exceptionless.exceptionlessclient.submission.SubmissionResponse;
1313
import com.exceptionless.exceptionlessclient.utils.VisibleForTesting;
1414
import lombok.Builder;
1515
import lombok.Getter;
@@ -269,9 +269,16 @@ public SubmissionResponse updateEmailAndDescription(
269269
.postUserDescription(
270270
referenceId,
271271
UserDescription.builder().description(description).emailAddress(email).build());
272+
if (response.hasException()) {
273+
log.error(
274+
String.format("Failed to submit user email and description for event: %s", referenceId),
275+
response.getException());
276+
}
272277
if (!response.isSuccess()) {
273278
log.error(
274-
String.format("Failed to submit user email and description for event: %s", referenceId));
279+
String.format(
280+
"Failed to submit user email and description for event: %s, code: %s",
281+
referenceId, response.getCode()));
275282
}
276283

277284
return response;

src/main/java/com/exceptionless/exceptionlessclient/configuration/Configuration.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
public class Configuration {
1010
private static final String DEFAULT_SERVER_URL = "https://collector.exceptionless.io";
1111
private static final String DEFAULT_HEARTBEAT_SERVER_URL = "https://heartbeat.exceptionless.io";
12+
private static final String DEFAULT_CONFIG_SERVER_URL = "https://config.exceptionless.io";
1213
private static final Long DEFAULT_UPDATE_SETTINGS_WHEN_IDLE_INTERVAL = 12000L;
1314
private static final Integer DEFAULT_SUBMISSION_BATCH_SIZE = 50;
1415
private static final Integer DEFAULT_SUBMISSION_CLIENT_TIMEOUT_IN_MILLIS = 500;
@@ -17,6 +18,7 @@ public class Configuration {
1718
public static class Property {
1819
public static final String API_KEY = "apiKey";
1920
public static final String SERVER_URL = "serverUrl";
21+
public static final String CONFIG_SERVER_URL = "configServerUrl";
2022
public static final String HEART_BEAT_SERVER_URL = "heartbeatServerUrl";
2123
public static final String UPDATE_SETTINGS_WHEN_IDLE_INTERVAL =
2224
"updateSettingsWhenIdleInterval";
@@ -29,6 +31,7 @@ public static class Property {
2931
@Getter private String apiKey;
3032
@Getter private String serverUrl;
3133
@Getter private String heartbeatServerUrl;
34+
@Getter private String configServerUrl;
3235
@Getter private Long updateSettingsWhenIdleInterval;
3336
@Getter private Integer submissionBatchSize;
3437
@Getter private Integer submissionClientTimeoutInMillis;
@@ -51,6 +54,10 @@ public Configuration(
5154
heartbeatServerUrl == null
5255
? (serverUrl == null ? DEFAULT_HEARTBEAT_SERVER_URL : serverUrl)
5356
: heartbeatServerUrl;
57+
this.configServerUrl =
58+
configServerUrl == null
59+
? (serverUrl == null ? DEFAULT_CONFIG_SERVER_URL : serverUrl)
60+
: configServerUrl;
5461
this.updateSettingsWhenIdleInterval =
5562
updateSettingsWhenIdleInterval == null
5663
? DEFAULT_UPDATE_SETTINGS_WHEN_IDLE_INTERVAL
@@ -88,6 +95,13 @@ public void setServerUrl(String serverUrl) {
8895
propertyChangeSupport.firePropertyChange(Property.SERVER_URL, prevValue, serverUrl);
8996
}
9097

98+
public void setConfigServerUrl(String configServerUrl) {
99+
String prevValue = this.configServerUrl;
100+
this.configServerUrl = configServerUrl;
101+
propertyChangeSupport.firePropertyChange(
102+
Property.CONFIG_SERVER_URL, prevValue, configServerUrl);
103+
}
104+
91105
public void setHeartbeatServerUrl(String heartbeatServerUrl) {
92106
String prevValue = this.heartbeatServerUrl;
93107
this.heartbeatServerUrl = heartbeatServerUrl;

src/main/java/com/exceptionless/exceptionlessclient/configuration/ConfigurationManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.exceptionless.exceptionlessclient.logging.NullLogCapturer;
88
import com.exceptionless.exceptionlessclient.models.EventPluginContext;
99
import com.exceptionless.exceptionlessclient.models.UserInfo;
10-
import com.exceptionless.exceptionlessclient.models.enums.EventPropertyKey;
10+
import com.exceptionless.exceptionlessclient.enums.EventPropertyKey;
1111
import com.exceptionless.exceptionlessclient.plugins.EventPluginIF;
1212
import com.exceptionless.exceptionlessclient.plugins.preconfigured.HeartbeatPlugin;
1313
import com.exceptionless.exceptionlessclient.queue.DefaultEventQueue;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.exceptionless.exceptionlessclient.models.enums;
1+
package com.exceptionless.exceptionlessclient.enums;
22

33
public enum EnvironmentInfoPropertyKey {
44
LOAD_AVG("loadavg"),

src/main/java/com/exceptionless/exceptionlessclient/models/enums/EventPropertyKey.java renamed to src/main/java/com/exceptionless/exceptionlessclient/enums/EventPropertyKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.exceptionless.exceptionlessclient.models.enums;
1+
package com.exceptionless.exceptionlessclient.enums;
22

33
public enum EventPropertyKey {
44
REF("@ref"),

src/main/java/com/exceptionless/exceptionlessclient/models/enums/EventTag.java renamed to src/main/java/com/exceptionless/exceptionlessclient/enums/EventTag.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.exceptionless.exceptionlessclient.models.enums;
1+
package com.exceptionless.exceptionlessclient.enums;
22

33
public enum EventTag {
44
CRITICAL("Critical");

src/main/java/com/exceptionless/exceptionlessclient/models/enums/EventType.java renamed to src/main/java/com/exceptionless/exceptionlessclient/enums/EventType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.exceptionless.exceptionlessclient.models.enums;
1+
package com.exceptionless.exceptionlessclient.enums;
22

33
public enum EventType {
44
ERROR("error"),

src/main/java/com/exceptionless/exceptionlessclient/models/enums/ServerSettingKey.java renamed to src/main/java/com/exceptionless/exceptionlessclient/enums/ServerSettingKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.exceptionless.exceptionlessclient.models.enums;
1+
package com.exceptionless.exceptionlessclient.enums;
22

33
public enum ServerSettingKey {
44
DATA_EXCLUSIONS("@@DataExclusions"),

src/main/java/com/exceptionless/exceptionlessclient/exceptions/SettingsClientException.java

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

src/main/java/com/exceptionless/exceptionlessclient/exceptions/SubmissionClientException.java

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

src/main/java/com/exceptionless/exceptionlessclient/models/Event.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.exceptionless.exceptionlessclient.models;
22

3+
import com.exceptionless.exceptionlessclient.enums.EventPropertyKey;
4+
import com.exceptionless.exceptionlessclient.enums.EventTag;
35
import com.exceptionless.exceptionlessclient.models.base.Model;
4-
import com.exceptionless.exceptionlessclient.models.enums.EventPropertyKey;
5-
import com.exceptionless.exceptionlessclient.models.enums.EventTag;
66
import com.exceptionless.exceptionlessclient.models.error.Error;
77
import com.exceptionless.exceptionlessclient.queue.EventDataFilter;
88
import com.exceptionless.exceptionlessclient.queue.EventValidator;

src/main/java/com/exceptionless/exceptionlessclient/plugins/preconfigured/EnvironmentInfoPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.exceptionless.exceptionlessclient.plugins.preconfigured;
22

33
import com.exceptionless.exceptionlessclient.configuration.ConfigurationManager;
4+
import com.exceptionless.exceptionlessclient.enums.EnvironmentInfoPropertyKey;
5+
import com.exceptionless.exceptionlessclient.models.EnvironmentInfo;
46
import com.exceptionless.exceptionlessclient.models.Event;
57
import com.exceptionless.exceptionlessclient.models.EventPluginContext;
6-
import com.exceptionless.exceptionlessclient.models.enums.EnvironmentInfoPropertyKey;
7-
import com.exceptionless.exceptionlessclient.models.EnvironmentInfo;
88
import com.exceptionless.exceptionlessclient.plugins.EventPluginIF;
99
import com.exceptionless.exceptionlessclient.plugins.preconfigured.args.EnvironmentInfoGetArgs;
1010
import com.sun.management.OperatingSystemMXBean;

src/main/java/com/exceptionless/exceptionlessclient/plugins/preconfigured/ErrorPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.exceptionless.exceptionlessclient.plugins.preconfigured;
22

33
import com.exceptionless.exceptionlessclient.configuration.ConfigurationManager;
4+
import com.exceptionless.exceptionlessclient.enums.EventPropertyKey;
5+
import com.exceptionless.exceptionlessclient.enums.EventType;
46
import com.exceptionless.exceptionlessclient.models.Event;
57
import com.exceptionless.exceptionlessclient.models.EventPluginContext;
6-
import com.exceptionless.exceptionlessclient.models.enums.EventPropertyKey;
7-
import com.exceptionless.exceptionlessclient.models.enums.EventType;
88
import com.exceptionless.exceptionlessclient.models.error.Error;
99
import com.exceptionless.exceptionlessclient.models.error.StackFrame;
1010
import com.exceptionless.exceptionlessclient.plugins.EventPluginIF;

src/main/java/com/exceptionless/exceptionlessclient/plugins/preconfigured/EventExclusionPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.exceptionless.exceptionlessclient.plugins.preconfigured;
22

33
import com.exceptionless.exceptionlessclient.configuration.ConfigurationManager;
4+
import com.exceptionless.exceptionlessclient.enums.EventType;
45
import com.exceptionless.exceptionlessclient.models.Event;
56
import com.exceptionless.exceptionlessclient.models.EventPluginContext;
6-
import com.exceptionless.exceptionlessclient.models.enums.EventType;
77
import com.exceptionless.exceptionlessclient.models.error.Error;
88
import com.exceptionless.exceptionlessclient.plugins.EventPluginIF;
99
import com.exceptionless.exceptionlessclient.settings.ServerSettings;

src/main/java/com/exceptionless/exceptionlessclient/queue/DefaultEventQueue.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.exceptionless.exceptionlessclient.queue;
22

33
import com.exceptionless.exceptionlessclient.configuration.Configuration;
4-
import com.exceptionless.exceptionlessclient.exceptions.SubmissionClientException;
54
import com.exceptionless.exceptionlessclient.models.Event;
65
import com.exceptionless.exceptionlessclient.models.storage.StorageItem;
7-
import com.exceptionless.exceptionlessclient.models.submission.SubmissionResponse;
86
import com.exceptionless.exceptionlessclient.storage.StorageProviderIF;
97
import com.exceptionless.exceptionlessclient.submission.SubmissionClientIF;
8+
import com.exceptionless.exceptionlessclient.submission.SubmissionResponse;
109
import com.exceptionless.exceptionlessclient.utils.VisibleForTesting;
1110
import lombok.Builder;
1211
import lombok.extern.slf4j.Slf4j;
@@ -137,11 +136,13 @@ public void process() {
137136
log.info(
138137
String.format("Sending %s events to %s", events.size(), configuration.getServerUrl()));
139138
SubmissionResponse response = submissionClient.postEvents(events);
139+
if (response.hasException()) {
140+
log.error("Error submitting events from queue", response.getException());
141+
suspendProcessing();
142+
return;
143+
}
140144
processSubmissionResponse(response, storedEvents);
141145
eventPosted(response, events);
142-
} catch (SubmissionClientException e) {
143-
log.error("Error submitting events from queue", e);
144-
suspendProcessing();
145146
} finally {
146147
synchronized (this) {
147148
processingQueue = false;
@@ -158,6 +159,13 @@ private void processSubmissionResponse(
158159
return;
159160
}
160161

162+
if (response.isRateLimited()) {
163+
log.error(
164+
"Service is rate limited because of either you have exceeded your rate limit or server is under stress.");
165+
suspendProcessing();
166+
return;
167+
}
168+
161169
if (response.isServiceUnavailable()) {
162170
log.error("Service returns service unavailable");
163171
suspendProcessing();

src/main/java/com/exceptionless/exceptionlessclient/queue/EventQueueIF.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.exceptionless.exceptionlessclient.queue;
22

33
import com.exceptionless.exceptionlessclient.models.Event;
4-
import com.exceptionless.exceptionlessclient.models.submission.SubmissionResponse;
4+
import com.exceptionless.exceptionlessclient.submission.SubmissionResponse;
55

66
import java.time.Duration;
77
import java.util.List;

src/main/java/com/exceptionless/exceptionlessclient/settings/DefaultSettingsClient.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.exceptionless.exceptionlessclient.settings;
22

33
import com.exceptionless.exceptionlessclient.configuration.Configuration;
4-
import com.exceptionless.exceptionlessclient.exceptions.SettingsClientException;
5-
import com.exceptionless.exceptionlessclient.models.submission.SettingsResponse;
64
import com.exceptionless.exceptionlessclient.utils.Utils;
75
import com.exceptionless.exceptionlessclient.utils.VisibleForTesting;
86
import com.fasterxml.jackson.core.type.TypeReference;
@@ -42,7 +40,7 @@ public SettingsResponse getSettings(long version) {
4240
.url(
4341
String.format(
4442
"%s/api/v2/projects/config?v=%s&access_token=%s",
45-
configuration.getServerUrl(), version, configuration.getApiKey()))
43+
configuration.getConfigServerUrl(), version, configuration.getApiKey()))
4644
.get()
4745
.build();
4846

@@ -53,7 +51,7 @@ public SettingsResponse getSettings(long version) {
5351
if (bodyStr == null) {
5452
return SettingsResponse.builder().code(response.code()).body("").build();
5553
}
56-
if (response.code() / 100 != 2) {
54+
if (!response.isSuccessful()) {
5755
return SettingsResponse.builder().code(response.code()).body(bodyStr).build();
5856
}
5957

@@ -65,7 +63,7 @@ public SettingsResponse getSettings(long version) {
6563
.settings(serverSettings)
6664
.build();
6765
} catch (Exception e) {
68-
throw new SettingsClientException(e);
66+
return SettingsResponse.builder().exception(e).build();
6967
}
7068
}
7169
}

src/main/java/com/exceptionless/exceptionlessclient/settings/ServerSettings.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.exceptionless.exceptionlessclient.settings;
22

3-
import com.exceptionless.exceptionlessclient.models.enums.ServerSettingKey;
3+
import com.exceptionless.exceptionlessclient.enums.ServerSettingKey;
44
import com.exceptionless.exceptionlessclient.utils.Utils;
55
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
66
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.exceptionless.exceptionlessclient.settings;
22

33

4-
import com.exceptionless.exceptionlessclient.models.submission.SettingsResponse;
5-
64
public interface SettingsClientIF {
75
SettingsResponse getSettings(long version);
86
}

src/main/java/com/exceptionless/exceptionlessclient/settings/SettingsManager.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.exceptionless.exceptionlessclient.settings;
22

3-
import com.exceptionless.exceptionlessclient.exceptions.SettingsClientException;
43
import com.exceptionless.exceptionlessclient.models.storage.StorageItem;
5-
import com.exceptionless.exceptionlessclient.models.submission.SettingsResponse;
64
import com.exceptionless.exceptionlessclient.storage.StorageProviderIF;
75
import lombok.Builder;
86
import lombok.extern.slf4j.Slf4j;
@@ -81,8 +79,6 @@ public void updateSettings() {
8179
storageProvider.getSettings().save(response.getSettings());
8280
propertyChangeSupport.firePropertyChange(
8381
Property.SETTINGS, prevValue, response.getSettings());
84-
} catch (SettingsClientException e) {
85-
log.error(String.format("Error retrieving settings for v%s", getVersion()), e);
8682
} finally {
8783
synchronized (this) {
8884
updatingSettings = false;
@@ -91,6 +87,12 @@ public void updateSettings() {
9187
}
9288

9389
private boolean shouldNotUpdate(SettingsResponse response) {
90+
if (response.hasException()) {
91+
log.error(
92+
String.format("Error retrieving settings for v%s", getVersion()),
93+
response.getException());
94+
return true;
95+
}
9496
if (response.isNotModified()) {
9597
log.debug("No need to update, settings are not modified");
9698
return true;

0 commit comments

Comments
 (0)