Skip to content

Commit d36ef06

Browse files
committed
Get releases for whole project
- jobDuration is not set if releaseDefinitionId filter is active - Don’t get all releases now
1 parent 56333c8 commit d36ef06

File tree

3 files changed

+93
-88
lines changed

3 files changed

+93
-88
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Normally no configuration is needed but can be customized using environment vari
3939
| `LIMIT_RELEASES_PER_DEFINITION` | `100` | Fetched releases per definition |
4040
| `LIMIT_DEPLOYMENTS_PER_DEFINITION` | `100` | Fetched deployments per definition |
4141
| `LIMIT_RELEASEDEFINITION_PER_PROJECT` | `100` | Fetched builds per definition |
42+
| `LIMIT_RELEASE_DURATION` | `48h` | Time (time.Duration) how long the exporter should look back for releases |
4243

4344

4445
Metrics

main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ var opts struct {
7474
LimitReleasesPerDefinition int64 `long:"limit.releases-per-definition" env:"LIMIT_RELEASES_PER_DEFINITION" description:"Limit releases per definition" default:"100"`
7575
LimitDeploymentPerDefinition int64 `long:"limit.deployments-per-definition" env:"LIMIT_DEPLOYMENTS_PER_DEFINITION" description:"Limit deployments per definition" default:"100"`
7676
LimitReleaseDefinitionsPerProject int64 `long:"limit.releasedefinitions-per-project" env:"LIMIT_RELEASEDEFINITION_PER_PROJECT" description:"Limit builds per definition" default:"100"`
77+
LimitReleaseDuration time.Duration `long:"limit.release-duration" env:"LIMIT_RELEASE_DURATION" description:"Time (time.Duration) how long the exporter should look back for releases" default:"48h"`
7778
}
7879

7980
func main() {

metrics_release.go

Lines changed: 91 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"github.com/prometheus/client_golang/prometheus"
66
devopsClient "github.com/webdevops/azure-devops-exporter/azure-devops-client"
7+
"time"
78
)
89

910
type MetricsCollectorRelease struct {
@@ -200,108 +201,110 @@ func (m *MetricsCollectorRelease) Collect(ctx context.Context, callback chan<- f
200201
"badgeUrl": environment.BadgeUrl,
201202
})
202203
}
204+
}
203205

204-
// --------------------------------------
205-
// Releases
206206

