|
4 | 4 | "context" |
5 | 5 | "github.com/prometheus/client_golang/prometheus" |
6 | 6 | devopsClient "github.com/webdevops/azure-devops-exporter/azure-devops-client" |
| 7 | + "time" |
7 | 8 | ) |
8 | 9 |
|
9 | 10 | type MetricsCollectorRelease struct { |
@@ -200,108 +201,110 @@ func (m *MetricsCollectorRelease) Collect(ctx context.Context, callback chan<- f |
200 | 201 | "badgeUrl": environment.BadgeUrl, |
201 | 202 | }) |
202 | 203 | } |
| 204 | + } |
203 | 205 |
|
204 | | - // -------------------------------------- |
205 | | - // Releases |
206 | 206 |
|
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 | + }) |
211 | 241 | } |
212 | 242 |
|
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), |
224 | 252 | }) |
225 | 253 |
|
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 | + } |
238 | 273 |
|
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{ |
251 | 275 | "projectID": project.Id, |
252 | 276 | "releaseID": int64ToString(release.Id), |
253 | 277 | "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 | + } |
256 | 288 |
|
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{ |
258 | 296 | "projectID": project.Id, |
259 | 297 | "releaseID": int64ToString(release.Id), |
260 | 298 | "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) |
305 | 308 | } |
306 | 309 | } |
307 | 310 | } |
|
0 commit comments