Шаблон журнала событий в Scala

Все наши сервисы написаны на Scala. В основном мы пишем чистый функционал Scala, используя Cats.

Я пытаюсь выяснить, есть ли шаблон проектирования в Cats или Scala в целом, который я могу использовать для разработки EventLogger.

Этот eventLogger должен собирать "события" (значения простых ключей), когда запрос проходит через логику. В конце запроса я хочу записать собранные события в хранилище данных. У нас уже есть неявный параметр context, который передается всем методам. Я мог бы добавить этот EventLogger в мой класс Context, и он имел бы доступ к журналу событий из большинства частей моего кода. Теперь я пытаюсь понять, как спроектировать сам EventLogger, не используя изменяемую коллекцию.

Раньше я использовал актеров для сбора состояний в прошлом, чтобы управлять переходящими состояниями. Я бы предпочел не вводить Акку в наш classpath только для этого.

1 ответ

Как говорит @AndreyTyukin, Writer будет хорошо работать здесь.

Вы могли бы сделать что-то вроде:

object EventLogger {
  type Event = (String, String)
  def log(event: Event): Writer[Vector[Event], Unit] =
    Writer.tell(Vector(event))
}

И тогда вы можете использовать это так:

// Example usage
for {
  something <- Writer.value(myFunc(arg))
  _ <- EventLogger.log("function_finished" -> "myFunc")
  somethingElse <- Writer.value(myFunc2(arg2))
  _ <- EventLogger.log("function_finished" -> "myFunc2")
} yield combine(something, somethingElse)

В конце этого у вас будет какая-то Writer[Vector[Event], ?] значение где ? может быть значение, которое вас интересует, и Vector[Event] это все твое Event log данные готовы для вас, чтобы сделать что-то с.

Также обычно Writer не будет единственным контейнером, который вы хотите использовать. Вы, вероятно, хотите исследовать Monad Transformers, чтобы складывать контейнеры или что-то вроде Eff.

Другие вопросы по тегам