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

Rustを使った社内用Webアプリの開発・運用を持続させるために、素材メーカーが学んだこと

morimori
December 02, 2024

 Rustを使った社内用Webアプリの開発・運用を持続させるために、素材メーカーが学んだこと

Rust Tokyo 2024 の、発表資料(スポンサー枠)です!
リンク:https://rust.tokyo/lineup/16

素材メーカーのソフトウェア内製開発部隊が、開発言語にRust 採用した後の2年間で、持続的な開発・運用のために行った、開発/運用体験向上のための試行錯誤や、過去(と今)の苦労談、学びなどを紹介します。

morimori

December 02, 2024
Tweet

Other Decks in Programming

Transcript

  1. 自己紹介 Others ©AGC Inc. ~ 2023年:博士卒で、3年データサイエンス職 2023 ~ 現在:AGC ユーザーが使うアプリケーション

    を自分で作れるようになりたい。 内製ソフトウェア開発チームに ジョイン。去年から、Rust と、 ソフトウェア開発が始まる。
  2. Rustで開発・運用するまえに思ったこと Others ©AGC Inc. 開発: • コンパイラが(いい意味で)厳しい • 実行前に問題を教えてくれる •

    メモリ • 並行処理 • など、気づけないと死ぬところ • 「標準」のパッケージマネージャー cargo の存在 運用: • 性能面(早い!、安全なメモリ利用!) 一言で:これ以上なさそうな、言語思想・体系!!
  3. Rustで開発・運用するときに困ったこと・対応 Others ©AGC Inc. 開発: • 新人教育コスト • ライブラリの導入コスト •

    使い方がない、そもそも存在しない • ビルドコスト • 開発環境の設定難しい(エラーの追跡) 運用: • ログの追跡が難しい (Rust無関係) • → Tracing を導入したい • → APM ベンダ群に、Rust用 SDK なし。 説明(+) 説明(ー) 新人研修見直しとCopilot 気合の自作か、妥協して新しい コンポーネントを他言語で作る 分散Traceを開発環境にも 高いマシン+mold OpenTelemetry の導入 一言で:Rust に、人間が追いつけてない??
  4. 解説: Trace/Span の現物を見てみる (1コンポーネント) Others ©AGC Inc. Span 同士の親子関係が、定義可(visit store

    -> browse -> web request) Span := 追跡対象のコードブロック(関数, 複数行のコード) Trace := Span の集合 例では、Span = 関数 として、Span を定義。
  5. Others ©AGC Inc. 各 Span には、key-value 形式で属性が付与可能 例外、log (event) を付与可能。

    ユーザー毎の操作 を追跡したい場合、 Root Span にユーザ - IDがあればOK
  6. 解説:分散 Trace の歴史と標準仕様 Others ©AGC Inc. • 2010年:Dapper (Google) ←

    Traceが初めて考案・実践 • 2012年:Zipkin (Twitter) • 2017年:Jaeger (Uber) ← オープンソースの分散Traceシステム • (同時に、様々なAPMベンダが、分散Trace に対応) • 2019年:OpenCensus + OpenTracing → OpenTelemetry @ CNCF OpenTelemetry とは? 一言で言うと?:Signal (Log/Metrics/Trace) の 「標準規格」+上記シグナル生成のためのライブラリ
  7. 対策:自分たちのアプリに分散Traceを Others ©AGC Inc. 自分達で、開発する範囲内なら、OpenTelemetry 不要。 サポートが使えるAPMベンダのSDKを使って、楽をしようとするも。 自分 ベンダ A

    ベンダ B Rust に、分散 Trace を導入したい ですが、Rust 用SDKあります? ない あるけど、 アプデ3年前 OpenTelemetry かなぁ。 やってみるか。
  8. 対策:自分たちのアプリに分散Traceを @ 調査・学習 Others ©AGC Inc. ローカルのPythonコードに、 OTel で分散Trace 導入。

    Docker で、Jaeger を立てて、 Trace を確認できるようになる。 Rust で、Tracing クレートが、 何者かがわかった。 tracing-…系クレートの区別を知った。 (Tracing 以外の話も有益でした。) 公式の、Example を実際に触る。 クレートのver 指定で死んだり、 似たようなクレート多くて、 何が何だか… 似たようなクレート多すぎ問題。
  9. 対策:自分たちのアプリに分散Traceを @ 調査・学習 Others ©AGC Inc. ローカルのPythonコードに、 OTel で分散Trace 導入。

    Docker で、Jaeger を立てて、 Trace を確認できるようになる。 Rust で、Tracing クレートが、 何者かがわかった。 tracing-…系クレートの区別を知った。 (Tracing 以外の話も有益でした。) 公式の、Example を実際に触る。 クレートのver 指定で死んだり、 似たようなクレート多くて、 何が何だか… 動きそう!! 開発環境で追跡しづらい問題 運用:ログの追跡が難しい
  10. 対策:自分たちのアプリに分散Traceを @ 開発環境 Others ©AGC Inc. テスト実行時に、Tracingを確認できるように。 テストで、マクロを書くと、OTel の Trace

    をローカルの Jaeger に 送れるマクロを、自分達用に整備 Motto:自動計装ないので、一通り、使う関数は trace 対象にする Chap4で述べられていた、Test環境へ のTrace導入を自分たちなりに整備
  11. 苦労した(ている)点:運用 Others ©AGC Inc. ・async-graphql の Error 型だと、Span にエラー付与不可: →

    既存のError 型の整備作業 ・Tracing で、panic が表示されない問題:→ panic ハンドラを使う ・tracing::instrument(err, …) マクロ付与忘れ: →未対応。何か独自Linterを作るいい方法ないですか??
  12. 苦労した(ている)点:開発 Others ©AGC Inc. ・Test 用の計装マクロの、結合テストが、実装並みに難しい。 → opentelemetry_otlp のテストを参考に結合テスト実装。 ・そもそも、debugger

    の追跡が、ぶっ飛ばないeditor 設定にしたい: →次の発表の、Rust Rover の紹介に期待してます。 ・Test 用の計装マクロ作りが、普通に計装するより難しい:
  13. END