Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions admin/app/com/lucidchart/piezo/admin/controllers/HealthCheck.scala
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package com.lucidchart.piezo.admin.controllers

import org.joda.time.{DateTime, Minutes}
import org.joda.time.format.ISODateTimeFormat
import play.api.*
import play.api.libs.json.*
import play.api.Logging
import play.api.mvc.*
import scala.io.Source
import java.time.Instant
import java.time.ZoneOffset.UTC
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit.{MINUTES, SECONDS}

class HealthCheck(configuration: Configuration, cc: ControllerComponents) extends AbstractController(cc) with Logging {
import HealthCheck.timeFormatter

val heartbeatFilename: String = configuration.getOptional[String]("com.lucidchart.piezo.heartbeatFile").getOrElse {
logger.warn("heartbeat file not specified")
Expand All @@ -34,13 +37,16 @@ class HealthCheck(configuration: Configuration, cc: ControllerComponents) extend
try {
val heartbeatFileLines = heartbeatFile.getLines().toList
val heartbeatTimestamp = heartbeatFileLines(0)
val formatter = ISODateTimeFormat.dateTimeNoMillis().withZoneUTC()
val heartbeatTime = formatter.parseDateTime(heartbeatTimestamp)
val currentTime = new DateTime
val isTimestampRecent = Minutes.minutesBetween(heartbeatTime, currentTime).getMinutes < minutesBetweenBeats
(isTimestampRecent, formatter.print(heartbeatTime))
val heartbeatTime = timeFormatter.parse(heartbeatTimestamp, Instant.from)
val currentTime = Instant.now()
val isTimestampRecent = heartbeatTime.until(currentTime, MINUTES) < minutesBetweenBeats
(isTimestampRecent, timeFormatter.format(heartbeatTime.truncatedTo(SECONDS)))
} finally {
heartbeatFile.close()
}
}
}

