This is an implementation of how to decide whether to trace a request using annotations on a java
method. It is not an implementation of aspect-oriented or otherwise declarative tracing. See the
test cases for this class for example implementations.
Example: A user defines an annotation, for example
com.myco.Traced, and a lookup
function for its rate (could be simple as reading a field, or even a constant). An interceptor
uses this sampler on each invocation of a potentially annotated target. The result decides
whether a new trace should be started or not.
No runtime parameters are considered here, but that doesn't mean you can't achieve
parameterized sampling using this. If your method is annotated such that it only accepts a
fraction of requests, adding a custom
@Traced annotation would apply to that subset. For
example, if you have a JAX-RS method, it is already qualified by method and likely path. A user
can add and inspect their own grouping annotation to override whatever the default rate is.
Under the scenes, a map of samplers by method is maintained. The size of this map should not
be a problem when it directly relates to declared methods. For example, this would be invalid if
annotations were created at runtime and didn't match.