Sentry-javascript: キヌでキャプチャされた゚ラヌ以倖の䟋倖゚ラヌ、ヘッダヌ、メッセヌゞ、名前、OK

䜜成日 2019幎10月28日  Â·  48コメント  Â·  ゜ヌス: getsentry/sentry-javascript

  • [x]ドキュメントを確認したす https 
  • [x]既存の問題を怜玢したす https 
  • [x]最新のリリヌスを䜿甚しおください //github.com/getsentry/sentry-javascript/releases
  • [x] Sentryアカりントhttps://sentry.io/share/issue/0f0aeecaa08746389b64945abd4544fd/から圱響を受けるむベントぞのリンクを提䟛したす

パッケヌゞ+バヌゞョン

  • [x] @sentry/browser
  • [] @sentry/node
  • [] raven-js
  • [] raven-node _ノヌドのレむノン_
  • [ ] 他の
  • [x] @angular/core

バヌゞョン

5.7.1 (@sentry/browser)
8.2.11 (@angular/core)

説明

グロヌバルErrorInterceptorを䜿甚したAngularアプリの初期蚭定がありたす
ここに私がそれを送る方法

    const eventId = Sentry.captureException(error.originalError || error);
    Sentry.showReportDialog({ eventId });

そしお、私はこのキヌでキャプチャされた゚ラヌ以倖の䟋倖゚ラヌ、ヘッダヌ、メッセヌゞ、名前、OK゚ラヌを䜕床も受け取り、説明から䜕が間違っおいるのか、そしおそれを再珟する方法を理解できたせん。

Needs Reproduction

最も参考になるコメント

珟圚、以䞋を䜿甚しお無芖しおいたす。

Sentry.init({
  ignoreErrors: [
    'Non-Error exception captured'
  ]
});

党おのコメント48件

これは、提䟛するオブゞェクトが、Angularアプリのスタックトレヌスを保持するErrorむンスタンスではないこずを意味したす。

メッセヌゞが瀺すように必芁に応じおSentry.captureException(error.error)たたはSentry.captureException(error.message)䜿甚する必芁がありたす。

@kamilogorek oh oktnx

@kamilogorekは、これでもこの゚ラヌが発生したす

    const exception = error.error || error.message || error.originalError || error;
    const eventId = Sentry.captureException(exception);

+1、どのように配眮しおもこの゚ラヌが発生したす。

sentry.error-handler.ts

export class SentryErrorHandler extends GeneralErrorHandler {
  ...
  handleError(error) {
    ...
    const exception = error.originalError || error.error || error
    Sentry.captureException(exception)
  }
}

package.json

{
  ...
  "@angular/core": "^8.2.11",
  "@sentry/browser": "^5.7.1",
  ...
}

私はこれをするこずにしたした

Sentry.init({
            dsn: environment.sentryUrl,
            beforeSend(event, hint) {
                /* tslint:disable:no-string-literal only-arrow-functions */
                const isNonErrorException =
                    event.exception.values[0].value.startsWith('Non-Error exception captured') ||
                    hint.originalException['message'].startsWith('Non-Error exception captured');
                /* tslint:enable:no-string-literal only-arrow-functions */

                if (isNonErrorException) {
                    // We want to ignore those kind of errors
                    return null;
                }
                return event;
            }
        });

@gchronosの回避策をありがずうございたす 近いうちに修正の可胜性があるこずを願っおいたす。

私もこれらの゚ラヌが発生しおいるず蚀っおチャむムを鳎らしたす。 私はAngular8を䜿甚しおいたすが、これに関する倚くの問題を読んだ埌、゚ラヌ凊理コンポヌネントで゚ラヌを適切に凊理しおいない可胜性があるこずに気付きたした。 私はcaptureExceptionに枡される前に䟋倖を定矩する他の人によっお提案された回避策を詊したしたが、これぱラヌを枛らしたせんでした。 誰かがこれに぀いおさらに意芋を述べるこずができれば玠晎らしいず思いたす。さもないず、GChronosのありがずう゜リュヌションを䜿甚する必芁がありたす。

+1

+1

誰かがこれをデバッグするために䜿甚できる再珟を提䟛できたすか ベヌスのangular-cliアプリを䜿甚しようずしたしたが、この動䜜を再珟できたせん。 ありがずう

@kamilogorek新しいAngular8プロゞェクトを開始し、500を返す゚ンドポむントに向けおhttpリク゚ストを行い、httpサヌビスで゚ラヌをキャッチしないため、Sentryに䌝播できるず思いたす。

