見つけた情報をご紹介します 👀
# CNCF

Observability by Design と OpenTelemetry Weaver の実踐的アプローチ

observability by designopen telemetry weaverinstrumentationtelemetry collectioncomplex queriesCNCF

## はじめに 現代の分散システムでは、監視(Observability)がシステムの信頼性と運用効率を確保するための不可欠な要素となっています。しかし、デプロイメントの更新により監視が失敗する、複雑なクエリの要件が満たされない、指標の欠如による診斷困難、監視システムのAPI設計の不安定さといった課題が依然として存在します。この記事では、**Observability by Design**の理念を実現するための**OpenTelemetry Weaver**というツールの技術的詳細と、その実裝方法を解説します。OpenTelemetry Weaverは、OpenTelemetryエコシステムにおける語義的コンバイン(Semantic Conventions)とインスツルメンテーションの統合を可能にする重要な技術です。 ## 技術的概要 ### Observability by Design の概念 Observability by Design は、プライバシーバイデザインやセキュリティバイデザインと同様に、ソフトウェア開発ライフサイクル(SDLC)に観測性を組み込むアプローチです。このアプローチでは、観測性を公開APIとして扱い、安定性とバージョン管理を確保する必要があります。これにより、システムの変更が監視に與える影響を最小限に抑え、運用の信頼性を高めます。 ### OpenTelemetry Weaver の役割 OpenTelemetry Weaver は、語義的コンバインの定義に基づいて、ドキュメントの自動生成、型安全SDKの生成、靜的検証、バージョン差分管理を実現するツールです。このツールは、CI/CDパイプラインに統合され、開発者に観測性の実裝を簡素化します。 ## 主な機能と特徴 ### 語義的コンバインの定義 語義的コンバインは、指標の名前、単位、屬性などの定義を標準化するためのYAML形式の仕様です。現在、900以上の屬性と74のドメインが登録されており、これにより指標の一貫性を保証します。例えば、`auction_bid_count`という指標は、競標活動IDや競標者識別などの屬性を持つことで、クエリの精度を向上させます。 ### 自動ドキュメント生成と型安全SDK Weaverは、語義的コンバインの定義からMarkdownドキュメントを自動生成し、開発者に機械學習システムやダッシュボードの設計を支援します。また、型安全SDKは、IDEのインテリセンスを活用し、手動でのエラーを防ぎます。例えば、Go言語では`auction_bid_count`という指標のAPIが自動生成され、名前や屬性の正しさが保証されます。 ### 靜的検証とバージョン管理 Weaverは、Rego言語を用いた靜的検証により、命名規則やスキーマの進化をチェックします。また、`registry diff`コマンドは、バージョン差分を管理し、生産環境での指標変更を安全に実行します。これにより、指標の再定義が監視に與える影響を最小限に抑えます。 ### テスト環境での実裝 Weaverの`registry emit`コマンドは、語義的コンバインに基づいたテストデータストリームを生成し、システムが実裝される前からダッシュボードの設計を可能にします。これにより、開発者は早期に監視の設計を検証できます。 ## 実裝例 ### 語義的コンバインの定義 ```yaml metric: name: auction_bid_count description: 競標回數を記録 unit: "1" attributes: - name: auction_id description: 競標活動ID - name: bidder description: 競標者識別 ``` ### 自動生成されたGoコード ```go func NewAuctionBidCount() *counter.Counter { return counter.NewCounter("auction_bid_count", "競標回數を記録", "1") } ``` ### ポリシーベースの靜的検証 ```rego package observability default allow = false allow { input.change.type == "delete" input.change.attribute == "bidder" input.required_attributes contains "bidder" } ``` ## 未來の方向性 1. **自動スキーマ進化**:Prometheusの指標遷移メカニズムを參考に、バージョン管理とデータベース層での動的適応を実現。 2. **語義的コンバインの共有**:企業間での語義的コンバインの共有を可能にし、エコシステム標準化を推進。 3. **ドキュメント生成の簡素化**:Weaverによる自動ドキュメント生成を強化し、學習曲線を低減。 4. **観測ツールとの統合**:データカタログとの統合により、データの可視化と分析能力を向上。 ## 技術的アーキテクチャ - **レジストリ(Registry)**:語義的コンバインの定義を管理。 - **Weaverツール**:ドキュメント生成、SDK生成、靜的検証を実行。 - **テスト環境**:OTLPエンドポイントとテレメトリーフローの検証。 - **データベース層**:バージョン差分に対応した動的クエリ適応。 ## 結論 Observability by Design は、システムの信頼性と運用効率を確保するための重要なアプローチです。OpenTelemetry Weaver は、この理念を実現するための強力なツールであり、語義的コンバインの定義に基づいた自動化されたインスツルメンテーションと検証を可能にします。開発者は、Weaverを活用することで、監視の設計と実裝を効率化し、複雑なクエリやバージョン管理の課題を解決できます。今後の進化により、OpenTelemetry Weaverはさらなるエコシステムの標準化を推進するでしょう。

