提交 8ec5d16d 编写于 作者: wu-sheng's avatar wu-sheng

1.增加部分忽略业务异常的代码。

上级 45bbf0cd
package com.ai.cloud.skywalking.buriedpoint;
import java.util.ArrayList;
import java.util.List;
import com.ai.cloud.skywalking.api.IExceptionHandler;
import com.ai.cloud.skywalking.conf.Config;
import com.ai.cloud.skywalking.context.Context;
import com.ai.cloud.skywalking.protocol.Span;
public class ApplicationExceptionHandler implements IExceptionHandler {
private static Boolean isExclusiveExceptionListInit = false;
private static List<String> exclusiveExceptionList = new ArrayList<String>();
@Override
public void handleException(Throwable th) {
if (isExclusiveExceptionListInit == false)
synchronized (isExclusiveExceptionListInit) {
if (isExclusiveExceptionListInit == false) {
isExclusiveExceptionListInit = true;
}
}
Span span = Context.getLastSpan();
span.handleException(th, exclusiveExceptionList, Config.BuriedPoint.MAX_EXCEPTION_STACK_LENGTH);
}
}
......@@ -14,7 +14,7 @@ import com.ai.cloud.skywalking.util.ContextGenerator;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LocalBuriedPointSender implements IBuriedPointSender {
public class LocalBuriedPointSender extends ApplicationExceptionHandler implements IBuriedPointSender {
private static Logger logger = Logger.getLogger(IBuriedPointSender.class.getName());
......@@ -53,8 +53,5 @@ public class LocalBuriedPointSender implements IBuriedPointSender {
}
}
public void handleException(Throwable e) {
Span span = Context.getLastSpan();
span.handleException(e, Config.BuriedPoint.MAX_EXCEPTION_STACK_LENGTH);
}
public void handleException(Throwable e) {}
}
package com.ai.cloud.skywalking.buriedpoint;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.ai.cloud.skywalking.api.IBuriedPointReceiver;
import com.ai.cloud.skywalking.buffer.ContextBuffer;
import com.ai.cloud.skywalking.conf.AuthDesc;
......@@ -10,10 +13,7 @@ import com.ai.cloud.skywalking.model.Identification;
import com.ai.cloud.skywalking.protocol.Span;
import com.ai.cloud.skywalking.util.ContextGenerator;
import java.util.logging.Level;
import java.util.logging.Logger;
public class RPCBuriedPointReceiver implements IBuriedPointReceiver {
public class RPCBuriedPointReceiver extends ApplicationExceptionHandler implements IBuriedPointReceiver {
private static Logger logger = Logger.getLogger(LocalBuriedPointSender.class.getName());
......@@ -44,9 +44,4 @@ public class RPCBuriedPointReceiver implements IBuriedPointReceiver {
Context.append(spanData);
}
public void handleException(Throwable e) {
Span span = Context.getLastSpan();
span.handleException(e, Config.BuriedPoint.MAX_EXCEPTION_STACK_LENGTH);
}
}
......@@ -15,7 +15,7 @@ import com.ai.cloud.skywalking.util.TraceIdGenerator;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ThreadBuriedPointSender implements IBuriedPointSender {
public class ThreadBuriedPointSender extends ApplicationExceptionHandler implements IBuriedPointSender {
private static Logger logger = Logger.getLogger(ThreadBuriedPointSender.class.getName());
......@@ -71,8 +71,4 @@ public class ThreadBuriedPointSender implements IBuriedPointSender {
}
}
public void handleException(Throwable e) {
Span span = Context.getLastSpan();
span.handleException(e, Config.BuriedPoint.MAX_EXCEPTION_STACK_LENGTH);
}
}
......@@ -14,7 +14,7 @@ import com.ai.cloud.skywalking.util.ContextGenerator;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ThreadFactoryBuriedPointSender implements IBuriedPointSender {
public class ThreadFactoryBuriedPointSender extends ApplicationExceptionHandler implements IBuriedPointSender {
private static Logger logger = Logger.getLogger(ThreadBuriedPointSender.class.getName());
......@@ -49,10 +49,4 @@ public class ThreadFactoryBuriedPointSender implements IBuriedPointSender {
ContextBuffer.save(spanData);
}
}
public void handleException(Throwable e) {
Span span = Context.getLastSpan();
span.handleException(e, Config.BuriedPoint.MAX_EXCEPTION_STACK_LENGTH);
}
}
......@@ -3,9 +3,9 @@ package com.ai.cloud.skywalking.conf;
public class Config {
public static class SkyWalking {
public static String USER_ID;
public static String USER_ID = "";
public static String APPLICATION_CODE;
public static String APPLICATION_CODE = "";
}
public static class BuriedPoint {
......@@ -16,6 +16,8 @@ public class Config {
// Business Key 最大长度
public static int BUSINESSKEY_MAX_LENGTH = 300;
public static String EXCLUSIVE_EXCEPTIONS = "";
}
public static class Consumer {
......
package com.ai.cloud.skywalking.protocol;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Span extends SpanData {
private Logger logger = Logger.getLogger(Span.class.getName());
public Span() {
}
public Span(String traceId, String applicationID, String userId) {
this.traceId = traceId;
this.applicationId = applicationID;
this.userId = userId;
}
public Span(String traceId, String parentLevelId, int levelId, String applicationID, String userId) {
this.traceId = traceId;
this.applicationId = applicationID;
this.parentLevel = parentLevelId;
this.userId = userId;
this.levelId = levelId;
}
public Span(String originData) {
String[] fieldValues = originData.split(SPAN_FIELD_SPILT_PATTERN);
traceId = fieldValues[0].trim();
parentLevel = fieldValues[1].trim();
levelId = Integer.valueOf(fieldValues[2]);
viewPointId = fieldValues[3].trim();
startDate = Long.valueOf(fieldValues[4]);
cost = Long.parseLong(fieldValues[5]);
address = fieldValues[6].trim();
statusCode = Byte.valueOf(fieldValues[7].trim());
//异常情况才会存在exceptionStack
if (statusCode == 1) {
exceptionStack = fieldValues[8].trim().replaceAll(SPAN_ATTR_SPILT_CHARACTER,
NEW_LINE_CHARACTER_PATTERN);
}
spanType = fieldValues[9];
isReceiver = Boolean.valueOf(fieldValues[10]);
businessKey = fieldValues[11].trim().replaceAll(SPAN_ATTR_SPILT_CHARACTER,
NEW_LINE_CHARACTER_PATTERN);
processNo = fieldValues[12].trim();
applicationId = fieldValues[13].trim();
userId = fieldValues[14].trim();
this.originData = originData;
}
@Override
public String toString() {
StringBuilder toStringValue = new StringBuilder();
toStringValue.append(traceId + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(parentLevel)) {
toStringValue.append(parentLevel + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(levelId + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(viewPointId)) {
toStringValue.append(viewPointId + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(startDate + SPAN_FIELD_SPILT_PATTERN);
toStringValue.append(cost + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(address)) {
toStringValue.append(address + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(statusCode + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(exceptionStack)) {
//换行符在各个系统中表现不一致,
//windows平台的换行符为/r/n
//linux平台的换行符为/n
toStringValue.append(exceptionStack.replaceAll(CARRIAGE_RETURN_CHARACTER_PATTERN, "")
.replaceAll(NEW_LINE_CHARACTER_PATTERN, SPAN_ATTR_SPILT_CHARACTER)
+ SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(spanType + SPAN_FIELD_SPILT_PATTERN);
toStringValue.append(isReceiver + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(businessKey)) {
//换行符在各个系统中表现不一致,
//windows平台的换行符为/r/n
//linux平台的换行符为/n
toStringValue.append(businessKey.replaceAll(CARRIAGE_RETURN_CHARACTER_PATTERN, "")
.replaceAll(NEW_LINE_CHARACTER_PATTERN, SPAN_ATTR_SPILT_CHARACTER)
+ SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
if (isNonBlank(processNo)) {
toStringValue.append(processNo + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
if (isNonBlank(applicationId)) {
toStringValue.append(applicationId + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
if (isNonBlank(userId)) {
toStringValue.append(userId);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
return toStringValue.toString();
}
protected boolean isNonBlank(String str) {
return str != null && str.length() > 0;
}
public void handleException(Throwable e, int maxExceptionStackLength) {
this.statusCode = 1;
ByteArrayOutputStream buf = new ByteArrayOutputStream();
StringBuilder expMessage = new StringBuilder();
Throwable causeException = e;
while (causeException != null && (causeException.getCause() != null || expMessage.length() < maxExceptionStackLength)) {
causeException.printStackTrace(new java.io.PrintWriter(buf, true));
expMessage.append(buf.toString());
causeException = causeException.getCause();
}
try {
buf.close();
} catch (IOException e1) {
logger.log(Level.ALL, "Close exception stack input stream failed");
}
this.exceptionStack = expMessage.toString();
}
private Logger logger = Logger.getLogger(Span.class.getName());
public Span() {
}
public Span(String traceId, String applicationID, String userId) {
this.traceId = traceId;
this.applicationId = applicationID;
this.userId = userId;
}
public Span(String traceId, String parentLevelId, int levelId,
String applicationID, String userId) {
this.traceId = traceId;
this.applicationId = applicationID;
this.parentLevel = parentLevelId;
this.userId = userId;
this.levelId = levelId;
}
public Span(String originData) {
String[] fieldValues = originData.split(SPAN_FIELD_SPILT_PATTERN);
traceId = fieldValues[0].trim();
parentLevel = fieldValues[1].trim();
levelId = Integer.valueOf(fieldValues[2]);
viewPointId = fieldValues[3].trim();
startDate = Long.valueOf(fieldValues[4]);
cost = Long.parseLong(fieldValues[5]);
address = fieldValues[6].trim();
statusCode = Byte.valueOf(fieldValues[7].trim());
// 异常情况才会存在exceptionStack
if (statusCode == 1) {
exceptionStack = fieldValues[8].trim().replaceAll(
SPAN_ATTR_SPILT_CHARACTER, NEW_LINE_CHARACTER_PATTERN);
}
spanType = fieldValues[9];
isReceiver = Boolean.valueOf(fieldValues[10]);
businessKey = fieldValues[11].trim().replaceAll(
SPAN_ATTR_SPILT_CHARACTER, NEW_LINE_CHARACTER_PATTERN);
processNo = fieldValues[12].trim();
applicationId = fieldValues[13].trim();
userId = fieldValues[14].trim();
this.originData = originData;
}
@Override
public String toString() {
StringBuilder toStringValue = new StringBuilder();
toStringValue.append(traceId + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(parentLevel)) {
toStringValue.append(parentLevel + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(levelId + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(viewPointId)) {
toStringValue.append(viewPointId + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(startDate + SPAN_FIELD_SPILT_PATTERN);
toStringValue.append(cost + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(address)) {
toStringValue.append(address + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(statusCode + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(exceptionStack)) {
// 换行符在各个系统中表现不一致,
// windows平台的换行符为/r/n
// linux平台的换行符为/n
toStringValue.append(exceptionStack.replaceAll(
CARRIAGE_RETURN_CHARACTER_PATTERN, "").replaceAll(
NEW_LINE_CHARACTER_PATTERN, SPAN_ATTR_SPILT_CHARACTER)
+ SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
toStringValue.append(spanType + SPAN_FIELD_SPILT_PATTERN);
toStringValue.append(isReceiver + SPAN_FIELD_SPILT_PATTERN);
if (isNonBlank(businessKey)) {
// 换行符在各个系统中表现不一致,
// windows平台的换行符为/r/n
// linux平台的换行符为/n
toStringValue.append(businessKey.replaceAll(
CARRIAGE_RETURN_CHARACTER_PATTERN, "").replaceAll(
NEW_LINE_CHARACTER_PATTERN, SPAN_ATTR_SPILT_CHARACTER)
+ SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
if (isNonBlank(processNo)) {
toStringValue.append(processNo + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
if (isNonBlank(applicationId)) {
toStringValue.append(applicationId + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
if (isNonBlank(userId)) {
toStringValue.append(userId);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
return toStringValue.toString();
}
protected boolean isNonBlank(String str) {
return str != null && str.length() > 0;
}
public void handleException(Throwable e,
List<String> exclusiveExceptionList, int maxExceptionStackLength) {
this.statusCode = 1;
ByteArrayOutputStream buf = new ByteArrayOutputStream();
StringBuilder expMessage = new StringBuilder();
Throwable causeException = e;
while (causeException != null
&& (causeException.getCause() != null || expMessage.length() < maxExceptionStackLength)) {
causeException.printStackTrace(new java.io.PrintWriter(buf, true));
expMessage.append(buf.toString());
causeException = causeException.getCause();
}
try {
buf.close();
} catch (IOException e1) {
logger.log(Level.ALL, "Close exception stack input stream failed");
}
this.exceptionStack = expMessage.toString();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册