object HealthCheck {
private[piezo] val timeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(UTC)
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class Jobs(
.flatMap { job =>
jobHistoryModel.getJob(job).headOption
}
.sortWith(_.start after _.start)
.sortWith((a, b) => a.start.isAfter(b.start))
val triggeredJobs: List[JobKey] = TriggerHelper
.getTriggersByGroup(scheduler)
.flatMap { case (group, triggerKeys) =>
Expand Down
17 changes: 9 additions & 8 deletions admin/app/com/lucidchart/piezo/admin/controllers/Triggers.scala
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.lucidchart.piezo.admin.controllers

import com.lucidchart.piezo.TriggerMonitoringPriority
import java.util.Date
import org.quartz.Trigger.TriggerState
import com.lucidchart.piezo.admin.models.{ModelComponents, MonitoringTeams}
import java.time.Instant
import org.quartz.*
import org.quartz.Trigger.TriggerState
import org.quartz.impl.triggers.{CronTriggerImpl, SimpleTriggerImpl}
import play.api.Logging
import play.api.libs.json.*
import play.api.mvc.*
import com.lucidchart.piezo.admin.models.{ModelComponents, MonitoringTeams}
import scala.collection.mutable
import scala.jdk.CollectionConverters.*
import scala.util.Try
import play.api.Logging

class Triggers(
scheduler: Scheduler,
Expand All @@ -27,17 +27,18 @@ class Triggers(

val triggerFormHelper = new TriggerFormHelper(scheduler, monitoringTeams)

def firesFirst(time: Date)(trigger1: Trigger, trigger2: Trigger): Boolean = {
val time1 = trigger1.getFireTimeAfter(time)
val time2 = trigger2.getFireTimeAfter(time)
def firesFirst(time: Instant)(trigger1: Trigger, trigger2: Trigger): Boolean = {
val d = java.util.Date.from(time)
val time1 = trigger1.getFireTimeAfter(d)
val time2 = trigger2.getFireTimeAfter(d)
if (time2 == null) true
else if (time1 == null) false
else if (time1 != time2) time1 before time2
else trigger1.getPriority > trigger2.getPriority
}

def getIndex: Action[AnyContent] = Action { implicit request =>
val now = new Date()
val now = Instant.now()
val allTriggers: List[Trigger] = TriggerHelper
.getTriggersByGroup(scheduler)
.flatMap { case (group, triggerKeys) =>
Expand Down
35 changes: 35 additions & 0 deletions admin/app/com/lucidchart/piezo/admin/views/TimeFormat.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.lucidchart.piezo.admin.views

import java.time.Instant
import java.time.ZoneOffset.UTC
import java.time.format.DateTimeFormatter

object TimeFormat {

private val dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(UTC)

/**
* Print a java.util.Date in a standard format.
*
* Will prilnt "--" if null is passed
*/
def printDate(d: java.util.Date): String = {
if (d == null) {
"--"
} else {
dtf.format(d.toInstant)
}
}

/**
* Print an instant in a standard format.
*/
def printInstant(i: Instant): String = {
dtf.format(i)
}

def printInstant(instant: Option[Instant]): String = instant match {
case Some(i) => dtf.format(i)
case None => "--"
}
}
9 changes: 3 additions & 6 deletions admin/app/com/lucidchart/piezo/admin/views/jobs.scala.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
@import com.lucidchart.piezo.admin.controllers.{routes=>piezoRoutes}
@import org.joda.time.format.DateTimeFormat
@import org.joda.time.DateTime
@import org.quartz.{JobKey, SchedulerMetaData}
@import com.lucidchart.piezo.admin.views.TimeFormat.printInstant
@(
jobsByGroup: scala.collection.mutable.Buffer[(String, scala.collection.immutable.List[org.quartz.JobKey])],
currentJob: Option[org.quartz.JobDetail],
Expand Down Expand Up @@ -63,11 +62,10 @@ <h4>Jobs History</h4>
</tr>
</thead>
<tbody>
@defining(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")) { dtf =>
@jobsHistory.get.map { record =>
<tr>
<td>@dtf.print(new DateTime(record.start))</td>
<td>@dtf.print(new DateTime(record.finish))</td>
<td>@printInstant(record.start)</td>
<td>@printInstant(record.finish)</td>
<td>@record.group</td>
<td><a href="@piezoRoutes.Jobs.getJob(record.group, record.name)">@record.name</a></td>
<td>@record.trigger_group</td>
Expand All @@ -76,7 +74,6 @@ <h4>Jobs History</h4>

</tr>
}
}
</tbody>
</table>
}
Expand Down
13 changes: 5 additions & 8 deletions admin/app/com/lucidchart/piezo/admin/views/triggers.scala.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
request: play.api.mvc.Request[AnyContent]
)
@import com.lucidchart.piezo.admin.views
@import java.util.Date
@import org.joda.time.format.DateTimeFormat
@import org.joda.time.DateTime
@import com.lucidchart.piezo.admin.views.TimeFormat.printDate

@com.lucidchart.piezo.admin.views.html.triggersLayout(triggersByGroup, currentTrigger) {
<h3>Select a trigger</h3>
Expand Down Expand Up @@ -42,12 +40,12 @@ <h4>Upcoming Triggers</h4>
</tr>
</thead>
<tbody>
@defining(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")) { dtf =>
@defining(new Date()) { now =>
*{ quartz still uses java.util.Date }*
@defining(new java.util.Date()) { now =>
@upcomingTriggers.map { trigger =>
<tr>
<td>@dtf.print(new DateTime(trigger.getFireTimeAfter(now)))</td>
<td>@dtf.print(new DateTime(trigger.getFireTimeAfter(trigger.getFireTimeAfter(now))))</td>
<td>@printDate(trigger.getFireTimeAfter(now))</td>
<td>@printDate(trigger.getFireTimeAfter(trigger.getFireTimeAfter(now)))</td>
<td>@trigger.getKey.getGroup</td>
<td>@trigger.getKey.getName</td>
<td>@trigger.getJobKey.getGroup</td>
Expand All @@ -56,7 +54,6 @@ <h4>Upcoming Triggers</h4>
</tr>
}
}
}
</tbody>
</table>
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
package com.lucidchart.piezo.admin.controllers

import java.io.{File, FileWriter}
import org.joda.time.DateTime
import org.joda.time.format.ISODateTimeFormat
import org.specs2.mutable.*
import play.api.Configuration
import play.api.test.Helpers.*
import play.api.test.*
import org.joda.time.format.DateTimeFormatter
import java.time.Instant
import java.time.temporal.ChronoUnit.MINUTES

class HealthCheckTest extends Specification {

val filename = "HeartbeatTestFile"
val dtf: DateTimeFormatter = ISODateTimeFormat.dateTimeNoMillis().withZoneUTC()
private val dtf = HealthCheck.timeFormatter

trait FileCleaner extends After {
def after: Unit = new File(filename).delete
Expand All @@ -24,7 +23,7 @@ class HealthCheckTest extends Specification {
"send 200 when the worker timestamp is recent" in new FileCleaner {
val file = new File(filename)
val fileWrite = new FileWriter(file)
val heartbeatTime = dtf.print(new DateTime(System.currentTimeMillis()))
val heartbeatTime = dtf.format(Instant.now())
fileWrite.write(heartbeatTime)
fileWrite.close()
val healthCheck = new HealthCheck(testConfig(filename), Helpers.stubControllerComponents())
Expand All @@ -35,7 +34,7 @@ class HealthCheckTest extends Specification {
"send 503 when the worker timestamp is too far in the past" in new FileCleaner {
val file = new File(filename)
val fileWrite = new FileWriter(file)
val heartbeatTime = dtf.print(new DateTime(System.currentTimeMillis()).minusMinutes(10))
val heartbeatTime = dtf.format(Instant.now().minus(10, MINUTES))
fileWrite.write(heartbeatTime)
fileWrite.close()
val healthCheck = new HealthCheck(testConfig(filename), Helpers.stubControllerComponents())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.lucidchart.piezo.admin.controllers
import org.quartz.{JobBuilder, Scheduler, SimpleScheduleBuilder, TriggerBuilder}
import com.lucidchart.piezo.jobs.monitoring.HeartBeat
import com.lucidchart.piezo.admin.models.ModelComponents
import java.util.Date
import java.time.Instant

/**
*/
Expand All @@ -13,7 +13,7 @@ object TestUtil {
val triggerGroup = "testTriggerGroup"
val triggerName = "testTriggerName"

def createJob(scheduler: Scheduler): Date = {
def createJob(scheduler: Scheduler): Instant = {
val jobDetail = JobBuilder
.newJob(classOf[HeartBeat])
.withIdentity(jobName, jobGroup)
Expand All @@ -30,7 +30,7 @@ object TestUtil {
.withDescription("test schedule description")
.build()
scheduler.deleteJob(jobDetail.getKey())
scheduler.scheduleJob(jobDetail, trigger)
scheduler.scheduleJob(jobDetail, trigger).toInstant
}

val mockModelComponents = new ModelComponents(() => throw new Exception("fake connection"))
Expand Down
2 changes: 0 additions & 2 deletions worker/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ libraryDependencies ++= Seq(
"org.specs2" %% "specs2-core" % "4.20.9" % Test,
"mysql" % "mysql-connector-java" % "8.0.33",
"javax.transaction" % "jta" % "1.1",
"joda-time" % "joda-time" % "2.13.1",
"org.joda" % "joda-convert" % "3.0.1",
"com.typesafe" % "config" % "1.4.3",
"com.datadoghq" % "java-dogstatsd-client" % "4.4.3",
)
Expand Down
Loading