You might need to measure continuous delivery planning when doing the following:
In order to execute this procedure in your environment, the following data, services, or apps are required:
- Splunk ITSI
- Splunk ITSI Module for Application Performance Monitoring
- Build systems data
- Splunk Add-on for Bamboo, Splunk Add-on for JIRA, or Splunk App for Jenkins with the Splunk Plugin for Jenkins
The plug-in for Jenkins is not supported by Splunk.
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.
- Check that you have correctly installed and configured an application performance monitoring add-on.
- 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"
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
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