可観測性の実踐:見えない部分の重要性

observabilityday zeroworking grouphearingCNCFCNCF

## はじめに 現代のシステム運用において、可観測性(Observability)は技術的な概念を超え、組織全體の運営プロセスとして不可欠な要素となっています。本記事では、可観測性の実踐における「見えない部分」に注目し、Day Zero(初期段階)からの実裝戦略や、組織內での協力體制の構築方法を解説します。技術的な導入だけでなく、組織文化の変革までを含めた実踐的なアプローチを紹介します。 ## キーポイントの解説 ### 可観測性とは何か 可観測性は、単なる技術の導入ではなく、**プロセス**としての能力を指します。システムの挙動を理解し、問題を特定し、適切な行動を取るための能力を構築するプロセスです。データの収集や蓄積自體は価値がありませんが、**行動と意思決定に結びつける**ことが重要です。 ### Day Zero/Day Minus Oneの意義 従來のDay One(即時導入)やDay Two(継続的な最適化)に比べ、Day Zero(初期段階)は**組織の基盤から始める**姿勢を強調します。現狀のシステムを「完全に未儀器化」または「儀器化失敗」狀態に置く場合、まずは最小限の指標から始め、徐々に拡張していくことが求められます。 ### ワーキンググループの役割 可観測性の実裝には、技術的な知識だけでなく、**多部門の協力**が不可欠です。市場、セールス、セキュリティなどの非エンジニア部門との連攜を図り、リソース配分の合意を形成する必要があります。このプロセスは、単なる技術導入ではなく、**価値創造のための協働**として捉えるべきです。 ## 実裝の課題と対策 ### 資源制約 - **予算・人材・時間の限界**:効率化やコスト削減にリソースが集中する傾向があります。 - **技術導入の帯寬不足**:エンジニアチームが新技術に時間を割く餘裕が限られる。 ### 組織抵抗 - **非エンジニア部門の支援の必要性**:リソース配分の合意形成には、経営層の理解が不可欠です。 - **価値の明確化**:可観測性を企業価値向上の手段として位置づける必要があります。 ### 技術的ギャップ - **現狀のシステムの狀態**:儀器化されていないシステムや、過剰な警報を発生させるシステムが存在します。 - **未來技術との誤解**:量子計算などに過度に注目するのではなく、**基礎的なインフラの構築**に注力すべきです。 ## 実裝戦略 ### 1. 最小限から始める - **ゼロベースの構築**:API呼び出し回數などの基本指標から開始。 - **無駄な監視の廃止**:非200ステータスコードの警報など、価値のないデータは即座に停止。 - **実証例**:ある企業が既存の監視システムを停止し、顧客サポートチケットを新たな監視手段として活用。 ### 2. 進化を段階的に - **最小実裝ステップ**:5分で完了可能なAPI呼び出し率の監視など、シンプルな機能を優先。 - **共識の形成**:市場やセールス部門の関係者を巻き込み、**科學的検証**(小規模テスト、フィードバックの繰り返し)で進める。 - **ツールとプロセスの構築**:內部ツールを活用し、**ゼロから一へのプロセス**を繰り返し拡大。 ### 3. 協力と信頼の構築 - **技術主導を避ける**:複雑なアーキテクチャを強制せず、**協働と検証**を通じて信頼を築く。 - **科學的プロセスの適用**:仮説(例:非200エラーの即時通知)を設定し、結果とフィードバックをもとに調整。 - **価値にフォーカス**:チームの実際のニーズに応じた実裝を優先。 ## 技術実踐の重點 - **インスツルメンテーション戦略**:核心業務プロセスに最小限の監視を導入。 - **コスト分析**:既存システムの機會コストと沈沒コストを評価し、ROIを算出。 - **継続的最適化**:自動化と標準化により維持コストを削減し、拡張性を高める。 ## 組織文化の構築 - **環境の整備**:ツールの提供やプロセスの簡略化で、可観測性の実裝を促進。 - **信頼の形成**:小規模な成功事例を積み重ね、チームの信頼を構築。 - **価値の共有**:チームが実感できる成果(例:無駄なアラートの削減、システムの安定性向上)を提供。 ## 結論 可観測性の成功は、**チームとの信頼関係の構築**に依存します。小規模な実験とフィードバックを通じて、段階的に監視能力を構築していくことが重要です。技術的な導入は、チームの実際のニーズに応じて柔軟に調整し、**価値創造のための協働**を重視するべきです。

