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

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

kuro
May 16, 2024

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

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でスタイリッシュにエラーをラップする方法を学んだ - カミナシ エンジニアブログ