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 }