Slide 1

Slide 1 text

Goのアプリケーションをトレース
 して劇的に改善した話
 〜一行に隠された秘密を解く〜 
 三上 悟


Slide 2

Slide 2 text

©2021 Voicy, Inc. 自己紹介 三上 悟 Tech Lead at Voicy (元EM) @saicologic 2020年1月入社 6社目 専門はバックエンドエンジニア 17年目 Goの開発は2021年〜 PHP => Ruby => Node.js => Python => Go 趣味:ゲーム、自転車

Slide 3

Slide 3 text

©2021 Voicy, Inc. 今日の話 Datadog APM(Application Perfomance Monitoring) 

Slide 4

Slide 4 text

©2021 Voicy, Inc. aはFirebase Authです。

Slide 5

Slide 5 text

©2021 Voicy, Inc. Firebaseもたまにタイムアウトする APIはユーザー認証が必要なため、Firebaseに問い合わせしている? リトライすればいい?

Slide 6

Slide 6 text

©2021 Voicy, Inc.

Slide 7

Slide 7 text

©2021 Voicy, Inc. 認証   if a.needCheckRevoked { idToken, err = a.VerifyIDTokenAndCheckRevoked(ctx, bearerToken) } else { idToken, err = a.VerifyIDToken(ctx, bearerToken) } 認証の実装見ると、needCheckRevokedはFirebaseに問い合わせするが、 VerifyIDTokenは、Firebaseへの問い合せをおこないません

Slide 8

Slide 8 text

©2021 Voicy, Inc. 補足:認証 HTTP Header { "Authorization": "Bearer xxxxxx" } xxxxxxは、JWT(JSON Web Token) JWT=bearerTokenの中身です。

Slide 9

Slide 9 text

©2021 Voicy, Inc. 補足:JWT https://jwt.io/

Slide 10

Slide 10 text

©2021 Voicy, Inc. 認証ではないとしたら、 accounts:lookupは一体どこで呼ばれているのだろうか?

Slide 11

Slide 11 text

©2021 Voicy, Inc. InfoログにUserIDを付与したかった。誰のリクエストが調査できるようにするため。 Firebaseの呼び出しはログのミドルウェアで呼ばれていた。 InjectFirebaseAuthenticator.GetUserFromの中でFirebaseに問い合わせしていました。 修正されていない初期のコードで作った人がいません。普通に動くから見直しが行われなかった。

Slide 12

Slide 12 text

©2021 Voicy, Inc. 修正点 1. 認証ミドルウェアでContextにUserIDを付与した a. あらかじめユーザー登録するときに、 CustomClaims情報を付与しておくと、 JWTの中にUserID情 報が入れられます。 VerifyIDTokenするとUserID取得できるので、ContextにいれてUserIDを引き 回せます。 2. ログのミドルウェアでContextからUserIDを取得して使う 呼び出し順番 ・UnaryServerInterceptor(auth.Authenticate) ・LoggerUnaryServerInterceptor(logger)

Slide 13

Slide 13 text

©2021 Voicy, Inc. 改善結果 Firebaseの問い合わせが不要になり、全体で 200ms早くなった

Slide 14

Slide 14 text

©2021 Voicy, Inc. 学び ・JWTの仕組みを知ればFirebaseに問い合わせなくても、必要な情報が取得できる ・Datadog APMを入れると、どこでどれくらいの時間がかかったかわかる ・GoのContextを使えば値を引き回せる。例えばログに情報を付与する用途に使える ・ミドルウェアの処理は全てのAPIに影響するので不要な処理がないか見直そう その他 ・JWT検証はアプリ側より、API Gateway側で行うほうが良い (例:Amazon API GatewayのJWT オーソライザー)

Slide 15

Slide 15 text

ご清聴ありがとうございました。