add TraceableValue typeclass and base implementations #667
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Introduces a lawless typeclass that is responsible for converting between the domain types used by a traced application and the
TraceValue
type that is used to track attribute values that can be attached to spans.Using a typeclass approach instead of relying on implicit conversions has a couple advantages. My original motivation was to allow for a form of semi-automatic instrumentation using cats-tagless's
Weave
effect, which requires method parameter types all be constrained by a user-specified typeclass. This requirement means that we can generically convert a value of typeA: TraceableValue
to aTraceValue
in positions where the compiler cannot prove that the existing implicit conversions would have worked.I recently published Dwolla/natchez-tagless to facilitate this kind of semi-automatic instrumentation. (If this PR is merged, I'd modify that library to remove its
ToTraceValue
typeclass and use theTraceableValue
I'm proposing here.)Another benefit comes with the use of refinement / opaque types, where the typeclass instance can format or redact a value before its inclusion as a span attribute.