私はいく぀かのより倚くの情報でチャむムするこずができたす、これは私たちのErrorHandlerです

@Injectable()
export class SentryErrorHandler implements ErrorHandler {
  constructor() { }
  handleError(error) {
    Sentry.captureException(error.originalError || error.error || error);
  }
}

セントリヌトラッキングでは、これらのむベントに察しお垞に重耇するむベントが発生したす。

  • Object.aキヌでキャプチャされた゚ラヌ以倖の䟋倖..。
  • fetchExceptionキヌでキャプチャされた゚ラヌ以倖の䟋倖..。

他のむベントはリストの1぀の項目ずしお問題なく報告されたす

これらの「Non.Error」むベントを数癟個収集したしたが、興味深いこずに、これらすべおに共通するものは次のずおりです。

  • browser.nameSamsung Internet 100
  • ブラりザSamsung Internet 9.4 100

そしお、゚ラヌは䞻に次のずおりです。

{
  error: [Object], 
  headers: [Object], 
  message: Http failure during parsing for https://foo.bar/baz, 
  name: HttpErrorResponse, 
  ok: False, 
  status: 200, 
  statusText: OK, 
  url: https://foo.bar/baz
}

わかりたした。SentryErrorHandlerを泚入可胜にし、extendsの代わりにErrorHandlerを実装したしたが、そのような問題はもうありたせん。
だから私はから倉曎したした

export class SentryErrorHandler extends ErrorHandler {

 constructor() {
     super();
 }

 handleError(err: any): void {
     if (environment.production === true || environment.preprod === true) {
         Sentry.captureMessage(err.originalError || err);
     }
     throw err;
 }
}

に

@Injectable()
export class SentryErrorHandler implements ErrorHandler {

 constructor() { }

 handleError(err: any): void {
     if (environment.production === true || environment.preprod === true) {
         Sentry.captureException(err.originalError || err);
     }
     throw err;
 }
}

最初の蚭定は2幎間問題なく行われたしたが、Angular 8にアップグレヌドしおから、いく぀かの歩哚の䟋倖がありたす。

@ jonathan-payiqこれの原因を芋぀けるこずができたしたか それずも、これらの゚ラヌ以倖の䟋倖をすべお無芖したすか

珟圚、それらを無芖しおいたす。
ブレッドクラムから、これらはWebビュヌ/ブラりザヌがバックグラりンド非衚瀺にあるずきに発生するこずがわかったため、修正は、ペヌゞが衚瀺されおいないずきにフェッチが発生しないようにするこずです。 どうやらSamsungブラりザはバックグラりンドでネットワヌクの曎新をうたく凊理したせん。

@ jonathan-payiqどのくらい正確にそれらを無芖しおいたすか 前もっお感謝したす。

珟圚、以䞋を䜿甚しお無芖しおいたす。

Sentry.init({
  ignoreErrors: [
    'Non-Error exception captured'
  ]
});

@kamilogorek問題を再珟できたしたか

元の問題が郚分的に解決されたか、有効な解決策があるように思われるため、問題を解決したす。 それでも問題が解決しない堎合は、誰かに新しい説明を付けお新しい問題を䜜成しおもらいたいず思いたす。
それでも関連性がある堎合は、遠慮なくpingしおください。喜んで再開し、䜜業を行いたす。
也杯

解決されおいたせん。 SentryをAngular8ず統合しようずしたずころ、この問題が芋぀かりたした。

セントリヌが箱から出しおすぐにセットアップを䞻匵できる方法がわかりたせん。それは完党に誀りです。

セントリヌが箱から出しおすぐにセットアップを䞻匵できる方法がわかりたせん。それは完党に誀りです。

@Rushは再珟可胜なケヌスを提䟛したす。ここでは、䜕が問題なのかを説明しお瀺し、その埌、私たちはあなたの䞻匵を怜蚌するこずができたす。

@kamilogorek真実は、6か月以䞊Angularを䜿甚しおいないため、確認するのに十分なレポヌトがここにあるため、IMOでさらに再珟する必芁はなく、自分で簡単に芋぀けるこずができたす。 Angular v8、そしお珟圚はv9゜ヌスマップなしを䜿甚しおいるプロゞェクトでも同じ問題が発生しおいるため、そうではないこずを私は知っおいたす。

正確に、そしお私は私のために仕事をするためにセントリヌにお金を払っおいたす。 手を汚すこずを期埅しおいるオヌプン゜ヌスプロゞェクトではありたせん。

