Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

softwaremill/correlator

null

softwaremill/correlator.json
{
"createdAt": "2019-07-15T17:28:38Z",
"defaultBranch": "master",
"description": null,
"fullName": "softwaremill/correlator",
"homepage": null,
"language": "Scala",
"name": "correlator",
"pushedAt": "2022-05-15T04:50:13Z",
"stargazersCount": 15,
"topics": [],
"updatedAt": "2025-10-24T11:56:06Z",
"url": "https://github.com/softwaremill/correlator"
}

Build Status

See the blog for introduction.

Currently supports monix & logback.

Generic usage:

  • add the dependency: "com.softwaremill.correlator" %% "monix-logback-http4s" % "0.1.9" to your project
  • create an object extending the CorrelationIdDecorator class, e.g. object MyCorrelationId extends CorrelationIdDecorator()
  • call MyCorrelationId.init() immediately after your program starts (in the main() method)
  • create an implicit instance of CorrelationIdSource for given T from which you want to extract correlation id
  • wrap any T => Task[R] function with MyCorrelationId.withCorrelationId, so that a correlation id is extracted from the argument (using the defined CorrelationIdSource), or a new one is created.
  • you can access the current correlation id (if any is set) using MyCorrelationId.apply() or MyCorrelationId.applySync().

For http4s integration:

  • add the dependency: "com.softwaremill.correlator" %% "monix-logback-http4s" % "0.1.9" to your project
  • create an object extending the CorrelationIdDecorator class, e.g. object MyCorrelationId extends CorrelationIdDecorator()
  • call MyCorrelationId.init() immediately after your program starts (in the main() method)
  • wrap your HttpRoutes[Task] with Http4sCorrelationMiddleware(MyCorrelationId).withCorrelationId, so that a correlation id is extracted from the request (using the provided header name), or a new one is created.
  • you can access the current correlation id (if any is set) using MyCorrelationId.apply() or MyCorrelationId.applySync().

Logging each request with corresponding correlationId can be done in following way:

def loggingMiddleware[T, R]!(
service: HttpRoutes[Task],
logStartRequest: Request[Task] => Task[Unit] = req =>
Task(MyLogger.debug(s"Starting request to: ${req.uri.path}"))
): HttpRoutes[Task] = Kleisli{ req: Request[Task] =>
val setupAndService = for {
_ <- logStartRequest(req)
r <- service(req).value
} yield r
OptionT(setupAndService)
}
val middleware = Http4sCorrelationMiddleware(correlationIdDecorator)
middleware.withCorrelationId(loggingMiddleware(service))