github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/src/com/sap/piper/analytics/Telemetry.groovy (about)

     1  package com.sap.piper.analytics
     2  
     3  import com.cloudbees.groovy.cps.NonCPS
     4  
     5  import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
     6  
     7  class Telemetry implements Serializable{
     8  
     9      protected static Telemetry instance
    10  
    11      protected List listenerList = []
    12  
    13      protected Telemetry(){}
    14  
    15      protected static Telemetry getInstance(){
    16          if(!instance) {
    17              instance = new Telemetry()
    18  
    19              registerListener({ steps, payload ->
    20                  piperOsDefaultReporting(steps, payload)
    21              })
    22          }
    23          return instance
    24      }
    25  
    26      static void registerListener(Closure listener){
    27          getInstance().listenerList.add(listener)
    28      }
    29  
    30      static notify(Script steps, Map config, Map payload){
    31          //allow opt-out via configuration
    32          if (!config?.collectTelemetryData) {
    33              steps.echo "[${payload.step}] Sending telemetry data is disabled."
    34              return
    35          }
    36  
    37          getInstance().listenerList.each { listener ->
    38              try {
    39                  listener(steps, payload)
    40              } catch (ignore) {
    41                  // some error occurred in telemetry reporting. This should not break anything though.
    42                  steps.echo "[${payload.step}] Telemetry Report with listener failed: ${ignore.getMessage()}"
    43              }
    44          }
    45      }
    46  
    47      protected static void piperOsDefaultReporting(Script steps, Map payload) {
    48          def swaEndpoint = 'https://webanalytics.cfapps.eu10.hana.ondemand.com/tracker/log'
    49          Map swaPayload = [
    50              'idsite': '827e8025-1e21-ae84-c3a3-3f62b70b0130',
    51              'url': 'https://github.com/SAP/jenkins-library',
    52              'action_name': payload.actionName,
    53              'event_type': payload.eventType,
    54              'custom3': payload.step,            // custom3 = step name (passed as parameter step)
    55              'custom4': payload.jobUrlSha1,      // custom4 = job url hashed (calculated)
    56              'custom5': payload.buildUrlSha1,    // custom5 = build url hashed (calculated)
    57              'custom10': payload.stageName       // custom10 = stage name
    58          ]
    59          // step related parameters
    60          for(def key : [1, 2, 3, 4, 5]){         // custom11 - custom15 = step related parameter 1 - 5 (passed as parameter stepParam1 - stepParam5)
    61              if (payload["stepParam${key}"] != null) swaPayload.put("custom1${key}", payload["stepParam${key}"])
    62          }
    63  
    64          try {
    65              steps.timeout(
    66                  time: 10,
    67                  unit: 'SECONDS'
    68              ){
    69                  steps.httpRequest(url: "${swaEndpoint}?${getPayloadString(swaPayload)}", timeout: 5, quiet: true)
    70              }
    71          } catch (FlowInterruptedException ignore){
    72              // telemetry reporting timed out. This should not break anything though.
    73              steps.echo "[${payload.step}] Telemetry Report with listener failed: timeout"
    74          }
    75      }
    76  
    77      @NonCPS
    78      private static String getPayloadString(Map payload){
    79          return payload
    80              .collect { entry -> return "${entry.key}=${URLEncoder.encode(entry.value.toString(), "UTF-8")}" }
    81              .join('&')
    82      }
    83  }