4月28日に行われた次のイベントの登壇資料です。
\非公式/ Go Conference 2022 Spring スポンサー企業4社 アフタートーク https://andpad.connpass.com/event/243953/
© 2012-2022 BASE, Inc. 1#gocon2022_4sponsor@budougumi0617New Relicを使ったObservabilityの実現方法と活用例\非公式/ Go Conference 2022 Springスポンサー企業4社 アフタートークBASE株式会社/清水 陽一郎(@budougumi0617)
View Slide
© 2012-2022 BASE, Inc. 2#gocon2022_4sponsor@budougumi0617自己紹介所属BASE 株式会社 BASE BANKチーム Tech LeadGo、New Relicや自動化など。趣味ブログ: https://budougumi0617.github.io/SNSTwitter : @budougumi0617 Github : https://github.com/budougumi06172022/07/20 商業誌出版予定清水 陽一郎 (しみず よういちろう)
© 2012-2022 BASE, Inc. 3123#gocon2022_4sponsor@budougumi0617New Relicの機能概要New Relicの導入方法(実装方法)開発者体験を考慮した設計今日の話
© 2012-2022 BASE, Inc. 4123#gocon2022_4sponsor@budougumi0617New Relicで何がわかるようになるかGoで疎結合な実装をするテクニックプラットフォームな設計をする時はプロダクトメンバーの開発体験を意識すること今日伝えたいこと
© 2012-2022 BASE, Inc. 5#gocon2022_4sponsor@budougumi0617● Go on ECS Fargateお題: BASEカード
© 2012-2022 BASE, Inc. 6© 2012-2022 BASE, Inc. 6New Relicとは
© 2012-2022 BASE, Inc. 7#gocon2022_4sponsor@budougumi0617New Relicとは● Telemetry Data Platform○ テレメトリデータの収集・可視化● Full-Stack Observability○ 計測データの分析・可視化インターフェイス● Alerts and Applied Intelligence
© 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
© 2012-2022 BASE, Inc. 9© 2012-2022 BASE, Inc. 9New Relicの機能と導入
© 2012-2022 BASE, Inc. 10#gocon2022_4sponsor@budougumi0617● サービス・アプリケーション全体のサービスレベルの把握APM(Application Perfomance Management)
© 2012-2022 BASE, Inc. 11#gocon2022_4sponsor@budougumi0617● メモリ・CPUなどのランタイム情報/ゴルーチンの監視APM(Application Perfomance Management)
© 2012-2022 BASE, Inc. 12#gocon2022_4sponsor@budougumi0617● 環境変数の有無で有効化○ E2EテストやCI上でも動くように未設定でもサーバが起動できるようにAPMの導入
© 2012-2022 BASE, Inc. 13#gocon2022_4sponsor@budougumi0617● 複数サービス間のつながりを可視化■ Trace: 各サービスで実行されたリクエスト処理■ Span: Trace内で行われた関数呼び出し・SQL・外部API実行などの各操作分散トレース
© 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トレースの実装
© 2012-2022 BASE, Inc. 15#gocon2022_4sponsor@budougumi0617● HTTPルーター構築時にデフォルト適用■ 各ハンドラー実装者は意識せずにTraceが設定されるトレースの取得
© 2012-2022 BASE, Inc. 16#gocon2022_4sponsor@budougumi0617● 関数・メソッド冒頭でNew Relicの関数を呼び出し○ コードに直接埋め込む必要があるので強結合になる■ アノテーションプログラミングなどは当然できない○ Spanとして計測したい全関数に書かないといけないSpanの取得
© 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-lintSpanの取得
© 2012-2022 BASE, Inc. 18#gocon2022_4sponsor@budougumi0617● テーブル+コマンドごとの統計情報などデータベース操作の記録
© 2012-2022 BASE, Inc. 19#gocon2022_4sponsor@budougumi0617● テーブル+コマンドごとの統計情報などデータベース操作の記録
© 2012-2022 BASE, Inc. 20#gocon2022_4sponsor@budougumi0617● blank importデータベース操作の記録
© 2012-2022 BASE, Inc. 21#gocon2022_4sponsor@budougumi0617● Trace IDの伝搬/外部リクエストの計測APIリクエスト
© 2012-2022 BASE, Inc. 22#gocon2022_4sponsor@budougumi0617● RoundTripperを実装○ HTTPクライアントの初期化を他のRoundTripperと一緒にパッケージングAPIリクエストの実装
© 2012-2022 BASE, Inc. 23#gocon2022_4sponsor@budougumi0617● トレースとログを紐付けてくれるLogs in context
© 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/nrzapLogs in contextの実装
© 2012-2022 BASE, Inc. 25#gocon2022_4sponsor@budougumi0617● エラーレポートにはSentryを併用○ SentryにNew RelicのTrace IDなどを付与しておくとログがすぐ見つかるので便利○ (エラーレポートはまだNew RelicよりSentryのほうが便利かなと思っている)その他
© 2012-2022 BASE, Inc. 26123#gocon2022_4sponsor@budougumi0617New Relicで何がわかるようになるかGoで疎結合な実装をするテクニックプラットフォームな設計をする時はプロダクトメンバーの開発体験を意識すること今日伝えたいこと