Skip to content

Commit dc0b83a

Browse files
traskkryalama
andauthored
Fix some logging issues (#1917)
* Fix some logging issues * Update agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/common/NetworkFriendlyExceptions.java Co-authored-by: kryalama <[email protected]> * Update agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/common/NetworkFriendlyExceptions.java Co-authored-by: kryalama <[email protected]> Co-authored-by: kryalama <[email protected]>
1 parent 213a6a3 commit dc0b83a

File tree

8 files changed

+105
-172
lines changed

8 files changed

+105
-172
lines changed

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/common/ExceptionUtils.java

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

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/common/FriendlyException.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,35 +21,42 @@
2121

2222
package com.microsoft.applicationinsights.agent.internal.common;
2323

24-
public class FriendlyException extends RuntimeException {
25-
// TODO (trask) this seems like default for failing to send telemetry, but not necessarily default
26-
// for all friendly exceptions
27-
private static final String DEFAULT_BANNER =
28-
"ApplicationInsights Java Agent failed to send telemetry data";
29-
30-
public FriendlyException() {
31-
super();
32-
}
24+
import org.checkerframework.checker.nullness.qual.Nullable;
3325

34-
public FriendlyException(String message, String action) {
35-
// TODO (trask) can these constructors cascade?
36-
super(populateFriendlyMessage(message, action, DEFAULT_BANNER, ""));
37-
}
26+
public class FriendlyException extends RuntimeException {
3827

39-
public FriendlyException(String banner, String action, String message, String note) {
40-
super(populateFriendlyMessage(message, action, banner, note));
28+
public FriendlyException(String description, String action) {
29+
this(description, action, null);
4130
}
4231

43-
public FriendlyException(String banner, String action, Throwable cause) {
44-
super(populateFriendlyMessage("", action, banner, ""), cause);
32+
public FriendlyException(String description, String action, @Nullable Throwable cause) {
33+
super(buildMessage(description, action), cause);
4534
}
4635

4736
public String getMessageWithBanner(String banner) {
48-
return populateFriendlyMessage(getMessage(), "", banner, "");
37+
return System.lineSeparator()
38+
+ "*************************"
39+
+ System.lineSeparator()
40+
+ banner
41+
+ System.lineSeparator()
42+
+ "*************************"
43+
+ System.lineSeparator()
44+
+ getMessage();
4945
}
5046

51-
public static String getMessageWithDefaultBanner(String message) {
52-
return populateFriendlyMessage(message, "", DEFAULT_BANNER, "");
47+
private static String buildMessage(String description, String action) {
48+
StringBuilder messageBuilder = new StringBuilder();
49+
if (!Strings.isNullOrEmpty(description)) {
50+
messageBuilder.append(System.lineSeparator());
51+
messageBuilder.append("Description:").append(System.lineSeparator());
52+
messageBuilder.append(description).append(System.lineSeparator());
53+
}
54+
if (!Strings.isNullOrEmpty(action)) {
55+
messageBuilder.append(System.lineSeparator());
56+
messageBuilder.append("Action:").append(System.lineSeparator());
57+
messageBuilder.append(action).append(System.lineSeparator());
58+
}
59+
return messageBuilder.toString();
5360
}
5461

5562
public static String populateFriendlyMessage(
Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,57 @@
1919
* DEALINGS IN THE SOFTWARE.
2020
*/
2121

22-
package com.microsoft.applicationinsights.agent.internal.httpclient;
22+
package com.microsoft.applicationinsights.agent.internal.common;
2323

24-
import com.microsoft.applicationinsights.agent.internal.common.FriendlyException;
2524
import com.microsoft.applicationinsights.agent.internal.configuration.DefaultEndpoints;
2625
import java.io.File;
26+
import java.net.UnknownHostException;
27+
import java.util.concurrent.atomic.AtomicBoolean;
28+
import javax.net.ssl.SSLHandshakeException;
2729
import org.checkerframework.checker.nullness.qual.Nullable;
30+
import org.slf4j.Logger;
2831

29-
public class SslUtil {
32+
public class NetworkFriendlyExceptions {
3033

31-
public static String friendlyMessage(String url) {
32-
return FriendlyException.populateFriendlyMessage(
33-
getSslFriendlyExceptionBanner(url),
34-
getSslFriendlyExceptionAction(url),
35-
getSslFriendlyExceptionMessage(),
36-
getSslFriendlyExceptionNote());
34+
public static void logSpecialOneTimeFriendlyException(
35+
Throwable error, String url, AtomicBoolean alreadySeen, Logger logger) {
36+
if (alreadySeen.get()) {
37+
return;
38+
}
39+
// Handle SSL cert exceptions
40+
SSLHandshakeException sslException = getCausedByOfType(error, SSLHandshakeException.class);
41+
if (sslException != null && !alreadySeen.getAndSet(true)) {
42+
logger.error(getSslFriendlyMessage(url));
43+
return;
44+
}
45+
UnknownHostException unknownHostException =
46+
getCausedByOfType(error, UnknownHostException.class);
47+
if (unknownHostException != null && !alreadySeen.getAndSet(true)) {
48+
// TODO log friendly message with instructions how to troubleshoot
49+
// e.g. wrong host address or cannot reach address due to network issues...
50+
return;
51+
}
3752
}
3853

39-
private static String getJavaCacertsPath() {
40-
String javaHome = System.getProperty("java.home");
41-
return new File(javaHome, "lib/security/cacerts").getPath();
54+
private static <T extends Exception> T getCausedByOfType(Throwable throwable, Class<T> type) {
55+
if (type.isInstance(throwable)) {
56+
@SuppressWarnings("unchecked")
57+
T ofType = (T) throwable;
58+
return ofType;
59+
}
60+
Throwable cause = throwable.getCause();
61+
if (cause == null) {
62+
return null;
63+
}
64+
return getCausedByOfType(cause, type);
4265
}
4366

44-
@Nullable
45-
private static String getCustomJavaKeystorePath() {
46-
String cacertsPath = System.getProperty("javax.net.ssl.trustStore");
47-
if (cacertsPath != null) {
48-
return new File(cacertsPath).getPath();
49-
}
50-
return null;
67+
private static String getSslFriendlyMessage(String url) {
68+
return FriendlyException.populateFriendlyMessage(
69+
getSslFriendlyExceptionBanner(url),
70+
getSslFriendlyExceptionAction(url),
71+
"Unable to find valid certification path to requested target.",
72+
"This message is only logged the first time it occurs after startup.");
5173
}
5274

5375
private static String getSslFriendlyExceptionBanner(String url) {
@@ -57,10 +79,6 @@ private static String getSslFriendlyExceptionBanner(String url) {
5779
return "ApplicationInsights Java Agent failed to send telemetry data.";
5880
}
5981

60-
private static String getSslFriendlyExceptionMessage() {
61-
return "Unable to find valid certification path to requested target.";
62-
}
63-
6482
private static String getSslFriendlyExceptionAction(String url) {
6583
String customJavaKeyStorePath = getCustomJavaKeystorePath();
6684
if (customJavaKeyStorePath != null) {
@@ -79,9 +97,19 @@ private static String getSslFriendlyExceptionAction(String url) {
7997
+ "Learn more about importing the certificate here: https://go.microsoft.com/fwlink/?linkid=2151450";
8098
}
8199

82-
private static String getSslFriendlyExceptionNote() {
83-
return "This message is only logged the first time it occurs after startup.";
100+
private static String getJavaCacertsPath() {
101+
String javaHome = System.getProperty("java.home");
102+
return new File(javaHome, "lib/security/cacerts").getPath();
103+
}
104+
105+
@Nullable
106+
private static String getCustomJavaKeystorePath() {
107+
String cacertsPath = System.getProperty("javax.net.ssl.trustStore");
108+
if (cacertsPath != null) {
109+
return new File(cacertsPath).getPath();
110+
}
111+
return null;
84112
}
85113

86-
private SslUtil() {}
114+
private NetworkFriendlyExceptions() {}
87115
}

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -553,10 +553,9 @@ static Configuration getConfigurationFromConfigFile(Path configPath, boolean str
553553
}
554554
} catch (JsonMappingException | JsonParseException ex) {
555555
throw new FriendlyException(
556-
"Application Insights Java agent failed to start",
556+
"Error parsing configuration from file: " + configPath.toAbsolutePath(),
557557
"Learn more about configuration options here: https://go.microsoft.com/fwlink/?linkid=2153358",
558-
ex.getMessage(),
559-
"Error parsing configuration from file: " + configPath.toAbsolutePath());
558+
ex);
560559
} catch (Exception e) {
561560
throw new ConfigurationException(
562561
"Error parsing configuration from file: " + configPath.toAbsolutePath(), e);

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AppIdSupplier.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import com.azure.core.http.HttpMethod;
2727
import com.azure.core.http.HttpRequest;
2828
import com.azure.core.http.HttpResponse;
29-
import com.microsoft.applicationinsights.agent.internal.common.ExceptionUtils;
29+
import com.microsoft.applicationinsights.agent.internal.common.NetworkFriendlyExceptions;
3030
import com.microsoft.applicationinsights.agent.internal.common.ThreadPoolUtils;
3131
import com.microsoft.applicationinsights.agent.internal.common.WarningLogger;
3232
import com.microsoft.applicationinsights.agent.internal.httpclient.LazyHttpClient;
@@ -125,7 +125,8 @@ public void run() {
125125
try {
126126
response = LazyHttpClient.getInstance().send(request).block();
127127
} catch (RuntimeException ex) {
128-
ExceptionUtils.parseError(ex, url.toString(), friendlyExceptionThrown, logger);
128+
NetworkFriendlyExceptions.logSpecialOneTimeFriendlyException(
129+
ex, url.toString(), friendlyExceptionThrown, logger);
129130
warningLogger.recordWarning("exception sending request to " + url, ex);
130131
backOff();
131132
return;

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/quickpulse/QuickPulsePingSender.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import com.fasterxml.jackson.core.JsonProcessingException;
2828
import com.fasterxml.jackson.databind.ObjectMapper;
2929
import com.fasterxml.jackson.databind.SerializationFeature;
30-
import com.microsoft.applicationinsights.agent.internal.common.ExceptionUtils;
30+
import com.microsoft.applicationinsights.agent.internal.common.NetworkFriendlyExceptions;
3131
import com.microsoft.applicationinsights.agent.internal.common.OperationLogger;
3232
import com.microsoft.applicationinsights.agent.internal.common.Strings;
3333
import com.microsoft.applicationinsights.agent.internal.httpclient.LazyHttpClient;
@@ -135,8 +135,9 @@ public QuickPulseHeaderInfo ping(String redirectedEndpoint) {
135135
}
136136
}
137137
} catch (Throwable t) {
138+
NetworkFriendlyExceptions.logSpecialOneTimeFriendlyException(
139+
t, getQuickPulseEndpoint(), friendlyExceptionThrown, logger);
138140
operationLogger.recordFailure(t.getMessage(), t);
139-
ExceptionUtils.parseError(t, getQuickPulseEndpoint(), friendlyExceptionThrown, logger);
140141
} finally {
141142
if (response != null) {
142143
response.close();

0 commit comments

Comments
 (0)