Slide 1

Slide 1 text

© 2012-2022 BASE, Inc. 1 #gocon2022_4sponsor @budougumi0617 New Relicを使った Observabilityの実現方法と活用例 \非公式/ Go Conference 2022 Spring スポンサー企業4社 アフタートーク BASE株式会社/清水 陽一郎(@budougumi0617)

Slide 2

Slide 2 text

© 2012-2022 BASE, Inc. 2 #gocon2022_4sponsor @budougumi0617 自己紹介 所属 BASE 株式会社 BASE BANKチーム Tech Lead Go、New Relicや自動化など。 趣味 ブログ: https://budougumi0617.github.io/ SNS Twitter : @budougumi0617  Github : https://github.com/budougumi0617 2022/07/20 商業誌出版予定 清水 陽一郎 (しみず よういちろう)

Slide 3

Slide 3 text

© 2012-2022 BASE, Inc. 3 1 2 3 #gocon2022_4sponsor @budougumi0617 New Relicの機能概要 New Relicの導入方法(実装方法) 開発者体験を考慮した設計 今日の話

Slide 4

Slide 4 text

© 2012-2022 BASE, Inc. 4 1 2 3 #gocon2022_4sponsor @budougumi0617 New Relicで何がわかるようになるか Goで疎結合な実装をするテクニック プラットフォームな設計をする時は プロダクトメンバーの開発体験を意識すること 今日伝えたいこと

Slide 5

Slide 5 text

© 2012-2022 BASE, Inc. 5 #gocon2022_4sponsor @budougumi0617 ● Go on ECS Fargate お題: BASEカード

Slide 6

Slide 6 text

© 2012-2022 BASE, Inc. 6 © 2012-2022 BASE, Inc. 6 New Relicとは

Slide 7

Slide 7 text

© 2012-2022 BASE, Inc. 7 #gocon2022_4sponsor @budougumi0617 New Relicとは ● Telemetry Data Platform ○ テレメトリデータの収集・可視化 ● Full-Stack Observability ○ 計測データの分析・可視化インターフェイス ● Alerts and Applied Intelligence

Slide 8

Slide 8 text

© 2012-2022 BASE, Inc. 8 #gocon2022_4sponsor @budougumi0617 ● Go用ライブラリを利用して対応 ○ https://pkg.go.dev/github.com/newrelic/go-agent/v3/newrelic ● トランザクションのスループット/レスポンスタイム/エラー率 ● メモリ・CPUなどのランタイム情報/ゴルーチンの監視 ● 分散トレーシング ● Logs in context(分散トレーシングとログの紐付け) New Relic + Go

Slide 9

Slide 9 text

© 2012-2022 BASE, Inc. 9 © 2012-2022 BASE, Inc. 9 New Relicの機能と導入

Slide 10

Slide 10 text

© 2012-2022 BASE, Inc. 10 #gocon2022_4sponsor @budougumi0617 ● サービス・アプリケーション全体のサービスレベルの把握 APM(Application Perfomance Management)

Slide 11

Slide 11 text

© 2012-2022 BASE, Inc. 11 #gocon2022_4sponsor @budougumi0617 ● メモリ・CPUなどのランタイム情報/ゴルーチンの監視 APM(Application Perfomance Management)

Slide 12

Slide 12 text

© 2012-2022 BASE, Inc. 12 #gocon2022_4sponsor @budougumi0617 ● 環境変数の有無で有効化 ○ E2EテストやCI上でも動くように未設定でもサーバが起動できるように APMの導入

Slide 13

Slide 13 text

© 2012-2022 BASE, Inc. 13 #gocon2022_4sponsor @budougumi0617 ● 複数サービス間のつながりを可視化 ■ Trace: 各サービスで実行されたリクエスト処理 ■ Span: Trace内で行われた関数呼び出し・SQL・外部API実行などの各操作 分散トレース

Slide 14

Slide 14 text

