9.3. Telemetry プラグインの作成
本セクションでは、AbstractAnalyticsManager
を拡張し、以下のメソッドを実装する AnalyticsManager
クラスを作成する方法を説明します。
-
isEnabled()
- Telemetry バックエンドが正常に機能しているかどうかを判別します。これは、常にtrue
を返すか、または接続プロパティーがない場合にfalse
を返すなどしてさらに複雑なチェックがあることを意味します。 -
destroy()
- Telemetry バックエンドをシャットダウンする前に実行されるクリーンアップ方法。このメソッドは、WORKSPACE_STOPPED
イベントを送信します。 -
onActivity()
- 特定のユーザーについて一部のアクティビティーが依然として実行されていることを通知します。これは主にWORKSPACE_INACTIVE
イベントを送信するために使用されます。 -
onEvent()
- Telemetry イベントをWORKSPACE_USED
またはWORKSPACE_STARTED
などの Telemetry サーバーに送信します。 -
increaseDuration()
- 短時間に複数のイベントを送信するのではなく、現在のイベントの期間を長くします。
次のセクションでは、以下について説明します。
- echo でイベントを標準出力に送信するための Telemetry サーバーの作成。
- CodeReady Workspaces Telemetry クライアントの拡張、およびユーザーのカスタムバックエンドの実装。
-
ユーザーのカスタムバックエンドの CodeReady Workspaces ワークスペースプラグインを表す
meta.yaml
ファイルの作成。 -
CHE_WORKSPACE_DEVFILE_DEFAULT__EDITOR_PLUGINS
環境変数を設定して、カスタムプラグインの場所を CodeReady Workspaces に指定。
9.3.1. はじめに
以下では、CodeReady Workspaces Telemetry システムを拡張してカスタムのバックエンドに接続するのに必要な手順を説明します。
- イベントを受信するサーバープロセスの作成
- CodeReady Workspaces ライブラリーを拡張して、イベントをサーバーに送信するバックエンドを作成する
- コンテナーでの Telemetry バックエンドのパッケージ化およびイメージレジストリーへのデプロイ
- バックエンドのプラグインを追加し、CodeReady Workspaces に対してワークスペースにプラグインを読み込むように指示する
オプション: イベントを受信するサーバーの作成
この例は、CodeReady Workspaces からイベントを受信し、それらを標準出力に書き込むサーバーを作成する方法を示しています。
実稼働環境のユースケースでは、独自の Telemetry サーバーを作成するのではなく、サードパーティーの Telemetry システム (Segment、Woopra など)との統合を検討してください。この場合、プロバイダーの API を使用してイベントをカスタムバックエンドからシステムに送信します。
以下の Go コードは、ポート 8080 でサーバーを起動し、イベントを標準出力に書き込みます。
例9.1 main.go
package main import ( "io/ioutil" "net/http" "go.uber.org/zap" ) var logger *zap.SugaredLogger func event(w http.ResponseWriter, req *http.Request) { switch req.Method { case "GET": logger.Info("GET /event") case "POST": logger.Info("POST /event") } body, err := req.GetBody() if err != nil { logger.With("err", err).Info("error getting body") return } responseBody, err := ioutil.ReadAll(body) if err != nil { logger.With("error", err).Info("error reading response body") return } logger.With("body", string(responseBody)).Info("got event") } func activity(w http.ResponseWriter, req *http.Request) { switch req.Method { case "GET": logger.Info("GET /activity, doing nothing") case "POST": logger.Info("POST /activity") body, err := req.GetBody() if err != nil { logger.With("error", err).Info("error getting body") return } responseBody, err := ioutil.ReadAll(body) if err != nil { logger.With("error", err).Info("error reading response body") return } logger.With("body", string(responseBody)).Info("got activity") } } func main() { log, _ := zap.NewProduction() logger = log.Sugar() http.HandleFunc("/event", event) http.HandleFunc("/activity", activity) logger.Info("Added Handlers") logger.Info("Starting to serve") http.ListenAndServe(":8080", nil) }
このコードに基づいてコンテナーイメージを作成し、これを OpenShift の openshift-workspaces プロジェクトでデプロイメントとして公開します。サンプル Telemetry サーバーのコードは、che-workspace-telemetry-example で利用できます。Telemetry サーバーをデプロイするには、リポジトリーのクローンを作成し、コンテナーをビルドします。
$ git clone https://github.com/che-incubator/che-workspace-telemetry-example $ cd che-workspace-telemetry-example $ docker build -t registry/organization/che-workspace-telemetry-example:latest $ docker push registry/organization/che-workspace-telemetry-example:latest
manifest.yaml
で、プッシュしたイメージと OpenShift クラスターのパブリックホスト名に一致するように image
および host
フィールドを置き換えます。次に、以下を実行します。
$ oc apply -f manifest.yaml -n {prod-namespace}