Skip to content

Commit

Permalink
feat(Jenkins): add queuedDurationSec
Browse files Browse the repository at this point in the history
  • Loading branch information
Kesin11 committed Nov 16, 2020
1 parent 063535b commit c75f400
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 3 deletions.
1 change: 1 addition & 0 deletions src/analyzer/analyzer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export type WorkflowReport = {
sumJobsDurationSec: number
successCount: 0 | 1 // = 'SUCCESS': 1, others: 0. For create average success rate in dashboard
parameters: JobParameter[]
queuedDurationSec: number
}

export type JobReport = {
Expand Down
2 changes: 2 additions & 0 deletions src/analyzer/circleci_analyzer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ type WorkflowReport = {
sumJobsDurationSec: number // = sum(jobs sumStepsDurationSec)
successCount: 0 | 1 // = 'SUCCESS': 1, others: 0
parameters: [] // CircleciAnalyzer does not support output build parameters yet
queuedDurationSec: number // Not implemented yet
}

type JobReport = {
Expand Down Expand Up @@ -128,6 +129,7 @@ export class CircleciAnalyzer implements Analyzer {
sumJobsDurationSec: secRound(sumBy(jobReports, 'sumStepsDurationSec')),
successCount: (status === 'SUCCESS') ? 1 : 0,
parameters: [],
queuedDurationSec: 0,
}
}

Expand Down
4 changes: 3 additions & 1 deletion src/analyzer/github_analyzer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type WorkflowReport = {
sumJobsDurationSec: number // = sum(jobs sumStepsDurationSec)
successCount: 0 | 1 // = 'SUCCESS': 1, others: 0
parameters: [] // GithubAnalyzer does not support build parameters yet
queuedDurationSec: number // Not implemented yet
}

type JobReport = {
Expand Down Expand Up @@ -125,7 +126,8 @@ export class GithubAnalyzer implements Analyzer {
workflowDurationSec: diffSec(startedAt, completedAt),
sumJobsDurationSec: sumBy(jobReports, 'sumStepsDurationSec'),
successCount: (status === 'SUCCESS') ? 1 : 0,
parameters: []
parameters: [],
queuedDurationSec: 0,
}
}

Expand Down
15 changes: 14 additions & 1 deletion src/analyzer/jenkins_analyzer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Status, Analyzer, secRound, TestReport, WorkflowParams, convertToReportTestSuites } from "./analyzer"
import { WfapiRunResponse, JenkinsStatus, BuildResponse, CauseAction, GhprbParametersAction, BuildData, ParametersAction } from "../client/jenkins_client"
import { WfapiRunResponse, JenkinsStatus, BuildResponse, CauseAction, GhprbParametersAction, BuildData, ParametersAction, TimeInQueueAction } from "../client/jenkins_client"
import { sumBy, first } from "lodash"
import { parse } from "junit2json"
import { Artifact } from "../client/client"
Expand All @@ -25,6 +25,7 @@ type WorkflowReport = {
sumJobsDurationSec: number // = sum(jobs sumStepsDurationSec)
successCount: 0 | 1 // = 'SUCCESS': 1, others: 0
parameters: JobParameter[]
queuedDurationSec: number
}

type JobReport = {
Expand Down Expand Up @@ -120,6 +121,7 @@ export class JenkinsAnalyzer implements Analyzer {
sumJobsDurationSec: secRound(sumBy(jobReports, 'sumStepsDurationSec')),
successCount: (status === 'SUCCESS') ? 1 : 0,
parameters: this.detectParameters(build),
queuedDurationSec: secRound(this.estimateQueuedDuration(build) / 1000),
}
}

Expand Down Expand Up @@ -246,4 +248,15 @@ export class JenkinsAnalyzer implements Analyzer {
return { name: param.name, value: String(param.value ?? '') }
})
}

estimateQueuedDuration(build: BuildResponse): number {
const action = build.actions.find((action) => {
return action._class === "jenkins.metrics.impl.TimeInQueueAction"
}) as TimeInQueueAction | undefined
if (!action) return 0

// buildableDurationMillis: Freestyle job queued time
// buildableTimeMillis: Pipeline job queued time
return action.buildableDurationMillis + action.buildableTimeMillis
}
}
22 changes: 21 additions & 1 deletion src/client/jenkins_client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,13 @@ export type BuildResponse = {
number: number // 80
fullDisplayName: string // "ci_analyzer #90",
timestamp: number // 1605412528346 (milisec timestamp)
actions: (CauseAction | BuildData | GhprbParametersAction | ParametersAction)[]
actions: (
CauseAction |
BuildData |
GhprbParametersAction | // from GitHub Pull Request Builder plugin
ParametersAction |
TimeInQueueAction // from Metrics plugin
)[]
artifacts: {
displayPath: string // "junit.xml",
fileName: string // "junit.xml",
Expand Down Expand Up @@ -148,6 +154,20 @@ export type ParametersAction = {
}[]
}

export type TimeInQueueAction = {
_class : "jenkins.metrics.impl.TimeInQueueAction",
blockedDurationMillis : number,
blockedTimeMillis : number,
buildableDurationMillis : number, // Freestyle job queued time
buildableTimeMillis : number, // Pipeline job queued time
buildingDurationMillis : number,
executingTimeMillis : number,
executorUtilization : number,
subTaskCount : number,
waitingDurationMillis : number,
waitingTimeMillis : number
}

export class JenkinsClient {
private axios: AxiosInstance
constructor(baseUrl: string, user?: string, token?: string) {
Expand Down

0 comments on commit c75f400

Please sign in to comment.