207-
releaseList, err := AzureDevopsClient.ListReleases(project.Id, releaseDefinition.Id)
208-
if err != nil {
209-
Logger.Errorf("project[%v]call[ListReleases]: %v", project.Name, err)
210-
return
207+
208+
// --------------------------------------
209+
// Releases
210+
211+
releaseList, err := AzureDevopsClient.ListLatestReleases(project.Id, time.Duration(24 * time.Hour))
212+
if err != nil {
213+
Logger.Errorf("project[%v]call[ListReleases]: %v", project.Name, err)
214+
return
215+
}
216+
217+
for _, release := range releaseList.List {
218+
releaseMetric.AddInfo(prometheus.Labels{
219+
"projectID": project.Id,
220+
"releaseID": int64ToString(release.Id),
221+
"releaseDefinitionID": int64ToString(release.Definition.Id),
222+
"requestedBy": release.RequestedBy.DisplayName,
223+
"releaseName": release.Name,
224+
"status": release.Status,
225+
"reason": release.Reason,
226+
"result": boolToString(release.Result),
227+
"url": release.Links.Web.Href,
228+
})
229+
230+
for _, artifact := range release.Artifacts {
231+
releaseArtifactMetric.AddInfo(prometheus.Labels{
232+
"projectID": project.Id,
233+
"releaseID": int64ToString(release.Id),
234+
"sourceId": artifact.SourceId,
235+
"repositoryID": artifact.DefinitionReference.Repository.Name,
236+
"branch": artifact.DefinitionReference.Branch.Name,
237+
"type": artifact.Type,
238+
"alias": artifact.Alias,
239+
"version": artifact.DefinitionReference.Version.Name,
240+
})
211241
}
212242

213-
for _, release := range releaseList.List {
214-
releaseMetric.AddInfo(prometheus.Labels{
215-
"projectID": project.Id,
216-
"releaseID": int64ToString(release.Id),
217-
"releaseDefinitionID": int64ToString(release.Definition.Id),
218-
"requestedBy": release.RequestedBy.DisplayName,
219-
"releaseName": release.Name,
220-
"status": release.Status,
221-
"reason": release.Reason,
222-
"result": boolToString(release.Result),
223-
"url": release.Links.Web.Href,
243+
for _, environment := range release.Environments {
244+
releaseEnvironmentMetric.AddInfo(prometheus.Labels{
245+
"projectID": project.Id,
246+
"releaseID": int64ToString(release.Id),
247+
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
248+
"environmentName": environment.Name,
249+
"status": environment.Status,
250+
"triggerReason": environment.TriggerReason,
251+
"rank": int64ToString(environment.Rank),
224252
})
225253

226-
for _, artifact := range release.Artifacts {
227-
releaseArtifactMetric.AddInfo(prometheus.Labels{
228-
"projectID": project.Id,
229-
"releaseID": int64ToString(release.Id),
230-
"sourceId": artifact.SourceId,
231-
"repositoryID": artifact.DefinitionReference.Repository.Name,
232-
"branch": artifact.DefinitionReference.Branch.Name,
233-
"type": artifact.Type,
234-
"alias": artifact.Alias,
235-
"version": artifact.DefinitionReference.Version.Name,
236-
})
237-
}
254+
releaseEnvironmentStatusMetric.AddTime(prometheus.Labels{
255+
"projectID": project.Id,
256+
"releaseID": int64ToString(release.Id),
257+
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
258+
"type": "created",
259+
}, environment.CreatedOn)
260+
261+
releaseEnvironmentStatusMetric.AddIfNotZero(prometheus.Labels{
262+
"projectID": project.Id,
263+
"releaseID": int64ToString(release.Id),
264+
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
265+
"type": "jobDuration",
266+
}, environment.TimeToDeploy * 60)
267+
268+
for _, approval := range environment.PreDeployApprovals {
269+
// skip automated approvals
270+
if approval.IsAutomated {
271+
continue
272+
}
238273

239-
for _, environment := range release.Environments {
240-
releaseEnvironmentMetric.AddInfo(prometheus.Labels{
241-
"projectID": project.Id,
242-
"releaseID": int64ToString(release.Id),
243-
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
244-
"environmentName": environment.Name,
245-
"status": environment.Status,
246-
"triggerReason": environment.TriggerReason,
247-
"rank": int64ToString(environment.Rank),
248-
})
249-
250-
releaseEnvironmentStatusMetric.AddTime(prometheus.Labels{
274+
releaseEnvironmentApprovalMetric.AddTime(prometheus.Labels{
251275
"projectID": project.Id,
252276
"releaseID": int64ToString(release.Id),
253277
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
254-
"type": "created",
255-
}, environment.CreatedOn)
278+
"approvalType": approval.ApprovalType,
279+
"status": approval.Status,
280+
"isAutomated": boolToString(approval.IsAutomated),
281+
"trialNumber": int64ToString(approval.TrialNumber),
282+
"attempt": int64ToString(approval.Attempt),
283+
"rank": int64ToString(approval.Rank),
284+
"approver": approval.Approver.DisplayName,
285+
"approvedBy": approval.ApprovedBy.DisplayName,
286+
}, approval.CreatedOn)
287+
}
256288

257-
releaseEnvironmentStatusMetric.Add(prometheus.Labels{
289+
for _, approval := range environment.PostDeployApprovals {
290+
// skip automated approvals
291+
if approval.IsAutomated {
292+
continue
293+
}
294+
295+
releaseEnvironmentApprovalMetric.AddTime(prometheus.Labels{
258296
"projectID": project.Id,
259297
"releaseID": int64ToString(release.Id),
260298
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
261-
"type": "jobDuration",
262-
}, environment.TimeToDeploy)
263-
264-
for _, approval := range environment.PreDeployApprovals {
265-
// skip automated approvals
266-
if approval.IsAutomated {
267-
continue
268-
}
269-
270-
releaseEnvironmentApprovalMetric.AddTime(prometheus.Labels{
271-
"projectID": project.Id,
272-
"releaseID": int64ToString(release.Id),
273-
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
274-
"approvalType": approval.ApprovalType,
275-
"status": approval.Status,
276-
"isAutomated": boolToString(approval.IsAutomated),
277-
"trialNumber": int64ToString(approval.TrialNumber),
278-
"attempt": int64ToString(approval.Attempt),
279-
"rank": int64ToString(approval.Rank),
280-
"approver": approval.Approver.DisplayName,
281-
"approvedBy": approval.ApprovedBy.DisplayName,
282-
}, approval.CreatedOn)
283-
}
284-
285-
for _, approval := range environment.PostDeployApprovals {
286-
// skip automated approvals
287-
if approval.IsAutomated {
288-
continue
289-
}
290-
291-
releaseEnvironmentApprovalMetric.AddTime(prometheus.Labels{
292-
"projectID": project.Id,
293-
"releaseID": int64ToString(release.Id),
294-
"environmentID": int64ToString(environment.DefinitionEnvironmentId),
295-
"approvalType": approval.ApprovalType,
296-
"status": approval.Status,
297-
"isAutomated": boolToString(approval.IsAutomated),
298-
"trialNumber": int64ToString(approval.TrialNumber),
299-
"attempt": int64ToString(approval.Attempt),
300-
"rank": int64ToString(approval.Rank),
301-
"approver": approval.Approver.DisplayName,
302-
"approvedBy": approval.ApprovedBy.DisplayName,
303-
}, approval.CreatedOn)
304-
}
299+
"approvalType": approval.ApprovalType,
300+
"status": approval.Status,
301+
"isAutomated": boolToString(approval.IsAutomated),
302+
"trialNumber": int64ToString(approval.TrialNumber),
303+
"attempt": int64ToString(approval.Attempt),
304+
"rank": int64ToString(approval.Rank),
305+
"approver": approval.Approver.DisplayName,
306+
"approvedBy": approval.ApprovedBy.DisplayName,
307+
}, approval.CreatedOn)
305308
}
306309
}
307310
}

0 commit comments

Comments
 (0)