Skip to main content
Splunk Lantern

Continuous delivery productivity measures

You might need to measure continuous delivery planning when doing the following:

Prerequisites 

In order to execute this procedure in your environment, the following data, services, or apps are required:

The plug-in for Jenkins is not supported by Splunk.

Example

Your team has recently implemented a CI/CD pipeline. You want to use the Splunk platform to improve your continuous delivery planning process by key metrics related to effort and progress.

To optimize the search shown below, you should specify an index and a time range. 

  1. Check that you have correctly installed and configured an application performance monitoring add-on.
  2. Run the following search:
    (tag=continuous_delivery AND tag=project_management)
    | mvexpand lifecycle_id 
    | eventstats sum(planned_effort) AS total_effort BY lifecycle_id 
    | eval is_critical=if(priority="Critical" AND status!="Closed", 1, 0) 
    | eval planned_effort=if(isnull(planned_effort) OR planned_effort="null", 0, planned_effort) 
    | eval scoped_effort=if(planned_effort=0, 0, 100) 
    | eval inprogress_effort=if(status!="Closed", planned_effort, 0) 
    | eval percent_inprogress_effort=round((inprogress_effort/total_effort)*100, 2) 
    | eval time_started_work= if(isnotnull(time_started_work), round(strptime(time_started_work,"%Y-%m-%dT%H:%M:%S")), null()) 
    | eval time_closed= if(isnotnull(time_closed), round(strptime(time_closed,"%Y-%m-%dT%H:%M:%S")), null()) 
    | eval time_resolved = if(isnotnull(time_resolved), round(strptime(time_resolved,"%Y-%m-%dT%H:%M:%S")), null()) 
    | eval resolved_duration = if(isnotnull(time_resolved) AND isnotnull(time_started_work), round((time_resolved - time_started_work)/3600, 2), null()) 
    | eval tested_duration = if(isnotnull(time_resolved) AND isnotnull(time_closed), round((time_closed - time_resolved)/3600, 2), null()) 
    | eval completion_duration = if(isnotnull(time_started_work) AND isnotnull(time_closed), round((time_closed - time_started_work)/3600, 2), null()) 
    | eventstats count(eval(status="New" OR status="Untriaged" OR status="To Do")) AS income_dev_count, count(eval(status="Closed" OR status="Resolved" OR status="Done")) AS outcome_dev_count BY lifecycle_id 
    | eval io_dev_ratio=round(income_dev_count/outcome_dev_count, 2) 
    | eventstats count(eval(status="Resolved")) AS income_qa_count, count(eval(status="Closed" OR status="Done")) AS outcome_qa_count BY lifecycle_id 
    | eval io_qa_ratio=round(income_qa_count/outcome_qa_count, 2)
    | timechart span=5min avg(scoped_effort) AS "Effort Scoped", avg(total_effort) AS "Total Effort", avg(completion_duration) AS "Time to Effort Completion", max(io_qa_ratio) AS "Incoming/outgoing Closing Ratio", avg(tested_duration) AS "Mean Time To Close"
    

Search explanation

This search looks at continuous delivery events and calculates the following metrics:

  • Effort scoped
  • Total effort
  • Time to effort completion
  • Incoming/Outgoing Closing Ratio
  • Mean Time to Close

Result

For more granular results with scripted inputs, you can increase the frequency at which the input runs using the interval setting in inputs.conf. Running the input more frequently consumes more storage, and running it less frequently uses less, which can affect license consumption. The default interval is 60 seconds. 

Review the following items to improve performance:

  • Number of critical issues remaining
  • Number of stories or epics in progress
  • Ratio of under/overutilized developer capacity
  • Mean time to close a ticket in hours
  • Was this article helpful?