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
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
Search
utagawa kiki
April 28, 2024
Programming
6
1.9k
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
Kyoto.go #50 LT
https://kyotogo.connpass.com/event/313309/
utagawa kiki
April 28, 2024
Tweet
Share
More Decks by utagawa kiki
See All by utagawa kiki
ありがとう、create-react-app
utgwkk
3
7.7k
mockgenによるモック生成を高速化するツール bulkmockgenのご紹介 / Kyoto.go #43
utgwkk
2
1.7k
SPAでもデータをURLでシェアしたい / Kyoto.js 19
utgwkk
2
1.6k
prototype大全 / YAPC::Kyoto 2023
utgwkk
1
4.1k
なんでもPull Requestにする / Kichijoji.pm 31
utgwkk
3
6.1k
インプットとアウトプットのサイクルを回す暮らし / Kichijoji.pm 29
utgwkk
1
8.9k
prototypeとjust epic. と私 / YAPC::Japan::Online 2022
utgwkk
0
9.4k
GraphQLを使った共同開発の心構え 〜 フロントエンドの視点から / Hatena Engineer Seminar #18
utgwkk
0
8.8k
他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019
utgwkk
1
8.1k
Other Decks in Programming
See All in Programming
Git Rebase
bkuhlmann
11
1.6k
2024 コーディング研修
ckazu
0
480
ts-morphを使ってコードリプレイスとASTへのハードルを下げる!
nyawach
2
170
Anthropic Cookbook のおすすめレシピ
schroneko
7
1.4k
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
1.2k
From Spring Boot 2 to Spring Boot 3 with Java 21 and Jakarta EE
ivargrimstad
0
940
Three ways to use AI on Android: The Good, the Bad and the Ugly
marxallski
0
110
Criando a Woovi em uma semana
daniloab
0
110
SIMD Parallel Programming with the Vector API
josepaumard
0
240
検証も兼ねて個人開発でHonoとかと向き合った話
hanetsuki
1
1.4k
AppRouter Panel Talk
yosuke_furukawa
PRO
1
500
PHPはいつから死んでいるかの調査
chiroruxx
2
430
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
36
2.1k
GraphQLの誤解/rethinking-graphql
sonatard
56
9.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
245
20k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
26
2.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
41
4.4k
Embracing the Ebb and Flow
colly
80
4.2k
Being A Developer After 40
akosma
67
580k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
14
8.4k
Happy Clients
brianwarren
92
6.4k
Into the Great Unknown - MozCon
thekraken
15
1k
Building Adaptive Systems
keathley
32
1.9k
How to train your dragon (web standard)
notwaldorf
75
5.2k
Transcript
Go製Webアプリケーションの エラーとの向き合い方大全 あるいは やっぱりスタックトレース欲しいやん Kyoto.go #50 @utgwkk (うたがわきき)
自己紹介 @utgwkk (うたがわきき) 株式会社はてな Webアプリケーションエンジニア in 京都 最近はGoを書いて暮らしています
ここで宣伝 Go Conference 2024 (6/8) で登壇します Dive into gomockというタイトルでやります 渋谷で会いましょう
まったく関係ない宣伝 アイコンのステッカー配っています
アンケート Goでエラーハンドリングをしたことがある? (ここで挙手を促す)
前提 Go製Webアプリケーション GraphQL API (gqlgen) + REST API
Goのエラーといえば? if err != nil { return nil, err }
return errors.New("not found") return fmt.Errorf("failed to fetch: %w", err)
課題感 return nil, err どこで発生したエラーなのか分からない そうして、向き合いが発生したのであった こうやって向き合っているよ〜という歩みと現状を紹介
fmt.Errorf でラップする return fmt.Errorf("failed to fetch: %w", err) メッセージを都度考える必要がある どこで発生したエラーなのか一意に定まらない
(grepしたらいけるけど)
golang.org/x/xerrors を使う時代 スタックトレース付きでエラーを返せる return xerrors.Errorf("failed to fetch: %w", err) ほぼ非推奨になっているパッケージを使いつづけることへの不安
(Errorfはdeprecated解除された) メッセージを都度考える必要があるのには変わりがない xerrors.Errorf(": %w", err) というイディオムがあるにはあるが
panicを使う……? package main func main() { doSomething() } func doSomething()
{ panic("failed!!") }
panicを使う……? panic: failed!! goroutine 1 [running]: main.doSomething(...) /tmp/sandbox423004243/prog.go:8 main.main() /tmp/sandbox423004243/prog.go:4
+0x25
panicを使う……? panicしたらスタックトレースが載る!! けっこう真面目に考えたこともあったけど却下 Goの標準的なエラーハンドリング方法から大きく外れる どこからエラーが返ってくるのか予測不能になる
オレオレライブラリでスタックトレースを載せる return errwithframe.New(err) xerrorsの実装を真似る Errorメソッドでスタックトレースを出力する いったんこれで落ち着いている 世間にあるライブラリを使ったほうがいいかも? (後述します)
スタックトレースの時代が来ている 各社で事例あり Go言語のAPIサーバーの冗長なエラーログを40%削減した話 #LayerXテック アドカレ - LayerX エンジニアブログ UbieにおけるGo言語のエラーハンドリング
エラーハンドリングへの関心が高まっている https://findy.connpass.com/event/314417/
Goのエラーがスタックトレースを含まない理由 Goのerrorがスタックトレースを含まない理由 - methaneのブログ そういう思想や宗教ではなく慎重に調整している パフォーマンスの低下はそうですね
エラーのスタックトレースの歴史 https://speakerdeck.com/sonatard/go-error-trace
Webアプリケーションという立場から見ると カリカリチューニングが必要になっていないならまだいける 台数を並べればパフォーマンスを稼げる 可観測性が高いほうがメリットが大きい 他のプログラミング言語には当然スタックトレースがある
まとめ やっぱりスタックトレース欲しいやん みなさまはどのようにエラーと向き合っていますか?