$30 off During Our Annual Pro Sale. View Details »

次なるpkg/errorsを探して

 次なるpkg/errorsを探して

Takayuki Miyahara

June 15, 2023
Tweet

Other Decks in Programming

Transcript

  1. 次なるpkg/errorsを探して
    宮原 孝行
    【Gophers Talk】LT & カンファレンス感想戦
    2023/06/15

    View Slide

  2. Copyright Kanmu, Inc. All right reserved. 2
    宮原 孝行
    software engineer at Kanmu, Inc.
    @miyataka
    @always_allokay
    自己紹介

    View Slide

  3. Copyright Kanmu, Inc. All right reserved. 3
    発表の目的
    pkg/errors とはなにか
    移行先に求めるもの
    移行の選択肢
    評価
    1
    2
    3
    目次
    4
    5

    View Slide

  4. 発表の目的
    1

    View Slide

  5. Copyright Kanmu, Inc. All right reserved.
    発表の目的
    5
    1
    pkg/errorsの移行先を探すための参考情報を提供すること

    View Slide

  6. pkg/errors とはなにか
    2

    View Slide

  7. Copyright Kanmu, Inc. All right reserved.
    pkg/errors とはなにか
    7
    2
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● > Package errors provides simple error handling primitives.
    ● 直訳: エラーハンドリングの基礎を提供するライブラリ

    View Slide

  8. Copyright Kanmu, Inc. All right reserved.
    pkg/errors とはなにか
    8
    2
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● > Package errors provides simple error handling primitives.
    ● 直訳: エラーハンドリングの基礎を提供するライブラリ
    ● エラーにスタックトレースを付与できる
    ● 標準errorsのスーパーセットである

    View Slide

  9. Copyright Kanmu, Inc. All right reserved.
    pkg/errors とはなにか
    9
    2
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● > Package errors provides simple error handling primitives.
    ● 直訳: エラーハンドリングの基礎を提供するライブラリ
    ● エラーにスタックトレースを付与できる
    ● 標準errorsのスーパーセットであるあった

    View Slide

  10. 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

    View Slide

  11. 移行先に求めるもの
    3

    View Slide

  12. Copyright Kanmu, Inc. All right reserved.
    移行先に求めるもの
    12
    3
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 移行のしやすさ
    ● スタックトレースのサポート
    ● 性能が大きく劣化しないこと

    View Slide

  13. Copyright Kanmu, Inc. All right reserved.
    移行先に求めるもの
    13
    3
    ● 移行のしやすさ
    ○ 標準errors、pkg/errorsとの互換性
    ■ 関数、メソッドのシグニチャが一致しているか
    ■ 機能をもれなくカバーしているか

    View Slide

  14. Copyright Kanmu, Inc. All right reserved.
    移行先に求めるもの
    14
    3
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● スタックトレースのサポート
    ○ どの処理から呼び出されたかなど、バグ解消に直結する情報を含むので
    重要
    ○ pkg/errorsがカバーしていた範囲を引き継ぐ必要がある

    View Slide

  15. Copyright Kanmu, Inc. All right reserved.
    移行先に求めるもの
    15
    3
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 性能が大きく劣化しないこと
    ○ 速いは正義
    ○ メモリフットプリントは小さいほどよい

    View Slide

  16. 移行の選択肢
    4

    View Slide

  17. Copyright Kanmu, Inc. All right reserved.
    移行の選択肢
    17
    4
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 最終的な候補は以下の2つ
    ○ cockroachdb/errors
    ○ goark/errs

    View Slide

  18. Copyright Kanmu, Inc. All right reserved.
    移行の選択肢
    18
    4
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 一度候補となったものの、細かい調査の対象外としたもの
    ○ x/xerrors
    ○ morikuni/failure
    ○ 標準ライブラリを使った自前実装

    View Slide

  19. Copyright Kanmu, Inc. All right reserved.
    移行の選択肢
    19
    4
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 一度候補となったものの、細かい調査の対象外としたもの
    ○ x/xerrors
    ■ もともと、前回の標準errors改修タイミング(Go1.13リリース時)の橋渡
    しとしての位置付け
    ■ すでに大部分がdeprecatedである
    ○ morikuni/failure
    ■ エラーコードベースのハンドリングを前提
    ○ 標準ライブラリを使った自前実装
    ■ 自社固有の要件がない

    View Slide

  20. Copyright Kanmu, Inc. All right reserved.
    移行の選択肢
    20
    4
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 最終的な候補は以下の2つ(再掲)
    ○ cockroachdb/errors
    ○ goark/errs
    ● 移行先に求めるもの(再掲)
    ○ 移行のしやすさ
    ○ スタックトレースのサポート
    ○ 性能が大きく劣化しないこと

    View Slide

  21. 評価
    5

    View Slide

  22. Copyright Kanmu, Inc. All right reserved.
    評価: cockroachdb/errors
    22
    5
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 移行のしやすさ
    ○ 標準errorsとの互換性
    ■ Go1.20で追加されたJoinは未実装だが、Issueで対応中
    ○ pkg/errorsとの互換性
    ■ スーパーセットとなっている。置き換えだけで移行可能
    https://github.com/cockroachdb/errors/issues/99

    View Slide

  23. Copyright Kanmu, Inc. All right reserved.
    評価: cockroachdb/errors
    23
    5
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 移行のしやすさ
    ○ 標準errorsとの互換性
    ■ Go1.20で追加されたJoinは未実装だが、Issueで対応中
    ○ pkg/errorsとの互換性
    ■ スーパーセットとなっている。置き換えだけで移行可能
    ● スタックトレースのサポート
    ○ サポートされている
    ● 性能が大きく劣化しないこと
    ○ 後述

    View Slide

  24. Copyright Kanmu, Inc. All right reserved.
    評価: goark/errs
    24
    5
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 移行のしやすさ
    ○ 標準errorsとの互換性
    ■ Go1.20で追加されたJoinは未実装
    ○ pkg/errorsとの互換性
    ■ Wrap、Newなど一部は互換性あり

    View Slide

  25. Copyright Kanmu, Inc. All right reserved.
    評価: goark/errs
    25
    5
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● 移行のしやすさ
    ○ 標準errorsとの互換性
    ■ Go1.20で追加されたJoinは未実装
    ○ pkg/errorsとの互換性
    ■ Wrap、Newなど一部は互換性あり
    ● スタックトレースのサポート
    ○ サポートされている
    ● 性能が大きく劣化しないこと
    ○ 後述

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

  29. 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
    ※ただし、マイクロベンチマークであり、実際の環境では異なる結果となる可能性があることに注意
    すること

    View Slide

  30. 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 今後サポートされる見込みがないため、相対的に悪い評価とした

    View Slide

  31. Copyright Kanmu, Inc. All right reserved.
    全体のまとめ
    31
    5
    テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
    キストを入れたり。テキストを入れたり。テキストを入れたり。テキ
    ストを入れたり。テキストを入れたり。
    ● pkg/errors移行先: cockroachdb/errors
    ○ pkg/errorsのスーパーセットとなっており、置き換えが容易
    ○ 性能劣化するが、自社のユースケースでは影響度は小さい
    ● ネットワーク >>>> パッケージ移行による速度劣化

    View Slide

  32. 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/

    View Slide

  33. 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

    View Slide