7.1K Views
June 16, 24
スライド概要
JJUG_CCC_2024Springで発表した資料です。
ウェルスナビ株式会社 技術広報チームの公式アカウントです。
WealthNaviでの Observability実践と サービス改善への活⽤ 福⽥ 淳雄 JJUG CCC 2024 Spring 1
⾃⼰紹介 氏名 福田 淳雄 ウェルスナビ株式会社 バックエンド開発グループ/ グループ責任者 ウェルスナビでは ● 2020年にJoinし顧客向けWebアプリケーション実装を担当 ● 2021年から取引管理チームの新設とともに異動 ● 2023年末からバックエンド開発Gの責任者を兼務 ひとこと ● ウコンとオルニチンが手放せません 2 @2024 WealthNavi Inc.
WealthNavi /ウェルスナビの紹介 資産運用ロボアドバイザー “WealthNavi” ※⼀般社団法⼈⽇本投資顧問業協会「契約資産状況(最新版)(2023年9⽉末現在)『ラッ プ業務』『投資⼀任業』」を基にネット専業業者を⽐較 ウエルスアドバイザー社調べ (2023年12⽉時点) ※画⾯はイメージです。 3 @2024 WealthNavi Inc.
アジェンダ 1. 本日お話すること(スコープと課題の提示) 2. Javaアプリケーションの監視方法 3. WealthNaviのObservability基盤の構成 4. Observabilityの実現によって得られたもの 5. さいごに 4 @2024 WealthNavi Inc.
1. 本日お話すること(スコープと課題の提示) 2. Javaアプリケーションの監視方法 3. WealthNaviのObservability基盤の構成 4. Observabilityの実現によって得られたもの 5. さいごに 5 @2024 WealthNavi Inc.
本⽇お話すること(スコープと課題の提⽰) サービスを継続運⽤するうえでの課題 ● ● ● スケーラビリティとパフォーマンス 信頼性、可⽤性の維持と向上 技術やビジネス、法規制等、環境変化への対応 課題解決へのアプローチ ● ● ● Quality Assurance(品質保証) いち早く異常を察知し対応する(事後保全) 異常な状態になる前に検知する(予防‧予知保全) 6 @2024 WealthNavi Inc.
1. 本日お話すること(スコープと課題の提示) 2. Javaアプリケーションの監視方法 3. WealthNaviのObservability基盤の構成 4. Observabilityの実現によって得られたもの 5. さいごに 7 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法 ⼀般的なアプリケーションのモニタリング項⽬ 8 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法 可観測性(Observability) 9 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法 アプリケーションログについて ● WealthNaviでのログの標準化の取り組み ○ ⽅針 ■ ログ出⼒は基本的に運⽤担当者向けのメッセージであるべきである ■ ログ出⼒は単純明快で可読性が⾼いものでなければならない ○ ○ 形式 ■ JSON 出⼒項⽬の⼀例 項目 内容 項目 内容 カテゴリ 障害、イベント、監査 TraceId 分散トレーシング用 ID 緊急度 緊急、要確認、静観 処理件数 バッチ等の処理件数 復旧手順 データパッチ適用 etc メッセージ 運用担当者向けのメッセージ 10 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法 アプリケーションログの落とし⽳ ● 失敗事例 ○ 安易なERRORレベルのログ ■ リリースしたらエラー通知が⽌まらない ○ ⾒てもよくわからないログ ■ log.error(“エラーが起こったよ”); ○ INFOログの過剰出⼒によるパフォーマンス劣化 ■ disk fullでエラーが発⽣するなど ○ トレーディングにおける計算の途中結果を出⼒しすぎた ■ 必要なものではあるがDBに⼤量のデータが登録されパフォーマンス劣化 11 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法 メトリクス情報 ● Javaアプリケーションから取得できるメトリクス ○ Heapメモリの状態 ○ activeなthreadの数 ○ gcの実⾏回数や実⾏状況 ○ (他多数) メトリクス情報収集の技術要素 ● ● ● JMX(Java Management Extensions) ○ JVMを管理‧監視するツールを提供するJavaテクノロジ MBean(MXBean) ○ 管理対象Bean、このオブジェクトを介して情報を取得する JConsole ○ JMXに準拠した監視ツール 12 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法 JMXを利⽤した監視の構成要素 13 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法
MBean 実装例
● JMXはこれまで度々脆弱性が報告されているため扱いには注意が必要
● 特にリモート監視を有効にする場合はセキュリティが重要
● ネットワーク保護やパスワード認証、SSLクライアント証明書の利⽤の検討が必須
// MXBean interface MXBeanをSuffixにつける
public interface HogeSamplerMXBean {
public int getCount();
}
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
// MXbeanをMBeanServerに登録する
public static void main(String[] args) throws
Exception {
MBeanServer mbs =
ManagementFactory.getPlatformMBeanServer();
// MXBean impementations
public class HogeSampler
implements HogeSamplerMXBean {
private int count;
//...中略
ObjectName mxbeanName = new
ObjectName("packagename.hogesampler:type=HogeSample
r");
public HogeSampler (int count) {
this.count = count;
}
// …. 中略
}
HogeSampler mxbean = new HogeSampler(100);
mbs.registerMBean(mxbean, mxbeanName);
}
14
@2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法 JConsole ● ローカルでの開発やプロトタイピングでは有効 ● 本番環境での利⽤はJConsole⾃体のリソース消費が⼤きいため⾮推奨 15 @2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法
Spring Boot Actuator
●
●
⼀般的にはより利⽤頻度が⾼いであろうSpring Boot Acuatorについて紹介します
アプリケーションの機密情報が含まれる場合があるため、ネットワーク保護、
Spring Security等による認証設定などセキュリティに注意が必要
// pom.xml
// 必須ライブラリ
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
// デフォルトではinfoエンドポイントは空を返します。
// 静的情報であれば下記のようにappliaction.propertiesに追加することで定義すること
ができます。
info.application.name = WealthNavi Apps
info.application.description= roboad service
info.organization = WealthNavi
// application.propeties
// エンドポイントをオプトイン方式に変更
// デフォルトではshutdown以外の全てのエンドポイントが有効
management.endpoints.enabled-by-default=false
// 上記の定義をした状態で localhost:8080/actuator/info にアクセスする
// json形式でデータが取得できる
{
"application":{
"name":"WealthNavi Apps",
"description":"roboad service"
},
"organazation":"WealthNavi"
}
// infoエンドポイントのみを有効にしhttpで公開する
management.endpoint.info.enabled=true
management.endpoints.web.exposure.include=health
// jmxでもデフォルト公開されているため要注意
management.endpoints.jmx.exposure.include=health
16
@2024 WealthNavi Inc.
Javaアプリケーションの監視⽅法
Spring Boot Actuator
●
infoエンドポイントのカスタマイズ⽅法の紹介
// 下記のようにInfoContributorを実装することで取得する情報を追加することが可
能
@Component
@RequiredArgsConstructor
public class CustomInfoContributor implements
InfoContributor {
private final JdbcTemplate jdbcTemplate;
// 左記の定義をした状態で localhost:8080/actuator/info にアクセスする
// json形式でデータが取得できる
{
"Order":{
"count":"100",
}
}
// 例えばDBに登録された当時の注文件数を監視する
@Override
public void contribute(Info.Builder builder) {
int orderCount =
jdbcTemplate.queryForObject("SELECT COUNT(*) FROM Order
where orderDate = ?", Integer.class, "2024-06-01");
builder.withDetail("Order",
Collections.singletonMap("count",
String.valueOf(orderCount)));
}
}
17
@2024 WealthNavi Inc.
1. 本日お話すること(スコープと課題の提示) 2. Javaアプリケーションの監視方法 3. WealthNaviのObservability基盤の構成 4. Observabilityの実現によって得られたもの 5. さいごに 18 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 WealthNaviのObserverbility基盤の全体像を紹介します 19 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Datadogへのテレメトリーデータ送信 20 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Error Tracking ● ● ERRORログが出⼒されると⾃動検知してSlackに通知されます 「エラーが起こったよ」(log.error().......) ○ ⾒てもよくわからないログが出ていたりすることもあります 21 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Error Tracking ● ● エラーログから同時刻に記録された対象のアプリケーションのログを追うことがで きます Stack Traceはログに出⼒されているため、どこでエラーが発⽣したかはわかります 22 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Performance Insights ● WealthNaviのアプリケーションのPerfomance Insightsを紹介します 23 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Performance Insights ● ⾚枠の部分が各APIのLatencyや実⾏時間が多くかかっている順にソートされていま す 24 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Performance Insights ● ● リソースをドリルダウンしていくと内容の詳細が明らかになっていきます ⾚枠部分でコストの⾼いQueryを参照できます 25 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Performance Insights ● Queryの実⾏計画が参照できます 26 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Performance Insights ● ● Queryの実⾏計画が参照できます Performanceに対する効率的なInsightsを得ることができます 27 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Tracing Insights ● WealthNaviのアプリケーションのTracing insightsを紹介します 28 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Tracing Insights ● ドリルダウンするとAPIで利⽤しているSQLを参照することができる 29 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 伝説のgetlogs ● ● Datadog導⼊以前、WealthNaviのObservabilityは、、、 Slackコマンド /getlogs が存在した 30 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 伝説のgetlogsのアーキテクチャ ● EC2時代に以下にサーバーに直接アクセスせずに且つ安価にログを参照できないか と⼯夫した先⼈の知恵 31 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 Javaアプリケーションのテレメトリー情報をDatadogに連携するには 監視対象のアプリケーションの起動時に Java⽤トレースライブラリを起動アプ リケーションの-javaagentに指定する Datadog Agentを介してDatadogのバッ クエンドにテレメトリーが連携される 32 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 javaagentとはなにか ● ● Javaのバイトコードを変更することで、実⾏中のプログラムに任意の処理を加える ことができる 対象のアプリケーションのmainメソッドが実⾏される前(permain)や実⾏後 (agentmain)に動作するメソッドを持つこともできる 33 @2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成
ECSタスクにおけるDatadogとJavaアプリケーションをつなぐためのAPM設定例
●
必要になるECSタスク定義の設定項⽬はtrace-agentやdd-agentのバージョンによっ
て変わるため、都度Datadogのドキュメントを確認することを推奨
{
"image": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example-app:v0.0.1",
"environment": [{
"name": "JAVA_TOOL_OPTIONS",
"value": "-javaagent:../dd-java-agent.jar -jar example-app-0.0.1-SNAPSHOT.jar"
}],
},
{
"image": "public.ecr.aws/datadog/agent:latest",
"portMappings": [{
"hostPort": 8126,
"protocol": "tcp",
"containerPort": 8126
}],
"secrets": [{
"name": "DD_API_KEY",
"valueFrom": "xxxxxxxx"
}]
}
34
@2024 WealthNavi Inc.
WealthNaviのObservability基盤の構成 サービスの成⻑と共に増えるコスト ● サービスの成⻑と共にリクエスト数(トレース数)が増え、それに⽐例しDatadog の利⽤料⾦が増⼤した トレースのサンプリングレートを削減することで対応 ● サンプリングレートの調整 ○ 例)環境変数に DD_TRACE_SAMPLE_RATE = "0.3" と設定すると、約70%のト レースが破棄される ○ トレースを維持するか削除するかの決定はルートスパンの開始時に⾏われ、後 続のサービスに伝搬されるため⽋損の⼼配はない https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/?tab=java#head-based-sampling ● 除外リソースの指定 ○ 例)環境変数に DD_APM_IGNORE_RESOURCES = "GET .*/healthcheck$" と設 定すると、 /healthcheck に対するリクエストのトレースを取り込み除外する ことができる 35 @2024 WealthNavi Inc.
1. 本日お話すること(スコープと課題の提示) 2. Javaアプリケーションの監視方法 3. WealthNaviのObservability基盤の構成 4. Observabilityの実現によって得られたもの 5. さいごに 36 @2024 WealthNavi Inc.
Observabilityの実現によって得られたもの Error Trackingによる迅速な障害対応 ● ● ● 素早い発⽣検知 原因分析の精度向上 影響範囲の特定と適切な対応策 Performance Insightsによる予防保全 ● ● ● パフォーマンス問題の早期発⾒ パフォーマンスの最適化 プロアクティブな対応 37 @2024 WealthNavi Inc.
Observabilityの実現によって得られたもの Tracing Insightsによるシステム理解 ● ● ● アプリケーションの探索と洞察環境の獲得 暗黙的知識を前提としないアプリケーションへの理解 デバッグの効率化 今後の展望 ● ● ● 継続的な運⽤とさらなるObservabilityの改善を続けていく マルチサービス化に向けた基盤整備 Datadog Bits AI活⽤ 38 @2024 WealthNavi Inc.
1. 本日お話すること(スコープと課題の提示) 2. Javaアプリケーションの監視方法 3. WealthNaviのObservability基盤の構成 4. Observabilityの実現によって得られたもの 5. さいごに 39 @2024 WealthNavi Inc.
バックエンド開発グループの紹介 ● ロボアドサービスにおける新機能開発やエンハンス開発 ● 技術的負債解消やアーキテクチャのモダナイズ ● ロボアドサービスの根幹を⽀える開発部隊 Latency Integration Container Framework Performance SQL Resillience Log Architecture Pub/Sub Cloud Java Security Event-Driven 40 @2024 WealthNavi Inc.
【重要な注意事項】 ● 本資料は、断定的判断を提供するものではなく、情報を提供することのみを⽬的としており、いか なる種類の商品も勧誘するものではありません。最終的な決定は、お客様⾃⾝で判断するものと し、当社はこれに⼀切関与せず、また、⼀切の責任を負いません。 ● 本資料には将来の出来事に関する予想が含まれている場合がありますが、それらは予想であり、ま た、本資料の内容の正確性、信頼性、完全性、適時性等を⼀切保証するものではありません。本資 料に基づいて被ったいかなる損害についても、当社は⼀切の責任を負いません。また、当社は、新 しい情報や将来の出来事その他の情報について、更新⼜は訂正する義務を負いません。 ● 本資料を利⽤することによりお客様に⽣じた直接的損害、間接的損害、派⽣的損害その他いかなる 損害についても、当社は⼀切の責任を負いません。 商号等:ウェルスナビ株式会社 金融商品取引業者 関東財務局長(金商)第2884号 加入協会:日本証券業協会 一般社団法人日本投資顧問業協会 41 @2024 WealthNavi Inc.
ご清聴ありがとうございました 42 @2024 WealthNavi Inc.
Appendix.Ⅰ ウェルスナビでは複数の開発系ポジションで採⽤を強化しています。 主な採⽤中職種 ● ● ● ● ● バックエンド開発エンジニア エンジニアリングマネージャー データエンジニア モバイルエンジニア(Android) SRE 採⽤情報詳細 ● 下記URL(QRコード)よりご確認ください。 https://hrmos.co/pages/wealthnavi 採⽤に関する お問い合わせ先 ● ● 「カジュアルに話を聞いてみたい」という温度感でも構いません。 ウェルスナビ採⽤チーム([email protected])までご連 絡お待ちしております。 43 @2024 WealthNavi Inc.
Appendix.Ⅱ 定期的にWealthNavi開発(技術‧組織)に関する情報を発信しています。 開発者ブログ ● 技術広報に関する お問い合わせ先 ● https://zenn.dev/p/wn_engineering ブックマーク追加や記事への「いいね」していただけると嬉しいです ウェルスナビ技術広報チーム([email protected]) 44 @2024 WealthNavi Inc.