Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
次なるpkg/errorsを探して
Search
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
480
Other Decks in Programming
See All in Programming
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
760
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
130
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
260
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
0
250
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
180
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
130
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
130
Press start. Python's next generation.
willingc
PRO
3
320
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
信頼性の目標を誰も求めてない
shubox
0
500
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Building an army of robots
kneath
306
46k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Why Our Code Smells
bkeepers
PRO
340
58k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Chasing Engaging Ingredients in Design
codingconduct
0
300
4 Signs Your Business is Dying
shpigford
187
23k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Thoughts on Productivity
jonyablonski
76
5.4k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
490
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