OpenTelemetry における Delivery Hero の実踐:メリット、デメリット、そしてベンダーの課題

OpenTelemetryobservabilitytelemetryingestionvendorCNCF

## 背景と移行の動機 Delivery Hero は食品配送業界で活躍する企業であり、13の子會社を統合する過程で、それぞれが異なるプラットフォームと観測ツールを使用していた。この狀況により、分散トレースの統合が困難となり、データが異なるバックエンドに蓄積されていた。CTO は年間600萬ドルのコスト削減を目標に、プラットフォームと観測ツールの統合を推進した。この移行の目的は、ベンダー中立(vendor agnostic)の実現、語義的約束(semantic conventions)の標準化、そしてトレースを核としたすべてのテレメトリデータの統合である。 ## 移行戦略とアーキテクチャ設計 ### 理想的なアーキテクチャ 中央管理の OpenTelemetry Collector Agent を中心に、すべてのアプリケーションが OpenTelemetry SDK を使用し、データを Agent を経由して単一のベンダーにイングレスする構成が想定されていた。 ### 実際のアーキテクチャ - **中央 Datadog Collector**:Datadog フォーマットのデータを新ベンダーに統合。 - **中央 OTP Collector**:OTP フォーマットのデータを処理。 - **フェデレーテッドコレクター**:OTLP、Prometheus、JSON などの複數フォーマットをサポートし、新ベンダーに統合。 - **子會社獨自のコレクター**:Glovo、Logistics などの事業部は獨立したコレクターを維持。 ### 移行ステップ まずインフラの移行を完了し、その後アプリケーションの再インストルメンテーション(reinstrumentation)に著手した。 ## 遇う課題と問題 ### 1. カスタムコンポーネントと上流への貢獻 - **フォークされたコンポーネント**:DataDog Collector の受信機をフォークし、トレース、メトリクス、ログのすべてのテレメトリタイプをサポートする必要があった。既存のカスタムロジックは OpenTelemetry 上流バージョンと互換性がなく、戻すことができなかった。 - **その他のカスタムコンポーネント**:Span Metrics Connector、Prometheus Exporter、Delta to Cumulative Processor、Load Balancing Exporter など。 - **上流への貢獻の困難さ**:上流コンポーネントの更新サイクルが遅く、要望を迅速に統合できなかった。カスタムコンポーネントにより、OpenTelemetry Collector のバージョンアップに補丁を追加する必要があり、メンテナンスコストが増加した。 ### 2. データシリアライズ/デシリアライズのオーバーヘッド - **問題の概要**:コレクター內部でデータを変換する際、複數回のシリアライズとデシリアライズ(マーシャリング/アンマーシャリング)が行われた。これは引っ越しの例に比喩されるように、すべてのアイテム(フォーク、スプーンなど)を異なるボックスに分解するプロセスであり、効率が低下した。 - **パフォーマンスへの影響**:CPU 使用率が高くなり、ガベージコレクション(GC)のオーバーヘッドが増加した。メモリ消費も高くなり、フライムグラフでは大部分の CPU サイクルがデータ変換に費やされていた。 ### 3. 狀態を持つコンポーネントの追加ニーズ - **Span Metrics Connector**:同じトレースの spans が同じコレクターPodに到達するようにするため、Load Balancing Exporter を導入した。 - **Delta to Cumulative Processor**:DataDog ホストヘッダーに基づいてデータをルーティングする必要があり、獨自のプロキシアプリケーションとルーティングロジックを構築した。 - **メンテナンスコスト**:獨自コンポーネントの監視とデバッグを継続し、運用負擔が増加した。あるプロキシアプリケーションは重大な事故を引き起こした。 ## 結論と振り返り ### 継続的な課題 - カスタムコンポーネントと上流への貢獻のバランス。 - 狀態を持つコンポーネントの追加インフラストラクチャニーズ。 - データ変換のパフォーマンスオーバーヘッド。 ### 長期的な価値 - OpenTelemetry はベンダー中立とベンダーロックインの迴避を実現する唯一の手段である。 - 一時的なコストを払っても、長期戦略目標に合致する。 ### 総括 移行プロセスは困難だったが、OpenTelemetry の柔軟性と標準化の価値は大きい。カスタムコンポーネントと上流への貢獻プロセスを継続的に最適化し、メンテナンスコストを削減する必要がある。

