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

技術的負債と戦略的に戦わざるを得ない場合のオブザーバビリティ活用術 / Leveraging ...

技術的負債と戦略的に戦わざるを得ない場合のオブザーバビリティ活用術 / Leveraging Observability When Strategically Dealing with Technical Debt

オブザーバビリティ / 関ジャバ'25 5月度
https://kanjava.connpass.com/event/351098/

Avatar for yoshiyoshifujii

yoshiyoshifujii

May 22, 2025
Tweet

More Decks by yoshiyoshifujii

Other Decks in Programming

Transcript

  1. 前提
 - 10年以上運用されているプロダクト
 - 大規模でミリオン以上のユーザー数 
 
 - 技術的負債が多様でどこから手をつけていいのか分からない
 -

    EOL祭、仕様不明、初期メンバー不在、コードのノリが複数混在、とにかく1ファイルが長い 
 
 - 現場に任せて何とかなるならもうなっている
 - もちろん現場だけでなくマネジメントにも問題ある 
 
 - 新規開発を止めることはできない
 - ほんまか?でもまあそういうことにしておきましょう 
 
 - 戦略的に取り組まないとどうしようもないんじゃないかと素直に思う
 - そう思って過去に取り組んできたけど場当たり的になって本質は変わってない 

  2. ストラングラーフィグ パターン
 - モダンシステムへの移行を段 階的にできる
 - モダンシステム開発を段階的 にしながらも既存アプリケー ションは機能する 


    - ファサード (プロキシ) は、レガ シーシステムに送信する要求 をインターセプト
 - ファサードは、これらの要求を レガシーまたは新しいサービ スにルーティングもしくはミラー リング
 https://learn.microsoft.com/ja-jp/azure/architecture/patterns/strangler-fig 

  3. レガシーにオブザーバビリティはあるか
 - もちろん無い 
 - あったらレガシーと呼ばれない
 - ただし、ログ、メトリクス、トレースは取れる
 - オブザーバビリティ・エンジニアリングの定義には行けない


    - レガシーは、トレースを自動計装 (Automatic instrumentation) で
 取得しよう
 - https://opentelemetry.io/docs/zero-code/php/ 
 - https://opentelemetry.io/docs/zero-code/java/ 
 - https://docs.datadoghq.com/ja/tracing/trace_collection/automatic_instrumentation/?tab=singlest epinstrumentation
 

  4. 伝播 (Propagation)
 - 分散トレーシングを実現するのに、トレースコンテキストの伝播が必要
 - Trace Context
 - サービス間やプロセス間で「どの範囲のトレースに属しているか」などの情報 


    - 分散システム間でコンテキスト情報(トレースID、親スパンID、サンプリングフラグなど)を伝播し、単 一トレースとして追跡できるように設計されている 
 - 標準的なものと、ベンダー定義
 - https://www.w3.org/TR/trace-context/ 
 - traceparent:固定長のフォーマットでトレースIDや親スパンID、フラグを含む 
 - https://docs.datadoghq.com/ja/tracing/trace_collection/trace_context_propagation/ 
 - x-datadog-trace-id:128 ビットのトレース ID の下位 64 ビットを 10 進数で指定 
 - x-datadog-parent-id :現在のスパンに対応する 64 ビットのスパン ID を 10 進数で指定 

  5. Traceの構成要素
 - Trace は、 Span と呼ばれる意味のある操作の記録から構成される
 - Span は、システム内の作業単位を表す
 -

    例: サービスへのリクエスト、データベース呼び出し、関数呼び出し 
 - TraceID, SpanID, ParentSpanID, Name, StartTime, EndTime 
 - 親子関係があり、トレースツリーを形成できる
 - ParentSpanID を持たない Span は、 Root Span となる 
 - Span Attributes があり、その操作の詳細を示す属性を追加できる
 - https://opentelemetry.io/docs/concepts/signals/traces/#attributes 
 - これが、オブザーバビリティにとても重要 
 - なお、Open Telemetry のセマンティクスがあるので、これに従うべし 
 - https://opentelemetry.io/docs/specs/semconv/general/trace/ 

  6. レガシーのTraceをどう取るか
 - そりゃできれば OpenTelemetry に準拠したい
 - が、事情によっては難しい場合もある
 - すでに、ベンダーロックインされている 


    - DatadogやNewRelicに強い依存がある状態 
 - レガシーゆえに取り除くとバグる可能性がある 
 - それでも工数をかけてやるべしもあり得る 
 - ベンダーは OpenTelemetry 互換を持っている
 - https://docs.datadoghq.com/ja/opentelemetry/ 
 - https://docs.newrelic.com/jp/docs/opentelemetry/opentelemetry-introduction/ 
 - レガシーに大きく手を入れることは避けたい
 - なるだけ安く Trace を取る、ただし、取らない選択肢はないので、
 何かはするべし

  7. 監視ツールの選定
 - そりゃ Honeycomb 一択でしょ と言いたいが…
 - オブザーバビリティ・エンジニアリングの著者が所属している 
 -

    大人の事情を考慮する
 - 既に導入されているツールが最優先
 - Datadog, NewRelic, Mackerel, Jaegerとかですかね 
 - 何はともあれ、トレースが繋っていることを最優先とする

  8. モダンシステムは OpenTelemetry 一択
 - OpenTelemetry
 - https://opentelemetry.io 
 - OpenTelemetryの核となるミッション


    - 「高品質でポータブルなテレメトリーをユビキタスにすることで、効果的なオブザーバビリティを実現 する」
 - オブザーバビリティのための標準化
 - ベンダー非依存
 - 主要な構成要素
 - API, SDK (Javaあるよ), Collector, Protocol (OTLP), Context Propagation, Semantic 
 - モダンにしたあとレガシーになるのを遅延させるためにも標準をなるだけ採用して いきたい

  9. SLO を定義する
 SLO の定義は難しい…だがやる
 - CUJ → SLI → SLO(仮)→とりあえず運用してみる


    
 - CUJ
 - クリティカル ユーザー ジャーニー 
 - 様々なユーザージャーニー(顧客体験)の中でビジネス上もっとも重要なジャーニー 
 - これが失なわれると、著しくユーザー満足度を低下する要因となること 
 - SLI
 - サービスの可用性の目標を測定するために使用する指標 
 - システムの状態を「良い」と「悪い」に分類する 
 - 取りだすといくらでも取れちゃう 
 - CUJ に着目して、CUJ に関係する指標を最初に取る 

  10. SLO を定義する
 - SLO
 - SLI を使用して測定されるサービスの可用性に関する「合意された目標」を定量化したもの 
 - あくまで目標値


    - 契約上の合意 (SLA) とは違う 
 - 柔軟に変更したり更新したりできる 
 - 最初から正確な値を目指さない(というかできない) 
 - 運用しながら徐々に自分たちの能力に合わせていく 
 - 費用対効果も重要
 - やり過ぎは過剰な品質 
 - お客様は充分満足しているのに過度に頑張るとコスパ悪いよね 

  11. SLI に Trace を使う
 - SLI はサービスの信頼性を測る重要な指標
 - システムリソースやエラー率では不十分
 -

    ユーザーが実際に「良い体験」をしているかどうかを正確に測る
 - 「モダンにしたけどユーザー満足度が低下しました!」は最も避けるべき
 - クライアント→ファサード→モダンをトレーシングしてSLIを取る
 - Span Attributesを最大限活用する
 - 関数単位でSpanを作るとするなら、InputとOutputを全てSpan Attributesに入れる 
 - Outputは、正常系/異常系を両方捉えて逃さないようにする 
 - 関数内で複数のステップを踏むのであれば、関数内での状態変化もSpan Attributesに入れたい 
 - 参照透過性の高い関数設計なら関数のIOでSpanを構築しまくるといいかも 

  12. SLO → SLI → Trace をつなげる
 - SLO に異常が発生したら
 -

    SLI を確認し
 - Trace に辿りつく
 - その際、Traceは、いつ、どこで、だれが、何をして、どうなったという情報に直結して おり
 - それは、全体における割合を把握でき
 - 異常なのか正常なのか奇妙なのかを調べる手段が一般化されている
 - これがオブザーバビリティのある状態と言えそう

  13. レガシーのSLOはどうするの
 - モダンシステムは、モダンなので、ちゃんとSLOやるよね
 - レガシーはどうなのか
 - レガシーシステムはだいたいSLOあってもCUJと異なる指標だったり不十分だったり 運用されていなかったり、そもそも無いことが多い
 - モダンは、SLOを定義した


    - レガシーに同等のSLOは適用できない
 - だが、よく考えてみると、今までSLOなくてもやってこれた
 - ってことは、肌勘はあるのだろう
 - その肌勘と、モダンなSLOでやっていくでもいいんじゃないだろうか
 - それとも、レガシーに頑張ってSLOを入れますか…捨てるけど…

  14. 参考
 - オブザーバビリティ・エンジニアリング - オライリー
 - https://www.oreilly.co.jp/books/9784814400126/ 
 - SLO

    サービスレベル目標 - オライリー
 - https://www.oreilly.co.jp/books/9784814400348/ 
 - 実践 OpenTelemetry - オライリー
 - https://www.oreilly.co.jp/books/9784814401031/ 
 - OpenTelemetry
 - https://opentelemetry.io/ja/