Upgrade to Pro — share decks privately, control downloads, hide ads and more …

スタックトレース始めてみた

Avatar for kuro kuro
May 16, 2024

 スタックトレース始めてみた

Avatar for kuro

kuro

May 16, 2024
Tweet

More Decks by kuro

Other Decks in Programming

Transcript

  1. DataDog ErrorTrackingとは 1. エラーをいい感じにグループ化してくれる。 2. 通知もエラーごとにいい感じに制御してくれる →以下の2種類のモニターを使える。 Count: エラーのグループごとに一定の値を超      

    えたら通知してくれる。 
     New Issue: 新しいエラーが発生したら通知し         てくれる。
 →ある一定の値を超えるエラーが出た場合のみ対 応したいみたいなニーズにあう。 参照 https://www.datadoghq.com/ja/product/error-tracking/
  2. DataDog ErrorTracking導入 当初 ErrorTrackingをONにするだけか😍 実際 あれ、ONにして待てど暮らせど何も出てこない。。。 👇 ログの構造を変える必要がある。 参照:https://docs.datadoghq.com/ja/logs/error_tracking/backend/?tab=serilog 属性

    説明 error.stack 実際のスタックトレース error.message スタックトレースに含まれるエラーメッセージ error.kind エラーのタイプまたは「種類」 ("Exception" や "OSError" など)
  3. 比較・検討 1. pkg errors or xerrorsをそのまま使う。→メンテされてないのが🥺 a. https://pkg.go.dev/github.com/pkg/errors b. https://pkg.go.dev/golang.org/x/xerrors

    2. その他の色々OSSを使う→要件に対してtoo muchなのと大体全てのエラーをラップするのが必要 a. https://github.com/juju/errors b. https://github.com/go-errors/errors c. https://github.com/morikuni/failure d. https://github.com/hashicorp/go-multierror e. https://github.com/rotisserie/eris f. https://github.com/cockroachdb/errors 3. 自前 a. pkg errors or xerrorsあたりの実装を引っ張ってくる b. debug.Stack(https://pkg.go.dev/runtime/debug#Stack)や、 runtime.Callers(https://pkg.go.dev/runtime#Callers)のメソッドを使う
  4. runtimeパッケージでスタックトレース - func Stack() []byte - スタックトレースをバイト列にして返してくれる。 - func Callers(skip

    int, pc []uintptr) int + func CallersFrames(callers []uintptr) *Frames - Callersが返すプログラムカウンタをCallersFramesに渡すと関数/ファイル/行の情報を返してくれ る。 →ちょっとだけ*Framesの加工がめんどい
  5. ラップする方法 - WrapStackでは、エラーが - StackError型の場合→errをwrap する。 - StackError型でない場合→errを 新しくStackError構造体に。 -

    ダブルポインタを使うことでdeferで関数 を抜ける際にエラーを直接更新する。 - ただ、名前付き戻り値にする必要あり。
  6. 参考 - Error Tracking | Datadog - バックエンドエラーの追跡 - Datadog

    Error Tracking for Logsを使って日々のエラーログ監視を省力化する - Goでスタックトレースを扱う方法がややこしい件について - Speaker Deck - Goのerrorがスタックトレースを含まない理由 - methaneのブログ - pkgsite/internal/derrors を使ったGoのエラーラッピング - Goでスタイリッシュにエラーをラップする方法を学んだ - カミナシ エンジニアブログ