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  }