Browse Source
* set root cause as the exception_name in micrometer tags * set root cause as the exception_name in other metrics system * set root cause as the exception_name in other metrics system * Update ExceptionUtilsTest.java * reformat * reformat * add root_cause_name instead of changing exception_name Co-authored-by: Marvin Froeder <velo@users.noreply.github.com>pull/1889/head
chao-chang-paypay
2 years ago
committed by
GitHub
9 changed files with 111 additions and 4 deletions
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
/* |
||||
* Copyright 2012-2022 The Feign Authors |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
||||
* in compliance with the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License |
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
||||
* or implied. See the License for the specific language governing permissions and limitations under |
||||
* the License. |
||||
*/ |
||||
package feign.utils; |
||||
|
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
public class ExceptionUtils { |
||||
/** |
||||
* Introspects the {@link Throwable} to obtain the root cause. |
||||
* |
||||
* <p> |
||||
* This method walks through the exception chain to the last element, "root" of the tree, using |
||||
* {@link Throwable#getCause()}, and returns that exception. |
||||
* |
||||
* @param throwable the throwable to get the root cause for, may be null |
||||
* @return the root cause of the {@link Throwable}, {@code null} if null throwable input |
||||
*/ |
||||
public static Throwable getRootCause(Throwable throwable) { |
||||
if (throwable == null) { |
||||
return null; |
||||
} |
||||
Throwable rootCause = throwable; |
||||
// this is to avoid infinite loops for recursive cases
|
||||
final Set<Throwable> seenThrowables = new HashSet<>(); |
||||
seenThrowables.add(rootCause); |
||||
while ((rootCause.getCause() != null && !seenThrowables.contains(rootCause.getCause()))) { |
||||
seenThrowables.add(rootCause.getCause()); |
||||
rootCause = rootCause.getCause(); |
||||
} |
||||
return rootCause; |
||||
} |
||||
} |
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
/* |
||||
* Copyright 2012-2022 The Feign Authors |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
||||
* in compliance with the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License |
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
||||
* or implied. See the License for the specific language governing permissions and limitations under |
||||
* the License. |
||||
*/ |
||||
package feign.utils; |
||||
|
||||
import org.junit.Test; |
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
public class ExceptionUtilsTest { |
||||
@Test |
||||
public void rootCauseOfNullIsNull() { |
||||
Throwable e = null; |
||||
Throwable rootCause = ExceptionUtils.getRootCause(e); |
||||
assertThat(rootCause).isNull(); |
||||
} |
||||
|
||||
@Test |
||||
public void rootCauseIsSelf() { |
||||
Throwable e = new Exception(); |
||||
Throwable rootCause = ExceptionUtils.getRootCause(e); |
||||
assertThat(rootCause).isSameAs(e); |
||||
} |
||||
|
||||
@Test |
||||
public void rootCauseIsDifferent() { |
||||
Throwable rootCause = new Exception(); |
||||
Throwable e = new Exception(rootCause); |
||||
Throwable actualRootCause = ExceptionUtils.getRootCause(e); |
||||
assertThat(actualRootCause).isSameAs(rootCause); |
||||
} |
||||
} |
Loading…
Reference in new issue