All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.malliina.logstreams.client.LogstreamsUtils.scala Maven / Gradle / Ivy

The newest version!
package com.malliina.logstreams.client

import cats.effect.{Resource, Sync}
import cats.effect.kernel.Async
import cats.effect.std.Dispatcher
import cats.syntax.all.{toFlatMapOps, toFunctorOps}
import ch.qos.logback.classic.LoggerContext
import com.malliina.http.io.HttpClientF2
import com.malliina.logback.LogbackUtils
import com.malliina.values.ErrorMessage
import org.slf4j.LoggerFactory

case class LogstreamsConf(enabled: Boolean, user: String, pass: String, userAgent: String)

object LogstreamsConf:
  def isEnabled = sys.env.get("LOGSTREAMS_ENABLED").contains("true")

  def read(defaultUser: String, userAgent: String): Either[ErrorMessage, LogstreamsConf] =
    for pass <- LogstreamsUtils.env("LOGSTREAMS_PASS")
    yield LogstreamsConf(
      isEnabled,
      sys.env.getOrElse("LOGSTREAMS_USER", defaultUser),
      pass,
      userAgent
    )

object LogstreamsUtils:
  def resource[F[_]: Async](
    conf: LogstreamsConf,
    d: Dispatcher[F],
    http: HttpClientF2[F]
  ): Resource[F, Unit] =
    Resource.make(install(conf, d, http))(_ => Sync[F].delay(LogbackUtils.loggerContext.stop()))

  def installIfEnabled[F[_]: Async](
    defaultUser: String,
    userAgent: String,
    d: Dispatcher[F],
    http: HttpClientF2[F]
  ) =
    if LogstreamsConf.isEnabled then
      LogstreamsConf
        .read(defaultUser, userAgent)
        .fold(
          err => Async[F].raiseError(IllegalArgumentException(err.message)),
          ok => install(ok, d, http)
        )
        .map(_ => true)
    else Async[F].pure(false)

  def install[F[_]: Async](
    conf: LogstreamsConf,
    d: Dispatcher[F],
    http: HttpClientF2[F]
  ): F[Unit] =
    val lc = LogbackUtils.loggerContext
    FS2Appender
      .default(
        d,
        http,
        Map(HttpUtil.UserAgent -> conf.userAgent)
      )
      .flatMap: appender =>
        Async[F].delay:
          appender.setContext(lc)
          appender.setName("LOGSTREAMS")
          appender.setEndpoint("wss://logs.malliina.com/ws/sources")
          appender.setUsername(conf.user)
          appender.setPassword(conf.pass)
          appender.setEnabled(conf.enabled)
          LogbackUtils.installAppender(appender)

  def env(key: String): Either[ErrorMessage, String] =
    sys.env.get(key).toRight(ErrorMessage(s"No $key environment variable set."))




© 2015 - 2025 Weber Informatics LLC | Privacy Policy