Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
次なるpkg/errorsを探して
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takayuki Miyahara
June 15, 2023
Programming
1.6k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
次なるpkg/errorsを探して
Takayuki Miyahara
June 15, 2023
More Decks by Takayuki Miyahara
See All by Takayuki Miyahara
ブログのリアクションから始めるGoのパフォーマンス分析入門
always_allokay
0
450
Other Decks in Programming
See All in Programming
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
120
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
170
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
3Dシーンの圧縮
fadis
1
670
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.7k
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
310
Oxcを導入して開発体験が向上した話
yug1224
4
290
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
220
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
840
ふつうのFeature Flag実践入門
irof
7
3.6k
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
240
AIで効率化できた業務・日常
ochtum
0
110
Featured
See All Featured
Believing is Seeing
oripsolob
1
140
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Become a Pro
speakerdeck
PRO
31
6k
Designing for humans not robots
tammielis
254
26k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Technical Leadership for Architectural Decision Making
baasie
3
400
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Practical Orchestrator
shlominoach
191
11k
Visualization
eitanlees
152
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Transcript
次なるpkg/errorsを探して 宮原 孝行 【Gophers Talk】LT & カンファレンス感想戦 2023/06/15
Copyright Kanmu, Inc. All right reserved. 2 宮原 孝行 software
engineer at Kanmu, Inc. @miyataka @always_allokay 自己紹介
Copyright Kanmu, Inc. All right reserved. 3 発表の目的 pkg/errors とはなにか
移行先に求めるもの 移行の選択肢 評価 1 2 3 目次 4 5
発表の目的 1
Copyright Kanmu, Inc. All right reserved. 発表の目的 5 1 pkg/errorsの移行先を探すための参考情報を提供すること
pkg/errors とはなにか 2
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 7 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 8 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ • エラーにスタックトレースを付与できる • 標準errorsのスーパーセットである
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 9 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ • エラーにスタックトレースを付与できる • 標準errorsのスーパーセットであるあった
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 10 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • なぜ移行したいのか? ◦ Go1.20でerrorsパッケージに1.13以来の変更が入り、Go本体との差分が 発生した ◦ 2021年12月にPublic Archiveとなり、メンテが行われなくなっている https://go.googlesource.com/proposal/+/master/design/go2draft.md https://go.dev/doc/go1.20
移行先に求めるもの 3
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 12 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ • スタックトレースのサポート • 性能が大きく劣化しないこと
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 13 3 •
移行のしやすさ ◦ 標準errors、pkg/errorsとの互換性 ▪ 関数、メソッドのシグニチャが一致しているか ▪ 機能をもれなくカバーしているか
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 14 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • スタックトレースのサポート ◦ どの処理から呼び出されたかなど、バグ解消に直結する情報を含むので 重要 ◦ pkg/errorsがカバーしていた範囲を引き継ぐ必要がある
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 15 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 性能が大きく劣化しないこと ◦ 速いは正義 ◦ メモリフットプリントは小さいほどよい
移行の選択肢 4
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 17 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 最終的な候補は以下の2つ ◦ cockroachdb/errors ◦ goark/errs
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 18 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 一度候補となったものの、細かい調査の対象外としたもの ◦ x/xerrors ◦ morikuni/failure ◦ 標準ライブラリを使った自前実装
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 19 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 一度候補となったものの、細かい調査の対象外としたもの ◦ x/xerrors ▪ もともと、前回の標準errors改修タイミング(Go1.13リリース時)の橋渡 しとしての位置付け ▪ すでに大部分がdeprecatedである ◦ morikuni/failure ▪ エラーコードベースのハンドリングを前提 ◦ 標準ライブラリを使った自前実装 ▪ 自社固有の要件がない
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 20 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 最終的な候補は以下の2つ(再掲) ◦ cockroachdb/errors ◦ goark/errs • 移行先に求めるもの(再掲) ◦ 移行のしやすさ ◦ スタックトレースのサポート ◦ 性能が大きく劣化しないこと
評価 5
Copyright Kanmu, Inc. All right reserved. 評価: cockroachdb/errors 22 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装だが、Issueで対応中 ◦ pkg/errorsとの互換性 ▪ スーパーセットとなっている。置き換えだけで移行可能 https://github.com/cockroachdb/errors/issues/99
Copyright Kanmu, Inc. All right reserved. 評価: cockroachdb/errors 23 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装だが、Issueで対応中 ◦ pkg/errorsとの互換性 ▪ スーパーセットとなっている。置き換えだけで移行可能 • スタックトレースのサポート ◦ サポートされている • 性能が大きく劣化しないこと ◦ 後述
Copyright Kanmu, Inc. All right reserved. 評価: goark/errs 24 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装 ◦ pkg/errorsとの互換性 ▪ Wrap、Newなど一部は互換性あり
Copyright Kanmu, Inc. All right reserved. 評価: goark/errs 25 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装 ◦ pkg/errorsとの互換性 ▪ Wrap、Newなど一部は互換性あり • スタックトレースのサポート ◦ サポートされている • 性能が大きく劣化しないこと ◦ 後述
Copyright Kanmu, Inc. All right reserved. 評価: ベンチマーク 26 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 性能評価としてマイクロベンチマークをとる ◦ 標準errors, pkg/errors, cockroachdb/errors, goark/errsの4つを比較 ◦ 実行したベンチマーク ▪ ネストしたerror生成時の速度とフットプリント ▪ スタックトレース出力時の速度とフットプリント ※ベンチマークテストコードは以下のレポジトリ https://github.com/miyataka/benchmark_pkg_errors_alternatives
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ pkg/errors
(baseline) ▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 8249 ns/op, 304 B/op, 3 allocs/op ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 12849 ns/op, 3716 B/op, 33 allocs/op 評価: ベンチマーク 27 5
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ cockroachdb/errors
▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 8640 ns/op, 416 B/op, 7 allocs/op • 速度約5%pt、メモリ使用量約37%pt悪化 ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 14867 ns/op, 17222 B/op, 22 allocs/op • 速度が約15%pt、メモリ使用量が約4.6倍に悪化 評価: ベンチマーク 28 5
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ goark/errs
▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 7885 ns/op, 648 B/op, 7 allocs/op • 速度約4.5pt改善、メモリ使用量は約2倍に悪化 ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 1896 ns/op, 1401 B/op, 33 allocs/op • 速度が約6倍改善、メモリ使用量は63%pt改善 評価: ベンチマーク 29 5 ※ただし、マイクロベンチマークであり、実際の環境では異なる結果となる可能性があることに注意 すること
Copyright Kanmu, Inc. All right reserved. 評価: まとめ 30 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 package 標準errorsとの 互換性 pkg/errorsとの 互換性 スタックトレースの サポート 性能 標準errors - - ❌ - pkg/errors ❌※1 ※2 - ⭕ baseline cockroachdb/errors 🔺※1 ⭕ ⭕ 🔺 goark/errs 🔺※1 🔺 ⭕ ⭕ ※1 いずれもGo1.13時点の互換性あり. Go1.20のJoinは未実装 ※2 今後サポートされる見込みがないため、相対的に悪い評価とした
Copyright Kanmu, Inc. All right reserved. 全体のまとめ 31 5 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • pkg/errors移行先: cockroachdb/errors ◦ pkg/errorsのスーパーセットとなっており、置き換えが容易 ◦ 性能劣化するが、自社のユースケースでは影響度は小さい • ネットワーク >>>> パッケージ移行による速度劣化
Copyright Kanmu, Inc. All right reserved. 参考文献 32 6 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • https://go.googlesource.com/go/+/refs/heads/master/src/errors/ • https://github.com/pkg/errors • https://github.com/cockroachdb/errors • https://github.com/goark/errs • https://go.googlesource.com/proposal/+/master/design/go2draft.md • https://go.dev/doc/go1.20 • https://go.dev/doc/go1.13 • https://go.googlesource.com/xerrors/
Copyright Kanmu, Inc. All right reserved. 参考文献 33 6 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • https://github.com/morikuni/failure • https://speakerdeck.com/morikuni/designing-errors • https://future-architect.github.io/articles/20230123a/ • https://future-architect.github.io/articles/20230126a/ • https://zenn.dev/nekoshita/articles/097e00c6d3d1c9 • https://text.baldanders.info/golang/error-handling/ • https://zenn.dev/spiegel/books/error-handling-in-golang • https://speakerdeck.com/syumai/godesutatukutoresuwoxi-ufang-fa-ga yayakosiijian-nituite