SoundCloudのエンジニアリングチームは、Periskopと呼ばれる例外監視ソフトウェアについて書いた。このソフトウェアは、サーバ間で例外を収集して集約し、分析のために中央サーバに報告する。
PeriskopはSoundCloudの内部プロジェクトとして始まった。クライアントライブラリで例外を収集して集約し、プルベースのモデルを使用してクライアントをスクレイプし、サーバ側のインスタンス間で同じものを集約する。SoundCloudチームは以前はAirbrakeを使用していたが、例外率の急上昇によって引き起こされるコストの問題を回避するためにカスタムビルドのソリューションに移行した。動機の1つは、例外が発生しているサービスを簡単に検出してスクレイプすることであった。現在のバージョンのPeriskopは、DNSベースのサービス検出をサポートしている。
InfoQは、SoundCloudの技術リーダーであるJorge Creixell氏に連絡を取り、詳細を確認した。
Periskopのアーキテクチャは、クライアントライブラリとサーバコンポーネントで構成されている。クライアントライブラリには「例外コレクタ」がある。例外は2つの方法でコレクターに追加できる。それは、対処される場所(try-catchブロックなど)あるいは、未対処のすべての例外に対するトップレベルの例外ハンドラーである。コレクターは、例外メッセージとスタックトレースのハッシュを使用して一意のキーを生成する。これらはメモリに集約され、最新の例外と共にキューに保持される。例外集計は、Prometheusエクスポーターがメトリックを公開する方法と同様に、HTTPエンドポイントでエクスポートされる。エクスポートでは公開されたスキーマを使用する。Periskopクライアントは、インスタンスごとの例外の総数を維持し、新しいデプロイメントがあるとき(またはプロセスが再開されるとき)にカウンターがリセットされる。
画像提供 : https://developers.soundcloud.com/blog/periskop-exception-monitoring-service, 明確な許可を得て使用
サーバ側では、サービス検出モジュールがサービスのすべてのインスタンスを検出する。サーバは、エクスポートされた例外集計データをスクレイプし、インスタンス間でさらに集計する。Periskopはサービスを自動検出でき、Prometheusのライブラリを使用してサービスを検出する。Creixell氏は次のように述べている。
初期バージョンではDNSモジュールのみを使用しています。これは、当時SoundCloudで内部的に必要だったためです。現在、Prometheusでサポートされている残りのサービス検出メカニズムの実装に取り組んでいます。構成フォーマットは、Prometheusにあるものに可能な限り近いものが反映されることを期待しています。
Periskopの検出構成は、Prometheusの構成を模倣している。典型的なDNSベースの構成は次のようになる。
services:
- name: myservice
dns_sd_configs:
names:
- telemetry.api.prod.myservice
refresh_interval: 45s
type: SRV
scraper:
endpoint: /-/exceptions
refresh_interval: 30s
PeriskopはKubernetesネイティブのサービス検出機能をまだサポートしていない。しかし、「これは、Prometheusの残りのサービス検出メカニズムの統合が完了するとすぐに利用できるようになります。KubernetesはSoundCloudの内部で使用するため、最優先事項です」とCreixell氏は言っている。環境とコンポーネントは、構成内の一意のサービス名によって明確化されるため、サービスに基づいて例外にタグを付けることはまだ機能としてない。
Periskopサーバは、定期的に構成された(または検出された)インスタンスをスクレイプする。それらが多数ある場合、「スクレイプサイクルをスキップ」する可能性がある。この場合、データが失われる可能性があるが、SoundCloudはこのアプローチで問題は発生していない。Creixell氏は次のように詳しく述べている。
Periskopは、時系列ではなく、サービスエラーのスナップショットのみを維持します。このため、(Prometheusと比較して)はるかに単純な設計を選択しました。タイマーを使用して、各サービスに設定された更新間隔に従って、前のスクレイプが完了するたびに新しいスクレイプをスケジュールします。
Periskopには、例外を参照するためのUIがある。当初は、トラブルシューティングとインシデント対応をサポートし、SoundCloudのサービス内で何が起こっているのかを正確に把握するために設計された。
PeriskopのソースコードはGitHubで入手できる。