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
2k
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.8k
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
一文字エイリアスのすすめ
fujimura
0
180
Webアプリをできるだけコードを手書きしないで作ってみる
tomokusaba
2
230
Introducing Kotlin Multiplatform in an existing mobile app - Workshop Edition | AndroidMakers Paris
prof18
0
170
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
2
460
slow types ってなんだろう?
karad
0
210
AmperとFleetを使ったAndroidアプリ
yoppie
0
290
Fast JSX: Don't clone props object #28768
yossydev
1
230
RustでAWS Lambda functionをいい感じに書く
taiki45
2
140
TypeScriptとGraphQLで実現する 型安全なAPI実装 / TSKaigi 2024
hokaccha
5
2.5k
TypeScriptでもLLMアプリケーション開発 / LLM Application In Typescript
rkaga
5
1.3k
Amazon Aurora Serverless v2が意外と高かった話と、AWS Database Migration Serviceの話
satoshi256kbyte
1
100
チーム立ち上げにAWSを活用したらClaudeさんに褒められた話
mkdev10
3
230
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
689
190k
GraphQLとの向き合い方2022年版
quramy
33
12k
Building a Modern Day E-commerce SEO Strategy
aleyda
22
6.4k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
7k
Web Components: a chance to create the future
zenorocha
306
41k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Git: the NoSQL Database
bkeepers
PRO
423
63k
Thoughts on Productivity
jonyablonski
60
3.9k
Happy Clients
brianwarren
92
6.4k
Unsuck your backbone
ammeep
664
57k
A designer walks into a library…
pauljervisheath
201
23k
Rails Girls Zürich Keynote
gr2m
91
13k
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アプリケーションという立場から見ると カリカリチューニングが必要になっていないならまだいける 台数を並べればパフォーマンスを稼げる 可観測性が高いほうがメリットが大きい 他のプログラミング言語には当然スタックトレースがある
まとめ やっぱりスタックトレース欲しいやん みなさまはどのようにエラーと向き合っていますか?