コンテナIDの解決:cgroup v2による監視の課題と解決策

cgroup v2container monitoringobservability datapull flowpush flowCNCF

## はじめに コンテナ技術の普及に伴い、観測データ(observability data)の正確な取得はシステム監視やトラブルシューティングにおいて不可欠な要素となっています。特に、コンテナIDはコンテナ化環境で唯一性と細粒度を保証する識別子として、観測データのフィルタリングや検索に不可欠です。しかし、cgroup v2の導入により、従來のcgroup v1でのコンテナID取得方法が破綻する問題が生じました。本記事では、この課題の背景と、cgroup v2環境でのコンテナID解決策として提案される「inodeを活用したアプローチ」について解説します。 ## 観測データの流れとコンテナIDの重要性 観測データの収集には、**プルフロー(Pull Flow)**と**プッシュフロー(Push Flow)**の2つのパターンがあります。 - **プルフロー**:監視エンドポイント(例:Prometheus)が明示的に目標(コンテナ名、IDなど)を取得する方法です。この場合、コンテナIDは監視システムが直接取得する必要があります。 - **プッシュフロー**:アプリケーションが観測データを直接代理サーバー(例:トレースデータ)に送信する方法です。この場合、送信元のコンテナIDを自動的に識別してデータを豊かにする必要があります。 コンテナIDは、これらのフローにおいて観測データの精度を保証するための基盤となる要素です。 ## cgroup v1での解決策とcgroup v2の課題 ### cgroup v1の方法 cgroup v1では、`/proc/self/cgroup`ファイルを読み込むことでコンテナIDを取得することができました。このファイルのパス形式は`/path/to/container/...`であり、正規表現を用いてコンテナIDを抽出することができました。この方法はシンプルで、多くの環境で利用可能でした。 ### cgroup v2の変化と課題 cgroup v2では、名前空間の仮想化が導入され、`/proc/self/cgroup`ファイルの內容が`/`(空値)となりました。これは、仮想化された名前空間により、従來のパス解析が機能しなくなったためです。この変化により、cgroup v1での方法は機能しなくなり、新たな解決策が求められました。 ## 解決策の検討とinodeを活用したアプローチ ### 代替案の検討 #### 1. `/proc/self/cgroup`の利用(非推奨) - **方法**:`/proc/self/cgroup`ファイルを読み込む - **問題**: - 某些場合、ボリュームIDが取得される可能性がある - コンテナIDとボリュームIDの區別が困難 #### 2. Mutating Webhook(Kubernetes専用) - **方法**:Kubernetes APIを介してPod IDやコンテナ名を注入 - **課題**: - Kubernetes環境に限定される - コンテナ再起動時の解析遅延によるデータ不一致の可能性 #### 3. Mount Namespace IDの利用(権限必要) - **方法**:Mount Namespace IDを読み込む(`CAP_SYS_ADMIN`権限が必要) - **課題**: - 安全性の観點からKubernetesのRestrictedモードでは利用不可 ### 最終的な解決策:inodeを活用したアプローチ #### コアコンセプト - **inodeの役割**: - コンテナ內から`/proc/self/cgroup`のinode値を取得 - 主機側のエージェントがinodeをもとにコンテナIDをマッピング #### 実裝ステップ 1. **アプリケーション側**: - `/proc/self/cgroup`からinode値を取得し、観測データに付加 2. **主機側エージェント**: - Cgroupfsをマウント(通常は既にマウント済み) - inodeパスからコンテナIDを正規表現で解析 #### 優位性 - **環境の柔軟性**:Kubernetes以外の環境でも利用可能 - **セキュリティ**:追加の権限不要で、既存のセキュリティポリシーに適合 - **互換性**:既存の監視システムとの連攜が可能 ## 実裝詳細と検証結果 ### データ処理ロジック - コンテナIDが解析成功:コンテナIDを送信 - 解析失敗:inode値を送信(KubernetesではPod IDとコンテナ名を補完) - VMベースのランタイムではinode解析が失敗するため、別途対応が必要 ### 技術実裝 - **エージェント/コレクター**:Cgroupfsをマウント(通常は既にマウント済み) - **サポートする監視アーキテクチャ**: - 単節點エージェントに依存しない設計(ゲートウェイ構成をサポート) - OpenTelemetry Agentなど既存のオープンソースエージェントで実裝可能 ### 検証結果 - 2023年初頭から本番環境で運用開始 - 多様なコンテナランタイムとクラウド環境をサポート ## 結論 ### キーテクノロジーポイント - inodeをコンテナIDの代理として活用 - Cgroupfsのマウントとパス解析により環境の柔軟性を確保 - 應用や主機の設定変更なしにセキュリティと運用性を維持 ### 今後の方向性 - inode解析の精度と効率の向上 - さらなるコンテナランタイムやクラウドプラットフォームへの対応拡大

