Github user vanzin commented on a diff in the pull request:
https://github.com/apache/spark/pull/22381#discussion_r225302668
--- Diff:
core/src/main/scala/org/apache/spark/status/AppStatusListener.scala ---
@@ -382,11 +391,38 @@ private[spark] class AppStatusListener(
}
job.status = event.jobResult match {
- case JobSucceeded => JobExecutionStatus.SUCCEEDED
- case JobFailed(_) => JobExecutionStatus.FAILED
+ case JobSucceeded =>
+ appStatusSource.foreach{_.SUCCEEDED_JOBS.inc(1)}
+ JobExecutionStatus.SUCCEEDED
+ case JobFailed(_) =>
+ appStatusSource.foreach{_.FAILED_JOBS.inc(1)}
+ JobExecutionStatus.FAILED
}
job.completionTime = if (event.time > 0) Some(new Date(event.time))
else None
+
+ for {
+ source <- appStatusSource
+ submissionTime <- job.submissionTime
+ completionTime <- job.completionTime
+ } yield {
+ val localSubmissionTime =
+ LocalDateTime.ofInstant(submissionTime.toInstant,
ZoneId.systemDefault)
+ val localCompletionTime =
+ LocalDateTime.ofInstant(completionTime.toInstant,
ZoneId.systemDefault)
+ val duration = Duration.between(localSubmissionTime,
localCompletionTime)
--- End diff --
I'm a little confused about why all these calls are needed. Isn't duration
`Duration.ofMillis(completionTime.getTime() - submissionTime.getTime())`?
And since the metric is actually in milliseconds, isn't this whole block
basically:
```
source.JOB_DURATION.value.set(completionTime.getTime() -
submissionTime.getTime())
```
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]