Commit 75663811 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

InstructionFactory#parse_time

parent 1f4046d1
Loading
Loading
Loading
Loading
+34 −5
Original line number Diff line number Diff line
@@ -10,9 +10,15 @@ package com.fnordmetric.enterprise
object InstructionFactory {

  val X_METRICKEY = """(.*)(mean|sum)-([0-9]+)"""
  val X_TIMESPEC  = """(-?[0-9\.]*[acedhioumnrstyw]*)"""
  val X_TUNIX     = """([0-9]+)""".r
  val X_TSECS     = """-([0-9]+(?:\.[0-9]+)?)s?(?:ec(?:ond)?(?:s?))?""".r
  val X_TMINS     = """-([0-9]+(?:\.[0-9]+)?)m(?:in(?:ute)?(?:s?))?""".r
  val X_THOUR     = """-([0-9]+(?:\.[0-9]+)?)h(?:our(?:s?))?""".r
  val X_TDAYS     = """-([0-9]+(?:\.[0-9]+)?)d(?:ay(?:s?))?""".r
  val X_SAMPLE    = ("""^SAMPLE """ + X_METRICKEY + """ ([0-9]+\.?[0-9]*)$""").r
  val X_VALUESIN  = ("""^VALUES_?IN """ + X_METRICKEY + """ ([0-9]+) ([0-9]+)$""").r
  val X_VALUEAT   = ("""^VALUE_?AT """ + X_METRICKEY + """ ([0-9]+)$""").r
  val X_VALUESIN  = ("""^VALUES_?IN """ + X_METRICKEY + " " + X_TIMESPEC + " " + X_TIMESPEC).r
  val X_VALUEAT   = ("""^VALUE_?AT """ + X_METRICKEY + " " + X_TIMESPEC).r

  def parse(str: String) : AbstractInstruction = str match {

@@ -24,16 +30,39 @@ object InstructionFactory {
    case X_VALUESIN(key, mode, flush_interval, time0, time1) =>
      new ValuesInInstruction(MetricKey(key, mode,
      java.lang.Double.parseDouble(flush_interval).longValue * 1000),
      java.lang.Long.parseLong(time0), java.lang.Long.parseLong(time1))
      parseTime(time0), parseTime(time1))

    case X_VALUEAT(key, mode, flush_interval, time) =>
    case X_VALUEAT(key, mode, flush_interval, time) => {
      new ValueAtInstruction(MetricKey(key, mode,
      java.lang.Double.parseDouble(flush_interval).longValue * 1000),
      java.lang.Long.parseLong(time))
      parseTime(time))
    }

    case _ =>
      new ErrorInstruction("invalid command")

  }

  private def parseTime(str: String) : Long = str match {

    case "now" =>
      FnordMetric.now

    case X_TUNIX(numval) =>
      java.lang.Long.parseLong(numval) * 1000

    case X_TSECS(numval) =>
      FnordMetric.now - (java.lang.Long.parseLong(numval) * 1000)

    case X_TMINS(numval) =>
      FnordMetric.now - (java.lang.Long.parseLong(numval) * 60000)

    case X_THOUR(numval) =>
      FnordMetric.now - (java.lang.Long.parseLong(numval) * 3600000)

    case X_TDAYS(numval) =>
      FnordMetric.now - (java.lang.Long.parseLong(numval) * 86400000)

  }

}
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ class ValueAtInstruction(key: MetricKey, time: Long) extends AbstractInstruction

  def execute : String = {
    val metric = MetricFactory.get_metric(key)
    val value = metric.value_at(time * 1000).getOrElse(null)
    val value = metric.value_at(time).getOrElse(null)

    if (value == null)
      "null"
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ class ValuesInInstruction(key: MetricKey, time0: Long, time1: Long) extends Abst

  def execute : String = {
    val metric = MetricFactory.get_metric(key)
    val values = metric.values_in(time1 * 1000, time0 * 1000)
    val values = metric.values_in(time1, time0)

    // we estimate that every tuple will need around 25 byte in its
    // ascii representation