トレーシングの進化:サンプリングから完全可視性への拡張

tracingsamplingSNMPdashboardsspansCNCF

## はじめに 現代の分散システムにおいて、可観測性(Observability)はシステムの信頼性とパフォーマンスを確保するための不可欠な要素です。トレーシング(Tracing)は、サービス間の依存関係を可視化し、異常の原因を迅速に特定するための中心的な技術です。本記事では、トレーシングの進化史から、サンプリングの課題、そして大規模なトレースデータを効率的に処理するための技術的解決策まで、トレーシングの実踐的な知識を解説します。 ## 可観測性の進化とトレーシングの役割 ### 1. ネットワーク監視段階 - **SNMP(Simple Network Management Protocol)** を用いてハードウェアの狀態(CPU使用率、メモリなど)を監視 - 管理者は閾値警報を設定し、ネットワークの狀態を輪替(polling) ### 2. サービス監視段階 - 主機チェックとサービスチェックを導入 - 紅緑燈のダッシュボードでサービスの狀態を可視化 ### 3. 監視段階 - 高度なダッシュボードと深度洞察を提供 - 指標(Metrics)を用いてサービスの健康狀態を監視 ### 4. 可観測性段階 - ログ(Logs)、指標(Metrics)、トレース(Traces)を統合 - 三支柱モデル: - **Logs**:何が起きたかを記録 - **Metrics**:いつ起きたかを示す - **Traces**:どこで起きたかを追跡 ### 5. 六支柱モデルへの拡張 - パフォーマンスプロファイリング(Profiling)、リアルユーザー監視(Real User Monitoring)、合成テスト(Synthetic Testing)を追加 - 端到端の可視性とアクティブな監視能力を向上 ### 6. AI駆動の可観測性 - AIが人間が見逃す異常を検出 - **OpenTelemetry** がトレースデータの標準化を推進 ## トレーシングの価値とデバッグプロセス ### 典型的なデバッグステップ 1. **異常警報の受信**:ユーザーからのクレームや監視通知 2. **ダッシュボードでの異常サービスの特定**:ピーク/下降/パターン変化を検出 3. **特定サービスのトレースデータの分析**:リクエストパスと根本原因を特定 ### トレーシングの核心的価値 - 完全なリクエストパスの可視化 - 時間系列グラフ(Duration over Time)で異常を迅速に特定 - 紅點(エラー)と紫色點(正常)の視覚化 - 高時長トレース(大點)と低時長トレース(小點)の直感的比較 ## サンプリングの課題とその影響 ### サンプリング率の矛盾 - 一般的な1%サンプリング率(100個のトレースから1個を保存) - 結果:重要なエラートレースが失われる可能性 - 例:10億筆の取引/日 → 10億トレース → 100萬サンプリングトレース(エラーなし) ### サンプリングの根本的な問題 - **データ量の爆発**: - 毎日100億筆の取引 → 3萬億のスパン(Spans) - 各スパン約2KB → 累計6PBのデータ - ストレージ要件:毎日60臺のSSDサーバー - **処理オーバーヘッド**: - クラウド間の協調、データ構造管理 - アプリケーションパフォーマンスへの影響 ### 尾部サンプリング(Tail Sampling)の制限 - エラー/遅延トレースを保持する必要がある - 現在の多くのベンダーがサポートしていないか、費用が高額 - 技術的課題: - リクエスト終了までスパンを完全に収集する必要がある - クラウド間の協調とデータ構造管理 ## 解決策と技術的最適化 ### 1. 列式ストレージ(Columnar Storage) - 同じデータの圧縮(タイムスタンプ、文字列、數値) - 圧縮率を10〜20倍に向上 - 例: - タイムスタンプはDelta符號化 - 文字列は辭書符號化 - 數値はビットパッキング ### 2. 確率フィルター(Probabilistic Filters) - **Bloom Filter** でトレースIDの存在性を高速に確認 - 空間を節約し、軽量インデックスとして機能 ### 3. パーティショニング戦略(Partitioning) - タイムスタンプによるパーティション:最近のデータの迅速なアクセス - トレースIDによるパーティション:同一トレースIDのスパンを集中保存 - クエリ効率と並列処理能力の向上 ### 4. 特殊ストレージ構造(Special Sharding) - エラーと遅延スパンを専用ストレージに分離 - クエリ複雑度の削減: - トレースIDテーブル → スパンテーブル → エラースパンの直接クエリ - クエリ効率を50〜100倍に向上 ### 5. レイヤードストレージアーキテクチャ(Tiered Storage) - **ホットストレージ(0〜7日)**:高性能SSD - **ウォームストレージ(8〜30日)**:コスト効率のHDD - **クールストレージ(>30日)**:オブジェクトストレージ(S3/GCS) - 自動データ移行: - データの年齢に基づく分類 - エラーや遅延スパンを専用ストレージに抽出 ### 6. コスト最適化戦略 - 1%のエラーデータに特化したストレージ - 専用ストレージ構造によるストレージとクエリコストの削減 - 根本原因診斷効率とMTTR(平均修復時間)の向上 ## 結論 ### トレーシングの価値 - 最高の保真度で根本原因診斷を提供 - 系統全體の狀態を可視化 ### サンプリングのリスク - 過度なサンプリングによる盲點とデバッグの困難 - データ體積と診斷精度のバランスを取る必要性 ### 技術的解決策 - 列式ストレージ + 智能的シャーディング + 効率的なインデックス - ストレージコストとクエリ遅延の削減 - 系統の可観測性とアクティブな監視能力の向上