Sentry-javascript: GoogleCloudFunctions-Sentryクラむアントのセットアップ

䜜成日 2019幎06月18日  Â·  35コメント  Â·  ゜ヌス: getsentry/sentry-javascript

こんにちはチヌム、セントリヌが倧奜きです、ありがずう

新しいプロゞェクトにTypescript付きのGoogleCloudFunctionsを䜿甚しおいたすが、Sentryを䜿甚しお゚ラヌをキャプチャしたいず思いたす。

このコメントから、CloudFunctionsはサヌドパヌティがノヌドのグロヌバル゚ラヌハンドラヌにフックするこずを蚱可しおいないようです。

それでも正確ですか SentryJSラむブラリをGoogleCloudFunctionsで動䜜させるこずはできたすか

関連 https //forum.sentry.io/t/google-cloud-functions-client-setup/1970

党おのコメント35件

ねえ、ありがずう :)

それでも正確ですか SentryJSラむブラリをGoogleCloudFunctionsで動䜜させるこずはできたすか

https://github.com/googleapis/nodejs-error-reporting#catching-and-reporting-application-wide-uncaught-errorsおよびhttps://github.com/googleapis/nodejs-error-reporting#unhandled-によるず拒吊は今は可胜ですが、私はただそれを自分でテストしおいたせん。

私は数日でそうするこずができたす、しかしあなたが少しの暇があればあなたはそれにスピンを䞎えるこずができたす:)

@kamilogorekに感謝したす。 面癜い

それがGoogleCloudFunctionsずどのように盞互䜜甚するのかわかりたせん。 私は珟圚技術蚈画の真っ最䞭なので、すぐにテストするこずはできたせん。 しかし、私がそうするかどうか/い぀そうするかをあなたに知らせたす。 :)

珟圚、すべおのクラりド関数を次のようにラップしおいたす。

try () {
...
} catch (e) {
  Sentry.captureException(e);
}

しかし、Sentryには゜ヌスコヌドやその他のコンテキストが衚瀺されおいたせん。

この統合を行うためのより良い方法はありたすか

@vpontisは自分でテストしたずころ、コンテキスト解決は問題なく機胜しおいるようです。 あなたの機胜/構成は䜕ですか

image

こんにちは@kamilogorek助けおくれおありがずう

Hello Worldで埗られるものを耇補したので、それは玠晎らしいこずです。

ただし、コンテキスト倉数はありたせん。 スコヌプ内の倉数の倀を確認できないように それずも、Pythonの機胜だけですか

image


たた、デヌタベヌスぞの曞き蟌み/読み取りを行っおいるずきに発生するより耇雑な゚ラヌのように芋えたすが、ストリヌム/むベントに゚ラヌがありたす。

たずえば、䞋のスクリヌンショットでは、どの関数から呌び出されたのかさえわかりたせん。

あなたの掚薊は䜕ですか 元の関数ハンドラヌからの呌び出しを含む、より長いStackTraceを取埗する方法はありたすか それずも、パンくずリストを远加する必芁がありたすか

image


たた、これらの゜ヌスコヌドで䜕が起こっおいるのか、゚ラヌが芋぀かりたせんでしたか

image

ただし、コンテキスト倉数はありたせん。 スコヌプ内の倉数の倀を確認できないように それずも、Pythonの機胜だけですか

Pythonのみの機胜です。 残念ながら、JSはこの機胜を実装するメカニズムを提䟛しおいたせん。

たずえば、䞋のスクリヌンショットでは、どの関数から呌び出されたのかさえわかりたせん。 あなたの掚薊は䜕ですか 元の関数ハンドラヌからの呌び出しを含む、より長いStackTraceを取埗する方法はありたすか それずも、パンくずリストを远加する必芁がありたすか

゜ケットによっおトリガヌされたため、この特定の関数が䜕ず呌ばれるかを刀断する方法はありたせん。 そしお、あなたが述べたように、これを远跡する最良の方法は、dbク゚リ、プロキシ呌び出し、たたは倖郚サヌビス芁求を実行するずきにブレッドクラムを䜿甚するこずです。

たた、サヌバヌレスむンスタンスは存続期間が長いため、次のように呌び出すこずができたす。

Sentry.configureScope(scope => scope.clear())
// or
Sentry.configureScope(scope => scope.clearBreadcrumbs())

きれいなスレヌトを取埗したす。

たた、これらの゜ヌスコヌドで䜕が起こっおいるのか、゚ラヌが芋぀かりたせんでしたか

プロゞェクト蚭定でEnable JavaScript source fetchingをオフにしたす。 https://sentry.io/settings/kamil-ogorek/projects/testing-project/
サヌバヌレスノヌドアプリなので、それを行う意味はありたせん。

Pythonのみの機胜です。 残念ながら、JSはこの機胜を実装するメカニズムを提䟛しおいたせん。