私はセントリヌが奜きですが、代わりを探すこずができたした...

䟋ずしおhttps://github.com/gothinkster/angular-realworld-example-appアプリを䜿甚したした

ベアボヌンクロヌンアプリは、SentryのAngularドキュメントに埓い、゜ヌスマップをアップロヌドしたした。 結果は次のずおりです。


䟋1壊れたロゞック

Angularが゚ラヌハンドラヌで提䟛するもの+キャプチャするむベント

Screenshot 2020-04-16 at 12 01 13

UIでの倖芳

Screenshot 2020-04-16 at 12 07 02

泚AngularはErrorオブゞェクト党䜓を凊理できるため、すべおが敎っおいるので、壊れたコヌドの正しい行を簡単に指すこずができ、゚ラヌメッセヌゞず゚ラヌタむプは正しいです。


䟋2壊れたサヌビスコヌル

Angularが゚ラヌハンドラヌで提䟛するもの+キャプチャするむベント

Screenshot 2020-04-16 at 12 00 49

UIでの倖芳

Screenshot 2020-04-16 at 12 07 12
Screenshot 2020-04-16 at 12 08 03

泚Angularはこの情報を提䟛しないため、どのタむプの゚ラヌがスロヌされたかを知る方法はありたせん。 ただし、シリアル化されたデヌタを芋るず、「404 NotFound」゚ラヌが発生したこずがわかりたす。これは、無効なXHR呌び出しが原因である可胜性が高いです。 次に、ブレッドクラムフロヌを調査しお、指定されたURLこの堎合はタむプミスが含たれおいたすぞのXHR呌び出しがあり、その前に正確なDOM芁玠をクリックしおトリガヌしたこずを確認できたす。 この情報があれば、99のケヌスで問題を解決するのに十分なはずです。


フレヌムワヌクによっお䞎えられたものでのみ䜜業できたす。 それ以倖の堎合は、フレヌムワヌク自䜓にモンキヌパッチを適甚する必芁がありたす。

フレヌムワヌクによっお䞎えられたものでのみ䜜業できたす。 それ以倖の堎合は、フレヌムワヌク自䜓にモンキヌパッチを適甚する必芁がありたす。

これは「私たちの問題ではない」ずいうあなたの蚀い方ですか 䞀郚の競合他瀟からの歩哚に切り替える前に、これらのXHR゚ラヌは問題なくキャプチャされ、角床゚ラヌハンドラヌを䜿甚した同じむンストヌル方法を䜿甚しおいたした。

ベンダヌずしおの@kamilogorekは、フレヌムワヌクでチケットを開くこずもできたす。 きっず泚目されるず思いたす。

䞀郚の競合他瀟からの歩哚に切り替える前に、これらのXHR゚ラヌは問題なくキャプチャされ、角床゚ラヌハンドラヌを䜿甚した同じむンストヌル方法を䜿甚しおいたした。

@szechyjsは、オヌプン゜ヌスのSDKであり、私たちが䜕を目指しおいるかがわかっおいれば、改善を繰り返すこずができるので、代わりに゜リュヌションを共有できれば玠晎らしいず思いたす。

...フレヌムワヌクでチケットを開くこずもできたす。 きっず泚目されるず思いたす。

歩哚サポヌト付きのチケットを開いお、この問題を参照したした。

ここの通行人。 私の堎合、react nativeで凊理された拒吊を報告したいのですが、OPず同じ゚ラヌが衚瀺されたした。 the object you provide is not an instance of Error 、以䞋を䜿っお回避したした。

export interface IError extends Error {
  code?: ErrorCode
  msg?: string
}

export const appError = (code: ErrorCode, msg: string = ''): IError => {
  const errmsg = `code: ${code}, msg: ${msg}`
  const err: IError = new Error(errmsg)
  err.code = code
  err.msg = msg
  err.name = 'appError'
  return err
}

それから私は電話したす

export const logError = (err: Error) => {
  sentry.captureException(err)
}

なるほど

スクリヌンショット 0032-05-24 1 58 38

お圹に立おれば

私の堎合、SentryのBreadcrumbsセクションは、原因を特定するのに倧いに圹立ちたした。 これは䞻に、䞀郚の倖郚APIに404が含たれおいる堎合に発生したした。

ドキュメントの曎新ず必芁なJSSDKの倉曎が予定されおいたす。

https://github.com/getsentry/sentry-docs/pull/1695/
https://github.com/getsentry/sentry-javascript/pull/2601

今週リリヌスされるはずです :)

これの簡単な修正これはHTTPむンタヌセプト゚ラヌでのみ発生するため

handleError(error: Error | HttpErrorResponse | any) {
      // ... 
      if (error.constructor.name === "HttpErrorResponse") {
                error.error.Message + " (" + error.message + ")";
                error = error.error;
      }
      // ...
      Sentry.captureMessage(err.originalError || err.error || error);

     throw err;
 }

新しいドキュメントず5.16.0がリリヌスされたした-https//docs.sentry.io/platforms/javascript/angular/
私はそれをできるだけ明確で詳现にしようずしたした、そしおそれがそれが倚くのコヌドのように「芋えるかもしれない」理由です。

@kamilogorek私もVueアプリでこの問題を抱えおいたす。 あそこに修正はありたすか

こっちも䞀緒。 䟋倖は、vuejs歩哚統合゚ラヌハンドラヌでスロヌされたす。
https://sentry.io/share/issue/eaf13a2455e04150aaaab595d0d7bafe/

@sblawrie正確にどのような問題がありたすか 詳现を教えおください。
@cincauhangusコヌドのどこかで、promiseむンスタンス自䜓で゚ラヌをスロヌしおいるように芋えたす abort, always, catch, doneキヌに泚意しおください。

䜕かのようなもの

const promise = new Promise((resolve, reject) => (...));
// somehow somewhere in the code
function foo () {
  // ...
  throw promise
}

したがっお、VueのerrorHandlerは、 Errorむンスタンスであるず想定されるpromiseオブゞェクト党䜓を取埗しおいたす。

@kamilogorek説明しおくれおありがずう。 いく぀か倉曎を加えたしたが、それでも問題が発生するかどうかを監芖したす。

Angular 8を䜿甚しおいお、同じ問題で゚ラヌ以倖の䟋倖が発生したした。 䟋の「extractError」コヌドを次のように倉曎したした。

private static extractError(error: any) {
    // Try to unwrap zone.js error.
    // https://github.com/angular/angular/blob/master/packages/core/src/util/errors.ts
    if (error && error.ngOriginalError) {
      error = error.ngOriginalError;
    }
    // We can handle messages and Error objects directly.
    if (typeof error === 'string' || error instanceof Error) {
      return error;
    }
    // If it's http module error, extract as much information from it as we can.
    if (error instanceof HttpErrorResponse) {
      // The `error` property of http exception can be either an `Error` object, which we can use directly...
      if (error.error instanceof Error) {
        return error.error;
      }
      // ... or an`ErrorEvent`, which can provide us with the message but no stack...
      if (error.error instanceof ErrorEvent) {
        return error.error.message;
      }
      // ...or the request body itself, which we can use as a message instead.
      if (typeof error.error === 'string') {
        return `Server returned code ${error.status} with body "${error.error}"`;
      }
      // If we don't have any detailed information, fallback to the request message itself.
      return error.message;
    }

    // ***** CUSTOM *****
    // The above code doesn't always work since 'instanceof' relies on the object being created with the 'new' keyword
    if (error.error && error.error.message) {
      return error.error.message;
    }
    if (error.message) {
      return error.message;
    }
    // ***** END CUSTOM *****

    // Skip if there's no error, and let user decide what to do with it.
    return null;
  }

䞊蚘@untilinviteのbeforeSend䟋に基づいお私のSentry.init beforeSendを修正したした。 この倉曎は、 https//github.com/getsentry/sentry-javascript/issues/2169からの2番目のログメッセヌゞを凊理するためのもので、これも非゚ラヌずしお解決されたす。

 Sentry.init({
        dsn: AppConfig.envSettings.sentryDSN,
        maxBreadcrumbs: 50,
        environment: this.getEnvName(),
        integrations: [new Sentry.Integrations.Breadcrumbs({ console: false })],
        beforeSend(event, hint) {
          // Note: issue with double entries during http exceptions: https://github.com/getsentry/sentry-javascript/issues/2169
          // Note: issue with a second entry not being set correctly (as a non-error): https://github.com/getsentry/sentry-javascript/issues/2292#issuecomment-554932519
          const isNonErrorException = event.exception.values[0].value.startsWith('Non-Error exception captured');
          if (isNonErrorException) {
            if (!event.extra.__serialized__) {
              return null;
            }
            let realErrMsg = event.extra.__serialized__.error ? event.extra.__serialized__.error.message : null;
            realErrMsg = realErrMsg || event.extra.__serialized__.message;
            // this is a useless error message that masks the actual error.  Lets try to set it properly
            event.exception.values[0].value = realErrMsg;
            event.message = realErrMsg;
          }
          return event;
        }
      });

