Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goのアプリケーションをトレース して劇的に改善した話

Goのアプリケーションをトレース して劇的に改善した話

Satoru Mikami

July 07, 2022
Tweet

More Decks by Satoru Mikami

Other Decks in Technology

Transcript

  1. Goのアプリケーションをトレース

    して劇的に改善した話

    〜一行に隠された秘密を解く〜 

    三上 悟


    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. ©2021 Voicy, Inc.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide