🤥
CF Buildpacks(golang) で Dynatrace-oneagent がインストールされる仕組み
概要
- トレーシングとしてDynatraceを使用しており、agentであるone-agentがどのようにruntimeに組み込まれるのか気になった
- buildpackのfinalize時にインストールされていた
Buildpacksの動作ロジック
- detect: pushしたcodeがどのbuilcpackを使用するか判定する
- supply: codeの依存解決
- finalize: appが起動するために必要な諸々の処理 <- oneagent install
- release: appがどのように実行されるべきかをCloudControllerに送る
の順番で動作する
finalizeの処理を少し深ぼる
buildpacksの仕組みが動作するときに上記の順番で動作するのですが、実際にはスクリプトでキックされます。
その中で、finalize処理はgo言語で書かれたコードで実行されます
GOROOT=$GoInstallDir/go $GoInstallDir/go/bin/go build -mod=vendor -o $output_dir/finalize ./src/go/finalize/cli
叩き先のメソッドはこちら
色々と書かれていますが、ポイントはこの2つかなと思います。
- finalize.Run(gf)
- libbuildpack.RunAfterCompile(stager)
Run()
いわゆる go build
とか環境変数のセットアップが行われています
RunAfterCompile()
今回のDynatraceの肝となります。
hooksに追加されていたエントリーを実施しています。
hooksへの追加はinit()メソッドで実行されるのでmainメソッドよりも前に自動で実行されます
Dynatraceのインストールに必要なapi_endpointやapi_tokenが設定されているかを確認します。
FullStackかUPSが設定されていない場合にはインストールされないですね。
creds := h.getCredentials()
if creds == nil {
h.Log.Debug("Dynatrace service credentials not found!")
return nil
}
downloaderを落とした後にinstallerを実施して、oneagentをinstallしています
if os.Getenv("BP_DEBUG") != "" {
err = h.Command.Execute("", os.Stdout, os.Stderr, installerFilePath, stager.BuildDir())
} else {
err = h.Command.Execute("", ioutil.Discard, ioutil.Discard, installerFilePath, stager.BuildDir())
}
if err != nil {
return err
}
まとめ
- buildpackの実行順序を軽くまとめた
- golangのケースを基にDynatrace oneagentがinstallされる仕組みを追ってみた
Discussion