Skip to content
mike edited this page Apr 18, 2016 · 1 revision

на 1й взгляд класс должен выглядеть как:

case class Log(
  id: Option[UUID],
  env: String
  `class`: String,
  tmp: Timestamp,
  message: String,
  cause: String,
  stackTrace: String
)

insert\read: [akka io, spray, shapeless, scala macro]

Логи постуают в систему через http/tcp слой (Log class), нужно сохранить эти данные в rethink, для этого, используя shapeless написать конвертер из Log класса в модель rethink (java.util.HashMap) Используя scala macro написать обратный конвертер конвертер из j.u.HM в Log

return data: [scala macro, spray, akka]

пользователь должен видеть на ui, последние N записей, написать используя scala macro filter для Log class: logsDb.filter(l => filter-function)

query: [spray, akka, gll parsers]

нужна возможность делать запросы для сохранённых записей

примерная грамматика выглядит как:

query = left operation right

left = field_name from Log class
operation = '=', '!=', 'contains'

right = left | bool_op
bool_op = AND | OR 

examples: env = 'prodaction' env = 'production' AND message contains 'Failed to'

NOTE: про приоритеты думать не нужно

changes: [akka-stream, websockets, akka]

при изменениях в базе (новых записях) нужно пушить эти изменения на ui с помощью вебсокетов

analytics: [spark, scala macro]

для ui нужно построить графики по частоте Execption, за 24h, 2d, 3d, 7d

для запросов нужно использовать scala-macro функции вида: dbLogs.filter(x => x.timestamp > ...)