© 2012-2022 BASE, Inc. 14 #gocon2022_4sponsor @budougumi0617 ● Middlewareパターンによるトレースの取得 ● メジャーなRouterには公式からMiddleware実装が提供 ○ net/http router ○ github.com/labstack/echo ○ github.com/gin-gonic/gin ○ github.com/gorilla/mux トレースの実装

Slide 15

Slide 15 text

© 2012-2022 BASE, Inc. 15 #gocon2022_4sponsor @budougumi0617 ● HTTPルーター構築時にデフォルト適用 ■ 各ハンドラー実装者は意識せずにTraceが設定される トレースの取得

Slide 16

Slide 16 text

© 2012-2022 BASE, Inc. 16 #gocon2022_4sponsor @budougumi0617 ● 関数・メソッド冒頭でNew Relicの関数を呼び出し ○ コードに直接埋め込む必要があるので強結合になる ■ アノテーションプログラミングなどは当然できない ○ Spanとして計測したい全関数に書かないといけない Spanの取得

Slide 17

Slide 17 text

© 2012-2022 BASE, Inc. 17 #gocon2022_4sponsor @budougumi0617 ● 強結合 ○ 諦める ○ o11yサービスを変えることはめったにない ● Spanとして計測したい全関数に書かないといけない ○ 静的解析ツールを自作して自動で全挿入 ■ https://pkg.go.dev/github.com/budougumi0617/nrseg ■ 全削除コマンドは利用予定が無いので現状未実装(ISUCONでNew Relic使うなら作るかも?) ○ Actionsを自作して挿入漏れはPRのCIでエラーにする ■ https://github.com/marketplace/actions/action-newrelic-segment-lint Spanの取得

Slide 18

Slide 18 text

© 2012-2022 BASE, Inc. 18 #gocon2022_4sponsor @budougumi0617 ● テーブル+コマンドごとの統計情報など データベース操作の記録

Slide 19

Slide 19 text

© 2012-2022 BASE, Inc. 19 #gocon2022_4sponsor @budougumi0617 ● テーブル+コマンドごとの統計情報など データベース操作の記録

Slide 20

Slide 20 text

© 2012-2022 BASE, Inc. 20 #gocon2022_4sponsor @budougumi0617 ● blank import データベース操作の記録

Slide 21

Slide 21 text

© 2012-2022 BASE, Inc. 21 #gocon2022_4sponsor @budougumi0617 ● Trace IDの伝搬/外部リクエストの計測 APIリクエスト

Slide 22

Slide 22 text

© 2012-2022 BASE, Inc. 22 #gocon2022_4sponsor @budougumi0617 ● RoundTripperを実装 ○ HTTPクライアントの初期化を他のRoundTripperと一緒にパッケージング APIリクエストの実装

Slide 23

Slide 23 text

© 2012-2022 BASE, Inc. 23 #gocon2022_4sponsor @budougumi0617 ● トレースとログを紐付けてくれる Logs in context

Slide 24

Slide 24 text

© 2012-2022 BASE, Inc. 24 #gocon2022_4sponsor @budougumi0617 ● uber/zapをラップする社内ライブラリでTrace IDなどをログに埋め込み ○ 別途ECSのサイドカーとしてNew Relicへログ送信用のfluent-bitを起動 ○ uber/zapは公式未対応なので自作ライブラリを作成 ■ https://pkg.go.dev/github.com/budougumi0617/nrzap Logs in contextの実装

Slide 25

Slide 25 text

© 2012-2022 BASE, Inc. 25 #gocon2022_4sponsor @budougumi0617 ● エラーレポートにはSentryを併用 ○ SentryにNew RelicのTrace IDなどを付与しておくとログがすぐ見つかるので便利 ○ (エラーレポートはまだNew RelicよりSentryのほうが便利かなと思っている) その他

Slide 26

Slide 26 text

© 2012-2022 BASE, Inc. 26 1 2 3 #gocon2022_4sponsor @budougumi0617 New Relicで何がわかるようになるか Goで疎結合な実装をするテクニック プラットフォームな設計をする時は プロダクトメンバーの開発体験を意識すること 今日伝えたいこと