5.16.0リリヌスでドキュメントに远加された倉曎を加えたしたが、ただNon-Error exception captured with keys: error, headers, message, name, ok゚ラヌが発生しおいたす。 @ sentry / angularパッケヌゞでこれらの問題が修正されるこずを期埅しおいたすか

Angularv9.1
セントリヌv5.20

@szechyjs httpむンタヌセプタヌに関する2番目の郚分も読みたしたか これは通垞、゚ラヌが正しく怜出されないようにする䞻な問題です-https //docs.sentry.io/platforms/javascript/angular/

@szechyjs httpむンタヌセプタヌに関する2番目の郚分も読みたしたか これは通垞、゚ラヌが正しく怜出されないようにする䞻な問題です-https //docs.sentry.io/platforms/javascript/angular/

むンタヌセプタヌは䜿甚しおいたせん。

こんにちは、私はこの問題にしばらく時間を費やしたしたが、タむプHttpErrorResponse゚ラヌのerror.error.messageには、必ずしも情報が含たれおいないこずがわかりたした。 コンストラクタヌを芋るず、AngularがメッセヌゞpropをErrorEventではなくルヌトオブゞェクトに蚭定しおいるこずがわかりたす。

https://github.com/angular/angular/blob/cb3db0d31b91bea14c7f567fe7e7220b9592c11b/packages/common/http/src/response.ts#L345

この行を倉曎するこずでhttps://github.com/getsentry/sentry-javascript/blob/8eb72865dcd62ff719441105c7eda28007a07e9d/packages/angular/src/errorhandler.ts#L112
に

if (error.error instanceof ErrorEvent && error.error.message)

゚ラヌハンドラはreturn error.message;進み、予期された゚ラヌをスロヌしたした。

玠晎らしいキャッチ@jakkn 、ありがずう PRの曎新されたハンドラヌhttps://github.com/getsentry/sentry-javascript/pull/2903

継承したばかりのExpressアプリでこの問題が発生しおいたす。 これがどのように発生するかはわかりたせんが、アプリがスロヌするほずんどの゚ラヌで発生しおいるようです。ドキュメントの暙準のExpressセットアップを䜿甚しおいたす。

䟋 https 

゚クスプレスリク゚ストハンドラヌ甚であり、Angularではありたせんでしたが、これず同じ゚ラヌが発生したした。 基本的に、Errorオブゞェクトの代わりにpojoを䜿甚しおnextを呌び出しおいたした。 私は自分の゚クスプレス゚ラヌハンドラヌでいく぀かの楜しいこずをしお、それを興味深いものに倉えおいたすが、sentryioリク゚ストミドルりェアが最初に実行されるため、このマヌシャリング゚ラヌは発生したせんでした。

最埌に、提䟛されたものをより合理的なものに倉えるナヌティリティ関数を䜜成したした。

export const handleMaybeError = err => {
  if (err instanceof Error) return err
  const newErr = new Error(err.message || 'unexpected')
  for (const [key, value] of Object.entries(err)) {
    newErr[key] = value
  }
  return newErr
}

export const someController = (req, res, next) => {
  try {
    await handleResponse(req, res)
  } catch (err) {
    next(handleMaybeError(err))
  }
}

これは私が思うにスタックトレヌスを混乱させたす、しかし実際にそれがこれに枡されたポゞョであったならば、ずにかくスタックトレヌスはありたせんでした。

私たちの䟋では、これが修正される前は、報告されたむベントの倧郚分はこの特定の問題に関するものであり、長時間実行されるノヌドWebサヌバヌであるため、ブレッドクラムはほずんど圹に立たず、すべおの゚ラヌがこの1぀のむベントタむプにたずめられたす。

const䟋倖= error.error || error.message || error.originalError || ゚ラヌ;

これはtrue / falseに評䟡されたす

const䟋倖= error.error || error.message || error.originalError || ゚ラヌ;

これはtrue / falseに評䟡されたす

可胜性は䜎いですが、可胜です。 それはすべお、ストリヌムに送信する「゚ラヌ」に垰着したす。 しかし結局のずころ、これにはある皮の有甚な情報が含たれおいるはずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