Slide 1

Slide 1 text

Reckoner の Scala プロジェクトにおける オブザーバビリティの取り組み 2024/02/27 Scalaわいわい勉強会 #2 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 2

Slide 2 text

自己紹介 門脇 拓巳 (KADOWAKI Takumi) 株式会社スリーシェイク Incubation 事業部 Reckoner 開発チーム RDAP と呼ばれる Scala 製バッチアプリケーションの 開発・運用に携わる X (Twitter): @nomadblacky GitHub: NomadBlacky

Slide 3

Slide 3 text

アジェンダ この発表の目的: - 誰に? - Scala アプリケーションを運用している人に - 何を? - オブザーバビリティの概念を導入したら色々な良いことがあったよ オブザーバビリティの概要から、実際に Reckoner に適用していった事例をお 話します。

Slide 4

Slide 4 text

Copyright © 3-shake, Inc. All Rights Reserved. Reckoner の紹介 01 4

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

直感的な UI で複雑なデータ操作

Slide 7

Slide 7 text

多種多様なデータ連携先

Slide 8

Slide 8 text

アーキテクチャ RDAP2 と呼ばれるScala製バッチアプリ (Akka Stream)

Slide 9

Slide 9 text

運用での課題 - ユーザーからの問い合わせから原因の特定、修正まで時間がかかっていた - ユーザーがどのような設定でワークフローを実行していたのか、 どのような処理で失敗していたのか、追うことが困難だった - パフォーマンス改善に必要な情報がなかった - どの処理でどれだけ時間がかかっているのか、判断する要素がなかった - エラーログから対応が必要なものか逐一確認する必要があった - エラーログが発生する度にアラートが鳴る運用になっており、 ログを確認する人的コストが肥大化していた

Slide 10

Slide 10 text

Copyright © 3-shake, Inc. All Rights Reserved. オブザーバビリティについて 02 10

Slide 11

Slide 11 text

オブザーバビリティとは? ざっくりと言えば… 「システムがどのような状態になったとしても、システム状態のデータからアプリケーショ ンで起こっていることをどれだけ理解し説明できるか (デバッグができるか) の尺度」 つまり… オブザーバビリティの概念を取り込むことで、 ユーザがいつ、どのような体験をしているのか が理解できるようになる! 詳しく知りたい方はこちらの本で

Slide 12

Slide 12 text

オブザーバビリティの構成要素 オブザーバビリティの基礎となる構成要素は 「任意の要素を持つ構造化イベント」 例えば、Web サーバへのリクエストでは… 実行コンテキスト - エンドポイント - HTTPヘッダー - URLパラメータ - ユーザID ランタイム情報 - OS - JVM バージョン - コンテナID - リージョン ビルド情報 - アプリバージョン - コミットハッシュ - リポジトリURL … これらの要素が多ければ多いほど 要素をかけ合わせるパターンが増えて、 柔軟なデバッグが可能になる!

Slide 13

Slide 13 text

代表的な要素 メトリクス 定期的に収集される統計データ CPU使用率、メモリ使用率 etc. ログ アプリケーションから出力されるテキストデータ トレース 「いつ、どのような処理が、どれぐらい時間がかかったか」を可視化するデータ ※これらをまとめて「テレメトリーデータ」と呼ぶ 今回のメイン

Slide 14

Slide 14 text

Copyright © 3-shake, Inc. All Rights Reserved. Scala プロジェクト (RDAP2) に オブザーバビリティを導入する 03 14

Slide 15

Slide 15 text

RDAP2 におけるオブザーバビリティのアーキテクチャ OpenTelemetry API dd-java-agent

Slide 16

Slide 16 text

RDAP2 におけるオブザーバビリティのアーキテクチャ - dd-java-agent - 監視 SaaS である Datadog が公式に提供している Java Agent - 起動時に java コマンドのオプションとして組み込む - HTTP リクエストや DB へのクエリなど、 一般的なライブラリやフレームワークの処理を自動で 計装することができる - OpenTelemetry - メトリクス、トレース、ログなどのテレメトリーデータを収集・転送する仕組みは監視ベンダごとに異な る実装になっていた - この仕組みを統一化し、ベンダロックインされない仕組みを作ろうと生まれたプロジェクト - ベンダに依存しないテレメトリーデータを様々なプログラミング言語で扱うことができる RDAP2 では主に、 IO 処理を dd-java-agent、ビジネスロジックを OpenTelemetry で計装 アプリケーションに テレメトリーデータを 組み込むこと

Slide 17

Slide 17 text

dd-java-agent によるトレースの自動計装 build.sbt sbt-native-packager sbt-javaagent dd-java-agent の設定

Slide 18

Slide 18 text

OpenTelemetry API によるトレースの手動計装 OpenTelemetry API の簡易ラッパー エラー時は内容を記録 (後述)

Slide 19

Slide 19 text

OpenTelemetry API によるトレースの手動計装 スパンにメタデータを付与 ActorSystem の初期化時間を計測 ブロックで囲むことで スパン (トレースにおけるいち処理の単位 ) を表現

Slide 20

Slide 20 text

できあがったもの

Slide 21

Slide 21 text

Copyright © 3-shake, Inc. All Rights Reserved. オブザーバビリティ を導入してどうなった? 04 21

Slide 22

Slide 22 text

タスクの実行内容を詳細に確認できるようになった!

Slide 23

Slide 23 text

「失敗したタスクのうち、 BigQuery API の 5xx エラーを含むトレース」 といった柔軟な検索が可能に

Slide 24

Slide 24 text

SQLなどのクエリ内容を確認できる デバッグに役立つ様々な情報をトレースが提供してくれる

Slide 25

Slide 25 text

非効率な処理を見つけることができるようになった! 本来は並列で実行できるが 直列実行になってしまっている …

Slide 26

Slide 26 text

非効率な処理を見つけることができるようになった! Monix Task の使い方を誤っていた …

Slide 27

Slide 27 text

非効率な処理を見つけることができるようになった! 並列で実行されていることがトレースでも 確認できた! 数十分かかっていた処理が数十秒に短縮!

Slide 28

Slide 28 text

エラーを収集して品質改善に活かせるようになった! Datadog の Error Tracking を使ってエラーを収集 自動でエラーのクラスタリングと集計を行ってくれる

Slide 29

Slide 29 text

エラー切り分けの工数削減し、 ナレッジ共有ができるようになった! 週1回、エラーの内容を確認する会を実施 エラーの詳細ページではスタックトレースや スパンに追加したメタ情報を確認可能

Slide 30

Slide 30 text

Copyright © 3-shake, Inc. All Rights Reserved. まとめ 05 30

Slide 31

Slide 31 text

まとめ Reckoner とは - 直感的な UI でデータ連携を実現する、クラウド型の ETL SaaS オブザーバビリティとは - アプリケーションの状態を把握して、デバッグできるかの尺度 Scala プロジェクトにオブザーバビリティを導入することで - アプリケーションの実行内容を詳細に確認することができるようになった! - 非効率な処理を見つけて修正できるようになった! - エラーを収集して品質改善に活かせるようになった!

Slide 32

Slide 32 text

最後に Reckoner では Scala エンジニアを募集しています! - https://jobs-3-shake.com/ - https://hrmos.co/pages/threeshake/jobs/E_0220 連携先の追加、既存連携先の機能強化、 Java アップデート、Scala3 対応、Akka 移行、 オブザーバビリティの強化… やること盛りだくさんで人手が足りません 😭