Open skirsdeda opened 2 years ago
Thanks for writing this up! Indeed, there are still some things to work out with Tracing :)
If I understand correctly, I think you've run into a version of problem (2) as described in https://github.com/typelevel/otel4s/issues/11#issuecomment-1159464303. See also bayou for some exploratory work at improving the situation.
In the short term, instead of using IO
-based tracing, perhaps Kleisli
based tracing would work here?
@skirsdeda did you have any more luck with this? Any ideas or feedback you have would be very valuable, thanks!
@armanbilge I am working on it. I think I am somewhere around half way through at this point. Should have smth to show next week.
There's a problem when using tracing in combo with resources that are cached (in init or setup part of execution), which is even included in one of the examples: https://github.com/typelevel/feral/blob/main/examples/src/main/scala/feral/examples/KinesisLambda.scala#L52-L53.
The problem:
Trace[IO]
instance inside request handler code, because all spans there would become children of this never-ending root span. And some natchez backend implementations (like XRay) only send root span together with all children when root span is finished. So you get no recorded spans as a result.This means that
TracedHandler
implementation is useless if you need to haveTrace[IO]
during init. In case of skunk, you would want to see SQL query spans inside request spans and for that you need to reuse same instance ofTrace[IO]
for all requests.How it should work:
It should be possible to build a single
Trace[IO]
instance for the lifetime of lambda instance. Spans produced during initialization would get recorded as children of root span for the first ever request to that lambda instance.I hope I managed to describe this clearly 😅. Would be great to work this out and get that example fixed so that it would show how to use skunk and tracing with feral.