CNCFにおけるObservability
AI駆動開発では、SecurityやObservabilityのような非機能要件をどのように成立させるのかが大きな論点になります。
Observabilityだけを考えても、分散トレース、メトリクス、構造化診断、Payload保護、外部監視基盤連携など、多数の横断的機能が必要になります。
これらを毎回AIへ自然文で指示し、個別実装へ委譲すると、生成コスト・レビューコスト・運用コストが急速に増大し、品質保証も不安定になります。
そのためCML&CNCFでは、文芸モデル (Literate Model)へ十分な構造情報を記述すると、モデルコンパイラと実行フレームワークがSecurityやObservabilityを横断的に成立させます。
AI駆動開発でRuntime Supportが必要になる理由
理論上は、SecurityやObservabilityのような非機能要件も、すべてをプロンプト (Prompt)や仕様書へ記述することは可能かもしれません。
しかし現実には、Observabilityだけを考えても、分散トレース、メトリクス、構造化診断、相関ID、Payload保護、機密情報マスキング、外部監視基盤との接続など、多数の横断的機能が必要になります。
これらを毎回AIへ自然文で指示し、個別実装へ委譲すると、実装複雑度と運用複雑度は急速に増加します。
SimpleModeling (シンプルモデリング)では、CMLとCNCFによってこれらの品質属性 (Quality Attribute)を吸収し、AIはドメイン・モデル (Domain Model)やドメイン・ロジックの開発に専念できるようにしています。
なぜAI駆動開発で問題が増幅されるのか
さらに問題になるのは、生成AIの利用コストです。
SecurityやObservabilityのような横断的品質属性を毎回プロンプトや仕様書で詳細に指示しようとすると、要求仕様は急速に肥大化します。
さらに、Trace、Metrics、Correlation、Payload Protection、Redaction、Export、Retry、Backend Integrationなどの要素が相互作用し始めると、実装複雑度と運用複雑度は実質的に指数関数的に増加します。
その結果、生成AIへ与えるコンテキスト量も急増し、生成コスト・レビューコスト・再生成コストが大きく膨らみます。
しかも、生成AIは理解できない要求や複雑すぎる要求に遭遇すると、簡単に省略・単純化・見落としを行います。
そのため、すべてをプロンプトや仕様書へ押し込む方式では、品質保証そのものが不安定になります。
CNCFにおけるObservability
ただし、CNCFを含めたシステム全体でのObservabilityを考えた場合、各システムの出力するObservability情報を集約して運用管理する機能が必要です。
CNCFでは、この目的で業界標準となっているOpenTelemetryとの連携をサポートしています。
CNCF内部では、以下のような構造化実行情報が保持されます。
-
CallTree
-
Action / UoW / Space / I/O実行情報
-
構造化診断情報
-
Conclusion詳細コード
-
previous-chainによるエラー連鎖
-
Payloadサマリ・参照情報
-
Runtime Metrics Snapshot
-
Job / Task / Saga文脈
OpenTelemetryと連携することにより、システム全体のObservability情報と統合した形で、CNCFが採取するObservability情報を、JaegerやPrometheus、Grafanaといった専用ツールで参照することができるようになります。
最小Jaeger構成による検証
CNCFでのObservabilityの実例をチュートリアルを例に説明します。
以下の場所に格納されているチュートリアルを使用します。
展開後の以下のディレクトリにサンプルコードが入っています。
-
samples/13-observability-jaeger
このサンプルは、「最小構成でTrace Exportできるか」を確認するためのものです。
構成:
-
Jaeger all-in-one
-
OTLP HTTP
CNCFは直接JaegerへTraceを送信します。
起動
JaegerとCNCFの起動は、用意されているスクリプトを使います。
$ bash start-jaeger.sh
$ bash run-server.sh
オペレーションの実行は以下のように行います。
オペレーションを実行することで、Observabilityの結果がJaegerに通知され参照可能になります。
$ cncf client minimal.main.hello --baseurl http://127.0.0.1:19613
Hello CNCF
最初に確認するもの
CNCF自身もObservability機能を持っています。
まず、CNCF自身のObservability機能を使って、オペレーションの実行結果を確認しましょう。
確認順序は以下の通りです。
-
CNCF Observability UI observability
-
Jaeger UI http://127.0.0.1:16686
CNCF Observability UIで確認すること
CNCF側では、以下を確認します。
-
CallTree構造
-
Action実行情報
-
I/O実行情報
-
Conclusion chain
-
診断Payloadサマリ
Observability Stack Lab構成
前述の例はObservability機能側は最小構成のJaegerのみでした。
次はOpenTelemetry Collector, Jaeger, Prometheus, Grafanaを使った本格構成です。
製品版でも適用できる構成になっています。
ZIPファイル展開後の以下のディレクトリにサンプルコードが入っています。
-
samples/13.a-observability-stack-lab
こちらは、Collector中心の標準Observability構成です。
-
-
CNCF本体
-
-
OpenTelemetry Collector
-
Observabilityデータの収集・変換・配送を行う中継コンポーネントです。
-
-
Jaeger
-
分散トレースを保存・検索・可視化するためのシステムです。
-
-
Prometheus
-
時系列メトリクスを収集・保存・検索するための監視 (Monitoring)システムです。
-
-
Grafana
-
PrometheusやJaegerなどのデータを統合的に可視化するDashboard/Query Frontendです。
-
Observabilityのシステム構成を以下に示します。
CNCFはOpenTelemetry CollectorにObservabilityの情報を渡すと、JaegerやPrometheusに情報が伝搬されます。
さらにGrafanaはJaegerとPrometheusから情報を取得し、ダッシュボードとして可視化します。
起動
システムを以下のように起動します。
$ bash start-stack.sh
$ bash run-server.sh
Observabilityで観測する情報を以下のようにして作ります。
$ bash run-operation.sh
$ bash export-metrics.sh
確認順序
確認順序は以下の通りです。
Prometheusで確認すること
Prometheusは以下のURLでアクセスしてください。
確認用PromQLは以下のものを使ってください。
cncf_web_request_requests_count
cncf_action_execution_executions_count
ここでは、CNCF Runtime MetricsがCollector経由でPrometheusへ流れていることを確認します。
Grafanaで確認すること
Grafanaは以下のURLでアクセスしてください。
以下のアカウントでログインすることができます。
admin / admin
Grafanaは、運用者向けDashboard/Query Frontendとして扱います。
以下の情報を確認することができます。
-
Prometheus datasource
-
CNCF metrics series
-
Jaeger datasource
-
Trace検索
まとめ
AI駆動開発では、SecurityやObservabilityのような横断的品質属性を毎回プロンプトや仕様書へ詳細に記述し続けることは現実的ではありません。
要求仕様が肥大化すると、生成AIへ与えるコンテキスト量・生成コスト・レビューコスト・再生成コストが急速に増大し、品質保証そのものも不安定になります。
さらに、生成AIは複雑すぎる要求や理解できない要求に遭遇すると、省略・単純化・見落としを行いやすくなります。
そのためCML&CNCFでは、SecurityやObservabilityをアプリケーションコードへ委譲するのではなく、モデルコンパイラと実行フレームワークによるRuntime Capability (ケーパビリティ)として吸収します。
今回のサンプルでは、Jaeger単体構成からCollector中心構成までを通じて、CNCF RuntimeがObservabilityをどのように統合的に実現するのかを確認しました。
参照
用語集
- セキュリティ (Security)
-
Securityとは、情報と機能を正当な権限に従って保護し、不正な閲覧、利用、変更、破壊、否認を防ぐ性質です。Confidentiality、Integrity、Authenticity、AccountabilityなどのConcernを含みます。
- オブザーバビリティ (observability, 可観測性)
-
Observabilityは、システムやドメインの内部状態を外部からの観測を通じて推論・理解できる性質を表します。 単なるモニタリング可能性を超え、現象(Phenomenon)や観測記録(Observation)を一貫して収集・関連付け、ドメイン・イベント(Domain Event)として意味づけられることで、システムの挙動を総合的に把握できる状態を指します。
- Cozy Modeling Language (CML)
-
CML(Cozy Modeling Language)は、オブジェクト・モデルのうち、プログラム生成と実行へ接続する実行可能モデルを記述するSimpleModelingの形式モデリング言語です。
- モデル (Model)
-
Modelとは、対象を特定のPurposeとConcernに基づいて選択し、理解、判断、検証、構築に利用できる形で表した抽象です。対象そのものではなく、目的に必要な要素、関係、意味を保持する表現です。
- Cloud Native Component Framework (CNCF)
-
Cloud Native Component Framework(CNCF)は、クラウド・アプリケーションを構成するコンポーネントを、単一かつ一貫した実行モデルで実行するためのフレームワークです。 Component / Service / Operation という構造を中核とし、command、server(REST / OpenAPI)、client、script といった異なる実行形態から、同一の Operation を再利用できることを特徴とします。 ログ、エラー処理、設定、配備といったクラウド・アプリケーションに必要な品質属性をフレームワーク側に集約することで、コンポーネントはドメイン・ロジックの実装に集中できます。 CNCF は、文芸モデル駆動開発および AI 支援開発を前提に、「何を実行するか」と「どのように呼び出すか」を分離するための実行基盤として設計されています。
- 文芸モデル (Literate Model)
-
Undefined
- プロンプト (Prompt)
-
RAGによって取得された知識を、AIモデルの推論プロセスに橋渡しするための構造化指示または文脈表現。 BoKに格納された構造化知識を、モデルが理解し行動・内化できる物語的/命令的形式に変換する。
- ドメイン・モデル (Domain Model)
-
Undefined
- 品質属性 (Quality Attribute)
-
Quality Attributeとは、ソフトウェアが機能を実行できることに加えて、どの程度の品質で要求を満たすかを表す特性です。Security、Performance、Availability、Reliability、Resilience、Observability、Maintainabilityなどが含まれます。
- シンプルモデリング (SimpleModeling)
-
SimpleModelingは、KnowledgeからDomain Modelを構成し、CMLで形式化し、CozyとAIによって実行可能ソフトウェアへ実現し、Textus上で動作させる、モデリング中心のソフトウェア開発方法論と技術体系です。
- 監視 (Monitoring)
-
Undefined
- 仕様確認 (verification)
-
Verification(仕様確認)とは、規定された設計仕様や要求仕様に対して、実装が一致しているかを確認する行為である。
- ケーパビリティ (Capability)
-
ケーパビリティ(Capability)とは、モデルまたはシステムが利用者や対象領域に対して何を可能にするかを表す概念です。実現方法ではなく、提供できる結果や働きに着目します。