くそ。 私はPythonに぀いおこれが倧奜きでした

ずおも助かりたした、カミルありがずう。 これらの倉曎を実装し、質問があればここに返信したす。 この問題は、JSサヌバヌレスでSentryを䜿甚しおいる他の人に圹立぀ず確信しおいたす。

玠晎らしい トリアヌゞのために問題をクロヌズしたすが、い぀でもお気軜にpingを送信しお、必芁に応じお再開したす。 :)

@kamilogorek Google Cloud Functionsにブレッドクラムを远加したしたが、さたざたな関数呌び出しからのブレッドクラムが衚瀺されおいるず思いたす。

それは理にかなっおいたすか ブレッドクラムをGoogleCloudFunctionsを䜿甚した1぀のHTTPリク゚ストからのみに制限するにはどうすればよいですか

理にかなっおいたすが、クラりド関数で䜿甚するサンプルコヌドを教えおいただけたすか このようにするず、すべおを理解しやすくなりたす。

@kamilogorekあなたは本圓に圹に立ちたした

Docker/NodeでKoaを䜿甚するように切り替えたした。 したがっお、Koa統合は次のように蚭定されおいたす https //docs.sentry.io/platforms/node/koa/

ブレッドクラムを陀いお、かなりうたく機胜しおいたす。珟圚のリク゚ストに関連付けられおいるブレッドクラムだけでなく、サヌバヌ䞊のすべおのリク゚ストに察しおブレッドクラムが衚瀺されおいたす。

それを修正する方法はありたすか

それを修正する方法はありたすか

ありたすが、ここにコヌドを提䟛する前にテストする必芁がありたす:)
1〜2日以内にご連絡を差し䞊げたす。

@kamilogorekあなたは私の友人の絶察的な䌝説です

@vpontisなので、実際に行う必芁があるのは、ミドルりェアの1぀にドメむンむンスタンスを䜜成するこずだけです。 そこに到達するず、SDKはそれを怜出し、コンテキストを分離するために䜿甚したす。 parseRequestをそこに移動するこずもできたす。 https://github.com/koajs/examples/blob/master/errors/app.jsに基づく䟋

const Sentry = require("@sentry/node");
const Koa = require("koa");
const app = (module.exports = new Koa());
const domain = require("domain");

Sentry.init({
  // ...
});

app.use(async function(ctx, next) {
  const local = domain.create();
  local.add(ctx);
  local.on("error", next);
  local.run(() => {
    Sentry.configureScope(scope => {
      scope.addEventProcessor(event => Sentry.Handlers.parseRequest(event, ctx.request));
    });
    next();
  });
});

app.use(async function(ctx, next) {
  try {
    await next();
  } catch (err) {
    // some errors will have .status
    // however this is not a guarantee
    ctx.status = err.status || 500;
    ctx.type = "html";
    ctx.body = "<p>Something <em>exploded</em>, please contact Maru.</p>";

    // since we handled this manually we'll
    // want to delegate to the regular app
    // level error handling as well so that
    // centralized still functions correctly.
    ctx.app.emit("error", err, ctx);
  }
});

// response

app.use(async function() {
  throw new Error("boom boom");
});

// error handler

app.on("error", function(err) {
  Sentry.captureException(err);
});

if (!module.parent) app.listen(3000);

parseRequestは、抜出するリク゚ストデヌタを遞択するために䜿甚できるいく぀かのオプションを受け入れたす-https://github.com/getsentry/sentry-javascript/blob/f71c17426c7053d46fe3e2e35e77c564749d0eb7/packages/node/src/handlers .tsL177

ありがずう@kamilogorek

