github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/buildpacks/telemetry.go (about) 1 package buildpacks 2 3 import ( 4 "encoding/json" 5 6 "github.com/SAP/jenkins-library/pkg/cnbutils/privacy" 7 "github.com/SAP/jenkins-library/pkg/cnbutils/project" 8 "github.com/SAP/jenkins-library/pkg/telemetry" 9 "github.com/pkg/errors" 10 ) 11 12 const version = 3 13 14 type Telemetry struct { 15 customData *telemetry.CustomData 16 data *BuildpacksTelemetry 17 } 18 19 func NewTelemetry(customData *telemetry.CustomData) *Telemetry { 20 return &Telemetry{ 21 customData: customData, 22 data: &BuildpacksTelemetry{ 23 Version: version, 24 }, 25 } 26 } 27 28 func (d *Telemetry) Export() error { 29 d.customData.Custom1Label = "cnbBuildStepData" 30 customData, err := json.Marshal(d.data) 31 if err != nil { 32 return errors.Wrap(err, "failed to marshal custom telemetry data") 33 } 34 d.customData.Custom1 = string(customData) 35 return nil 36 } 37 38 func (d *Telemetry) WithImage(image string) { 39 d.data.builder = image 40 } 41 42 func (d *Telemetry) AddSegment(segment *Segment) { 43 segment.data.Builder = d.data.builder 44 d.data.Data = append(d.data.Data, segment.data) 45 } 46 47 type BuildpacksTelemetry struct { 48 builder string 49 Version int `json:"version"` 50 Data []*cnbBuildTelemetryData `json:"data"` 51 } 52 53 type cnbBuildTelemetryData struct { 54 ImageTag string `json:"imageTag"` 55 AdditionalTags []string `json:"additionalTags"` 56 BindingKeys []string `json:"bindingKeys"` 57 Path PathEnum `json:"path"` 58 BuildEnv cnbBuildTelemetryDataBuildEnv `json:"buildEnv"` 59 Buildpacks cnbBuildTelemetryDataBuildpacks `json:"buildpacks"` 60 ProjectDescriptor cnbBuildTelemetryDataProjectDescriptor `json:"projectDescriptor"` 61 BuildTool string `json:"buildTool"` 62 Builder string `json:"builder"` 63 } 64 65 type cnbBuildTelemetryDataBuildEnv struct { 66 KeysFromConfig []string `json:"keysFromConfig"` 67 KeysFromProjectDescriptor []string `json:"keysFromProjectDescriptor"` 68 KeysOverall []string `json:"keysOverall"` 69 JVMVersion string `json:"jvmVersion"` 70 KeyValues map[string]interface{} `json:"keyValues"` 71 } 72 73 type cnbBuildTelemetryDataBuildpacks struct { 74 FromConfig []string `json:"FromConfig"` 75 FromProjectDescriptor []string `json:"FromProjectDescriptor"` 76 Overall []string `json:"overall"` 77 } 78 79 type cnbBuildTelemetryDataProjectDescriptor struct { 80 Used bool `json:"used"` 81 IncludeUsed bool `json:"includeUsed"` 82 ExcludeUsed bool `json:"excludeUsed"` 83 } 84 85 type Segment struct { 86 data *cnbBuildTelemetryData 87 } 88 89 func NewSegment() *Segment { 90 return &Segment{ 91 data: &cnbBuildTelemetryData{}, 92 } 93 } 94 95 func (s *Segment) WithBindings(bindings map[string]interface{}) *Segment { 96 var bindingKeys []string 97 for k := range bindings { 98 bindingKeys = append(bindingKeys, k) 99 } 100 s.data.BindingKeys = bindingKeys 101 return s 102 } 103 104 func (s *Segment) WithEnv(env map[string]interface{}) *Segment { 105 s.data.BuildEnv.KeysFromConfig = []string{} 106 s.data.BuildEnv.KeysOverall = []string{} 107 for key := range env { 108 s.data.BuildEnv.KeysFromConfig = append(s.data.BuildEnv.KeysFromConfig, key) 109 s.data.BuildEnv.KeysOverall = append(s.data.BuildEnv.KeysOverall, key) 110 } 111 return s 112 } 113 114 func (s *Segment) WithTags(tag string, additionalTags []string) *Segment { 115 s.data.ImageTag = tag 116 s.data.AdditionalTags = additionalTags 117 return s 118 } 119 120 func (s *Segment) WithPath(path PathEnum) *Segment { 121 s.data.Path = path 122 return s 123 } 124 125 func (s *Segment) WithBuildTool(buildTool string) *Segment { 126 s.data.BuildTool = buildTool 127 return s 128 } 129 130 func (s *Segment) WithBuilder(builder string) *Segment { 131 s.data.Builder = privacy.FilterBuilder(builder) 132 return s 133 } 134 135 func (s *Segment) WithBuildpacksFromConfig(buildpacks []string) *Segment { 136 s.data.Buildpacks.FromConfig = privacy.FilterBuildpacks(buildpacks) 137 return s 138 } 139 140 func (s *Segment) WithBuildpacksOverall(buildpacks []string) *Segment { 141 s.data.Buildpacks.Overall = privacy.FilterBuildpacks(buildpacks) 142 return s 143 } 144 145 func (s *Segment) WithKeyValues(env map[string]interface{}) *Segment { 146 s.data.BuildEnv.KeyValues = privacy.FilterEnv(env) 147 return s 148 } 149 150 func (s *Segment) WithProjectDescriptor(descriptor *project.Descriptor) *Segment { 151 descriptorKeys := s.data.BuildEnv.KeysFromProjectDescriptor 152 overallKeys := s.data.BuildEnv.KeysOverall 153 for key := range descriptor.EnvVars { 154 descriptorKeys = append(descriptorKeys, key) 155 overallKeys = append(overallKeys, key) 156 } 157 s.data.BuildEnv.KeysFromProjectDescriptor = descriptorKeys 158 s.data.BuildEnv.KeysOverall = overallKeys 159 s.data.Buildpacks.FromProjectDescriptor = privacy.FilterBuildpacks(descriptor.Buildpacks) 160 s.data.ProjectDescriptor.Used = true 161 s.data.ProjectDescriptor.IncludeUsed = descriptor.Include != nil 162 s.data.ProjectDescriptor.ExcludeUsed = descriptor.Exclude != nil 163 return s 164 }