Skip to content

Commit 425f7d5

Browse files
committed
Add release duration stats
- Add azure_devops_stats_project_release_duration metric
1 parent 1a8a538 commit 425f7d5

File tree

4 files changed

+49
-5
lines changed

4 files changed

+49
-5
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ Metrics
8383
| `azure_devops_stats_project_builds` | stats | Number of builds per project, definition and result (counter) |
8484
| `azure_devops_stats_project_builds_wait` | stats | Build wait time per project, definition and result (summary) |
8585
| `azure_devops_stats_project_builds_duration` | stats | Build duration per project, definition and result (summary) |
86+
| `azure_devops_stats_project_release_duration` | stats | Release environment duration per project, definition, environment and result (summary) |
8687
| `azure_devops_resourceusage_build` | resourceusage | Usage of limited and paid Azure DevOps resources |
8788

8889

azure-devops-client/release.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,10 @@ func (r *Release) QueueDuration() time.Duration {
148148
return r.StartTime.Sub(r.QueueTime)
149149
}
150150

151-
func (c *AzureDevopsClient) ListLatestReleases(project string, duration time.Duration) (list ReleaseList, error error) {
151+
func (c *AzureDevopsClient) ListLatestReleases(project string, minTime time.Time) (list ReleaseList, error error) {
152152
defer c.concurrencyUnlock()
153153
c.concurrencyLock()
154154

155-
minTime := time.Now().Add(- duration)
156-
157155
url := fmt.Sprintf(
158156
"%v/_apis/release/releases?api-version=%v&isDeleted=false&$expand=94&minCreatedTime=%s&$top=%v",
159157
url.QueryEscape(project),

metrics_release.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,11 @@ func (m *MetricsCollectorRelease) Collect(ctx context.Context, callback chan<- f
207207

208208
// --------------------------------------
209209
// Releases
210+
minTime := time.Now().Add(- time.Duration(opts.LimitReleaseDuration))
210211

211-
releaseList, err := AzureDevopsClient.ListLatestReleases(project.Id, time.Duration(24 * time.Hour))
212+
releaseList, err := AzureDevopsClient.ListLatestReleases(project.Id, minTime)
212213
if err != nil {
213-
Logger.Errorf("project[%v]call[ListReleases]: %v", project.Name, err)
214+
Logger.Errorf("project[%v]call[ListLatestReleases]: %v", project.Name, err)
214215
return
215216
}
216217

metrics_stats.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type MetricsCollectorStats struct {
1717
projectBuildCount *prometheus.CounterVec
1818
projectBuildWait *prometheus.SummaryVec
1919
projectBuildDuration *prometheus.SummaryVec
20+
projectReleaseDuration *prometheus.SummaryVec
2021
}
2122
}
2223

@@ -107,20 +108,63 @@ func (m *MetricsCollectorStats) Setup(collector *CollectorProject) {
107108
},
108109
)
109110

111+
m.prometheus.projectReleaseDuration = prometheus.NewSummaryVec(
112+
prometheus.SummaryOpts{
113+
Name: "azure_devops_stats_project_release_duration",
114+
Help: "Azure DevOps stats project release process duration",
115+
MaxAge: *opts.StatsSummaryMaxAge,
116+
},
117+
[]string{
118+
"projectID",
119+
"releaseDefinitionID",
120+
"definitionEnvironmentID",
121+
"status",
122+
},
123+
)
124+
125+
110126
prometheus.MustRegister(m.prometheus.agentPoolBuildCount)
111127
prometheus.MustRegister(m.prometheus.agentPoolBuildWait)
112128
prometheus.MustRegister(m.prometheus.agentPoolBuildDuration)
113129

114130
prometheus.MustRegister(m.prometheus.projectBuildCount)
115131
prometheus.MustRegister(m.prometheus.projectBuildWait)
116132
prometheus.MustRegister(m.prometheus.projectBuildDuration)
133+
134+
prometheus.MustRegister(m.prometheus.projectReleaseDuration)
117135
}
118136

119137
func (m *MetricsCollectorStats) Reset() {
120138
}
121139

122140
func (m *MetricsCollectorStats) Collect(ctx context.Context, callback chan<- func(), project devopsClient.Project) {
123141
m.CollectBuilds(ctx, callback, project)
142+
m.CollectReleases(ctx, callback, project)
143+
}
144+
145+
func (m *MetricsCollectorStats) CollectReleases(ctx context.Context, callback chan<- func(), project devopsClient.Project) {
146+
minTime := *m.CollectorReference.collectionLastTime
147+
148+
releaseList, err := AzureDevopsClient.ListLatestReleases(project.Id, minTime)
149+
if err != nil {
150+
Logger.Errorf("project[%v]call[ListLatestReleases]: %v", project.Name, err)
151+
return
152+
}
153+
154+
for _, release := range releaseList.List {
155+
for _, environment := range release.Environments {
156+
timeToDeploy := environment.TimeToDeploy * 60
157+
158+
if timeToDeploy > 0 {
159+
m.prometheus.projectReleaseDuration.With(prometheus.Labels{
160+
"projectID": release.Project.Id,
161+
"releaseDefinitionID": int64ToString(release.Definition.Id),
162+
"definitionEnvironmentID": int64ToString(environment.DefinitionEnvironmentId),
163+
"status": environment.Status,
164+
}).Observe(timeToDeploy)
165+
}
166+
}
167+
}
124168
}
125169

126170
func (m *MetricsCollectorStats) CollectBuilds(ctx context.Context, callback chan<- func(), project devopsClient.Project) {

0 commit comments

Comments
 (0)