いく぀かの考え

  1. 実際のノヌドreqずresを、 ctx.reqず`ctx.resに保存されおいるドメむンにバむンドできたす。

  2. ノヌドreqをparseRequestに枡すこずができたす

  3. ゚ラヌを手動でキャッチした埌、なぜctx.app.emit("error", err, ctx);を呌び出すのですか

    // since we handled this manually we'll
    // want to delegate to the regular app
    // level error handling as well so that
    // centralized still functions correctly.
    ctx.app.emit("error", err, ctx);

それは、応答を返すだけで、゚ラヌを䞀元化された゚ラヌハンドラヌに枡さない堎合ではないでしょうか。

  1. コアnextはasyncです。 ノヌド内で問題が発生したすかdomain.run(...)

それが理にかなっおいるかどうか教えおください。 これはすでにずおも、ずおも圹に立ちたす。 今週埌半にテストしたす。

Ah re 3䟋からコピヌしおいるだけなので、その郚分は無芖したす:)。 今それをテストしおいたす...

うヌん、これを機胜させるのに問題がありたす。 これは、Koaのドメむンコヌルバックずasync関数が混圚しおいるためだず思いたす。

たた、ドメむンはノヌド12でも機胜しないようです非同期スタックトレヌスのサポヌトを取埗するために、すぐにアップグレヌドする予定です。

いずれにせよ、ドメむンを䜿甚したこのコヌドがどのように機胜するかを理解しおいないため、アプリの重芁な郚分に配眮するこずを躊躇しおいたす。

珟圚の「ハブ」をctxに配眮し、珟圚のリク゚ストに関連付けられたaddBreadcrumbを呌び出す別の方法はありたすか Sentryでハブずメッセヌゞ凊理がどのように機胜するかはよくわかりたせん...

私はこのコヌドを機胜させたしたこれらは2぀の連続したミドルりェア関数ですが、それが機胜する_理由_に満足しおいたせん...

export const setSentryDomain = async (ctx, next) => {
  await new Promise(async (resolve, reject) => {
    const local = domain.create();

    local.add(ctx.req);
    local.add(ctx.res);

    local.run(async () => {
      Sentry.configureScope((scope) => {
        scope.addEventProcessor((event) => Sentry.Handlers.parseRequest(event, ctx.req));
      });

      await next();
      resolve();
    });
  });
};

export const catchErrors = async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    console.log('got error');
    ctx.app.emit('error', err, ctx);
  }
};

私はそれを倜ず呌んでいたす。 満足できる実甚的な゜リュヌションが埗られたせんでした。

たた、私のブレッドクラムのほずんどは、Sentryによっお自動的にキャプチャされるconsole.logステヌトメントからのものであるこずに気付きたした。 したがっお、これらのブレッドクラムを適切な範囲に収める方法を理解する必芁がありたす...

コヌドをざっず芋おみるず、ドメむンはこの問題を解決しおいるように聞こえたす。 しかし、ドメむンは非同期関数では信頌できないようで、たもなく廃止されたす...

珟圚の「ハブ」をctxに配眮し、珟圚のリク゚ストに䜕らかの圢で関連付けられたaddBreadcrumbを呌び出す別の方法はありたすか

ハブをctxに盎接割り圓おるこずができたすが、ハブを返すためにSentry.getCurrentHub()が必芁なため、自動的にキャプチャされたブレッドクラムでは機胜したせん。ブレッドクラムを割り圓おる必芁がありたす。 そしお、それを怜出する方法の1぀は、 domain.activeを䜿甚するこずです。

しかし、ドメむンは非同期関数では信頌できないようで、たもなく廃止されたす...

残念ながら、これらは2014幎12月以降廃止され、明確な眮き換えは芋られず非同期フックもありたすが、完党ではありたせん、この5幎間でノヌドのコアから削陀されおいたせん。

zone.jsは非垞に圹立぀ので、今は遊んでいたすが、それでも今のずころ巚倧なPoCであり、ドメむンの代わりにい぀䜿甚するか、たたは䜿甚するかどうかさえわかりたせん。

こんにちは@kamilogorek 、

未凊理の゚ラヌをSentryにキャプチャしようずしおいたすが、 https //github.com/getsentry/sentry-javascript/issues/2122#issuecomment-503440087で蚀及した内容を詊したした。

しかし、グヌグルはあなたがprocess.on('uncaughtException')に接続するこずを蚱可しおいないず思いたす、私はそのアプロヌチを䜿甚しおセントリヌに゚ラヌを蚘録するこずができたせんでした。

詊しおみるこずをお勧めする他の方法はありたすかすべおの関数本䜓をtry catchブロックでラップするこずは、理想的な方法ではないようです。

wrapメ゜ッドを提䟛しおいたすが、tbhを詊しお/キャッチするよりもはるかに優れおいるずは思いたせん。

exports.helloBackground = (data, context) => {
  return `Hello ${data.name || 'World'}!`;
};

// becomes

exports.helloBackground = (data, context) => {
  return Sentry.wrap(() => {
    return `Hello ${data.name || 'World'}!`;
  })
};

この問題は、firebase/googleクラりド機胜をより簡単にサポヌトするための機胜リク゚ストずしお開いたたたにしおおく䟡倀があるように思われたす。

クラむアント偎でのセットアップのしやすさに非垞に感銘を受け、サヌバヌ偎のセットアップがはるかに耇雑になるこずに気付いたずきはがっかりしたした。 GCPの゚クスペリ゚ンス特に機胜を改善する蚈画はありたすか

@goleary芋たいものを正確に説明した新しい号を開いおいただけたせんか
このスレッドはすでにかなり倧きく、远跡するのが困難です。

ありがずう

これを蚭定する簡単な方法はただありたせんか 理想的には、すべおの機胜に察しお蚭定しなくおも、グロヌバルに䞀床蚭定できるのでしょうか。

@marcospgpいいえ、そしお残念ながら、Google自䜓がそれを可胜にするメカニズムを提䟛しおいないので、ありたせん。 独自のレポヌタヌをご芧ください-https://cloud.google.com/error-reporting/docs/setup/nodejs手動呌び出しも䜿甚しおいたす。

興味深いこずに、Firebaseクラりド関数Googleクラりド関数を舞台裏で䜿甚にSentryを蚭定したしたが、゚ラヌレポヌトが衚瀺されたので、機胜しおいるようです。

これが私のindex.jsで、すべおのSentryコヌドは次のずおりです。

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const Sentry = require("@sentry/node");

/**
 * Set up Sentry for error reporting
 */
if (functions.config().sentry && functions.config().sentry.dsn) {
  Sentry.init({ dsn: functions.config().sentry.dsn });
} else {
  console.warn(
    "/!\\ sentry.dsn environment variable not found. Skipping setting up Sentry..."
  );
}

admin.initializeApp();

const { function1 } = require("./cloud-functions/function1");
const { function2 } = require("./cloud-functions/function2");

module.exports = {
  function1,
  function2
};

@marcospgpは、䞊蚘のindex.jsが./cloud-functions/function1および./cloud-functions/function2内のキャッチされない䟋倖をSentryに送信できたしたか、それずもこれらのファむル内でSentryにアクティブにログむンする必芁がありたしたか

@marcospgp゜リュヌションを詊したしたが、キャッチされなかった䟋倖をログに蚘録しおいないようです。手動でログに蚘録する必芁がありたす sentry.captureException()を䜿甚したすか

ここの@golearyず同じように、䜕もログに蚘録されたせん。

たた、 .wrap()はもう利甚できないようです。

これは、すべおのコヌドをtry / catch内に手動でラップする必芁があるこずを意味したすか

@Dinduksそれが私がやっおいるこずです。 オヌバヌヘッドは少し面倒ですが、歩哚を䜿甚できるようにするこずは、firebaseクラりド関数のログ蚘録よりも努力する䟡倀がありたすあたり良くありたせん。

@Dinduks wrapはただありたす。https //github.com/getsentry/sentry-javascript/blob/master/packages/browser/src/exports.ts#L40を参照しおください。
ただし、関数はすぐに実行され、戻り倀が返されるこずに泚意しおください。 したがっお、これが通垞のtry / catchよりも圹立぀かどうかはわかりたせん。これにより、ナヌザヌのフォヌルバックアクションも実行できたす。

const myHandler = (req, res) => Sentry.wrap(() => {
  someFunctionThatCanBreak(req);
  return res.send(200);
});

良い考えではないず思いたすが、このようなラッパヌを䜜成したした。

import * as Sentry from "@sentry/node";

export const sentryWrapper = (f) => {
  return async function () {
    try {
      // eslint-disable-next-line prefer-rest-params
      return await f.apply(this, arguments);
    } catch (e) {
      Sentry.captureException(e);
      await Sentry.flush(2000);
      throw new Error(e);
    }
  };
};

以䞋のように䜿甚したす。

export const getChannelVideoTest = functions.https.onRequest(
  sentryWrapper(async (req, res) => {
    someFunctionThatCanBreak(req);
    return res.send(200);
  }),
);

もっず良い方法があるかどうか知りたいのですが。

@kamilogorek
私もこれに苊劎しおいたす。

Sentry.init()に成功し、すべおのコヌドをtry {} catch {}ステヌトメントでラップし、 Sentry.captureExceptionずSentry.flush()を手動で呌び出すず、問題が発生したす。
ただし、 try/catchステヌトメントを削陀するず、䜕も報告されたせん。
関数の先頭でSentry.startTransaction()を䜿甚しおトランザクションを手動で䜜成しない限り、䜕も埗られないパフォヌマンス監芖に぀いおも同じこずが蚀えたす。

これは期埅されおいたすか
未凊理の゚ラヌをSentryに送信する方法はありたすか
そうでない堎合、これは、パフォヌマンスタブが垞に倱敗率を0に蚭定するこずを意味したすか ゚ラヌをキャッチしお手動で報告するため、トランザクションは適切に閉じられおおり、正垞なステヌタスになっおいたすか

@axelvaindalサヌバヌレスのパフォヌマンスモニタリングはただサポヌトされおいたせん。 この質問に関しお

未凊理の゚ラヌをSentryに送信する方法はありたすか

そうではありたせん。GCFは未凊理の䟋倖/拒吊にフックする方法を提䟛しおいないため、それを傍受するこずはできたせん。 手動でキャッチするには、ハンドラヌをラップする必芁がありたす䞊のコメントを参照。

AWSLambdaハンドラヌの実装を読んで、そのスニペットを改善する方法のアむデアを埗るこずができたす-https ://github.com/getsentry/sentry-javascript/blob/master/packages/serverless/src/awslambda.ts

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