1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-02-11 13:53:53 +02:00
Vyacheslav Starostin b644bf7e15
Use Pendo as analytics tool (#4828)
* Try pendo

* Try pendo

* Fix typo

* Optimize data struct

* Adjust kaniko and kubernetes to try pendo

* Include golangBuild

* Update generator helper

* go generate

* Delete token param from some steps && go generate

* Add checking on ExportPrefix

* Update telemetry struct

* Try pipelineID for artifactPrepVersion

* Try pipelineID as a CPE value

* Update

* Try CF

* Read pipelineID from CPE

* Enable telemetry

* Fix name

* Do not show token in header

* Read pipelineID from CPE

* Clean up

* Clean up

* Update template

* go generate

* Update template

* Try Cribl

* HTTPS

* Update

* Clean-up

* Fix tests

* Update
2024-02-20 17:17:20 +06:00

164 lines
4.8 KiB
Go

package buildpacks
import (
"encoding/json"
"github.com/SAP/jenkins-library/pkg/cnbutils/privacy"
"github.com/SAP/jenkins-library/pkg/cnbutils/project"
"github.com/SAP/jenkins-library/pkg/telemetry"
"github.com/pkg/errors"
)
const version = 3
type Telemetry struct {
customData *telemetry.CustomData
data *BuildpacksTelemetry
}
func NewTelemetry(customData *telemetry.CustomData) *Telemetry {
return &Telemetry{
customData: customData,
data: &BuildpacksTelemetry{
Version: version,
},
}
}
func (d *Telemetry) Export() error {
customData, err := json.Marshal(d.data)
if err != nil {
return errors.Wrap(err, "failed to marshal custom telemetry data")
}
d.customData.CnbBuildStepData = string(customData)
return nil
}
func (d *Telemetry) WithImage(image string) {
d.data.builder = image
}
func (d *Telemetry) AddSegment(segment *Segment) {
segment.data.Builder = d.data.builder
d.data.Data = append(d.data.Data, segment.data)
}
type BuildpacksTelemetry struct {
builder string
Version int `json:"version"`
Data []*cnbBuildTelemetryData `json:"data"`
}
type cnbBuildTelemetryData struct {
ImageTag string `json:"imageTag"`
AdditionalTags []string `json:"additionalTags"`
BindingKeys []string `json:"bindingKeys"`
Path PathEnum `json:"path"`
BuildEnv cnbBuildTelemetryDataBuildEnv `json:"buildEnv"`
Buildpacks cnbBuildTelemetryDataBuildpacks `json:"buildpacks"`
ProjectDescriptor cnbBuildTelemetryDataProjectDescriptor `json:"projectDescriptor"`
BuildTool string `json:"buildTool"`
Builder string `json:"builder"`
}
type cnbBuildTelemetryDataBuildEnv struct {
KeysFromConfig []string `json:"keysFromConfig"`
KeysFromProjectDescriptor []string `json:"keysFromProjectDescriptor"`
KeysOverall []string `json:"keysOverall"`
JVMVersion string `json:"jvmVersion"`
KeyValues map[string]interface{} `json:"keyValues"`
}
type cnbBuildTelemetryDataBuildpacks struct {
FromConfig []string `json:"FromConfig"`
FromProjectDescriptor []string `json:"FromProjectDescriptor"`
Overall []string `json:"overall"`
}
type cnbBuildTelemetryDataProjectDescriptor struct {
Used bool `json:"used"`
IncludeUsed bool `json:"includeUsed"`
ExcludeUsed bool `json:"excludeUsed"`
}
type Segment struct {
data *cnbBuildTelemetryData
}
func NewSegment() *Segment {
return &Segment{
data: &cnbBuildTelemetryData{},
}
}
func (s *Segment) WithBindings(bindings map[string]interface{}) *Segment {
var bindingKeys []string
for k := range bindings {
bindingKeys = append(bindingKeys, k)
}
s.data.BindingKeys = bindingKeys
return s
}
func (s *Segment) WithEnv(env map[string]interface{}) *Segment {
s.data.BuildEnv.KeysFromConfig = []string{}
s.data.BuildEnv.KeysOverall = []string{}
for key := range env {
s.data.BuildEnv.KeysFromConfig = append(s.data.BuildEnv.KeysFromConfig, key)
s.data.BuildEnv.KeysOverall = append(s.data.BuildEnv.KeysOverall, key)
}
return s
}
func (s *Segment) WithTags(tag string, additionalTags []string) *Segment {
s.data.ImageTag = tag
s.data.AdditionalTags = additionalTags
return s
}
func (s *Segment) WithPath(path PathEnum) *Segment {
s.data.Path = path
return s
}
func (s *Segment) WithBuildTool(buildTool string) *Segment {
s.data.BuildTool = buildTool
return s
}
func (s *Segment) WithBuilder(builder string) *Segment {
s.data.Builder = privacy.FilterBuilder(builder)
return s
}
func (s *Segment) WithBuildpacksFromConfig(buildpacks []string) *Segment {
s.data.Buildpacks.FromConfig = privacy.FilterBuildpacks(buildpacks)
return s
}
func (s *Segment) WithBuildpacksOverall(buildpacks []string) *Segment {
s.data.Buildpacks.Overall = privacy.FilterBuildpacks(buildpacks)
return s
}
func (s *Segment) WithKeyValues(env map[string]interface{}) *Segment {
s.data.BuildEnv.KeyValues = privacy.FilterEnv(env)
return s
}
func (s *Segment) WithProjectDescriptor(descriptor *project.Descriptor) *Segment {
descriptorKeys := s.data.BuildEnv.KeysFromProjectDescriptor
overallKeys := s.data.BuildEnv.KeysOverall
for key := range descriptor.EnvVars {
descriptorKeys = append(descriptorKeys, key)
overallKeys = append(overallKeys, key)
}
s.data.BuildEnv.KeysFromProjectDescriptor = descriptorKeys
s.data.BuildEnv.KeysOverall = overallKeys
s.data.Buildpacks.FromProjectDescriptor = privacy.FilterBuildpacks(descriptor.Buildpacks)
s.data.ProjectDescriptor.Used = true
s.data.ProjectDescriptor.IncludeUsed = descriptor.Include != nil
s.data.ProjectDescriptor.ExcludeUsed = descriptor.Exclude != nil
return s
}