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}