Java 岗哨分组

Java 岗哨分组,java,jakarta-ee,sentry,Java,Jakarta Ee,Sentry,我想用Sentry对异常进行分组,异常来自不同的服务器,但我想将所有异常按类型分组在一起,例如,将所有NPE分组。我知道您可以扩展EventBuilderHelper,这就是sentry分组的方式,但sentry java不提供发送带有方法、错误类型等指纹的事件的功能,其他SDK如docs.sentry.io中的示例 function makeRequest(method, path, options) { return fetch(method, path, options).catc

我想用Sentry对异常进行分组,异常来自不同的服务器,但我想将所有异常按类型分组在一起,例如,将所有NPE分组。我知道您可以扩展EventBuilderHelper,这就是sentry分组的方式,但sentry java不提供发送带有方法、错误类型等指纹的事件的功能,其他SDK如docs.sentry.io中的示例

function makeRequest(method, path, options) {
    return fetch(method, path, options).catch(err => {
        Sentry.withScope(scope => {
          // group errors together based on their request and response
          scope.setFingerprint([method, path, err.statusCode]);
          Sentry.captureException(err);
        });
    });
}
这就是我试图做的,但在这个范围内,我不知道方法、错误等

package com.test;

import io.sentry.SentryClient;
import io.sentry.event.EventBuilder;
import io.sentry.event.helper.ContextBuilderHelper;

public class FingerprintEventBuilderHelper extends ContextBuilderHelper {

    private static final String EXCEPTION_TYPE = "exception_type";

    public FingerprintEventBuilderHelper(SentryClient sentryClient) {
        super(sentryClient);
    }

    @Override
    public void helpBuildingEvent(EventBuilder eventBuilder) {
        super.helpBuildingEvent(eventBuilder);
        //Get the exception type
        String exceptionType =
        if (exceptionType != null) {
            eventBuilder.withTag(EXCEPTION_TYPE, exceptionType);
        }
        //Get method information and params
        if (paramX != null) {
            eventBuilder.withTag("PARAM", paramX);
        }
    }
}
发送到服务器的json包含一些关于异常的信息,但我不知道如何获取它

...
    "release": null,
    "dist": null,
    "platform": "java",
    "culprit": "com.sun.ejb.containers.BaseContainer in checkExceptionClientTx",
    "message": "Task execution failed",
    "datetime": "2019-06-26T14:13:29.000000Z",
    "time_spent": null,
    "tags": [
        ["logger", "com.test.TestService"],
        ["server_name", "localhost"],
        ["level", "error"]
    ],
    "errors": [],
    "extra": {
        "Sentry-Threadname": "MainThread",
        "rid": "5ff37e943-f4b4-4hc9-870b-4f8c4d18cf84"
    },
    "fingerprint": ["{{ default }}"],
    "key_id": 3,
    "metadata": {
        "type": "NullPointerException",
        "value": ""
    },
...

您可以获取引发的异常类型,但我对获取跟踪中与函数相关的参数有疑问

EventBuilderHelper myEventBuilderHelper=neweventbuilderHelper(){
公共无效帮助构建事件(EventBuilder EventBuilder){
withMessage(“被myEventBuilderHelper覆盖!”);
映射ifs=eventBuilder.getEvent().getSentryInterfaces();
if(ifs.containsKey(“sentry.interfaces.Exception”))
{
ExceptionInterface exI=(ExceptionInterface)ifs.get(“sentry.interfaces.Exception”);
for(SentryException ex:exI.getExceptions()){
字符串exceptionType=ex.getExceptionClassName();
}
}
}
};
如果查看客户端的
sendException
方法,它将启动带有实际异常的
ExceptionInterface

public void sendException(可丢弃可丢弃){
EventBuilder EventBuilder=(新建EventBuilder())。withMessage(throwable.getMessage())。withLevel(Level.ERROR)。WithEntryInterface(新建ExceptionInterface(throwable));
此.sendEvent(eventBuilder);
}
同样的构造函数是

公共例外界面(可丢弃可丢弃){
这个(SentryException.extractExceptionQueue(throwable));
}
公共例外界面(Deque例外){
这个。例外=例外;
}
因此,每个异常都会转换为一个
SentryException
,但原始异常不会被存储。因此,如果还需要params,则需要使用这些参数引发自定义异常,并重写
sendException
方法,这不是一种简单的方法