Added experimental HTTP backpropagators#1762
Conversation
4febe52 to
7b11971
Compare
48247ca to
3ff4d24
Compare
3ff4d24 to
f6b04c4
Compare
|
This looks clean. Does it become part api once it is moved from experimental to stable or it is something remains with instrumentation package? |
|
I think it'll remain in instrumentation package until the trace response proposal is merged into W3C and proposed in Otel. |
|
@aabmass @lonewolf3739 PTAL when you can. Thanks. |
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Show resolved
Hide resolved
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Show resolved
Hide resolved
ff3ee9c to
bedd0c6
Compare
| _BACK_PROPAGATOR = None | ||
|
|
||
|
|
||
| def get_global_back_propagator(): |
There was a problem hiding this comment.
I feel like instrumentation_propagator should be a better name, considering the path of this module. Also, do we really need these get and set methods? They give the exact same "protection" and namespacing as not having them at all.
There was a problem hiding this comment.
I can change but it's already under instrumentation package so the import path would become opentelemetry.instrumentation.instrumentation_propagator which seems redundant and causes unnecessary stutter.
There was a problem hiding this comment.
What I mean is that using back here is confusing. This is a propagator that is associated with instrumentation, right?
There was a problem hiding this comment.
What do you think about keeping these get and set methods, @owais?
There was a problem hiding this comment.
@ocelotl not necessarily, its called back propagator because it injects context into the response headers to propagate context backward to the caller. I think Owais has added it to the instrumentation package just because its a convenient place that instrumentation packages already have access to. Eventually, we would move this to opentelemetry-api
There was a problem hiding this comment.
And I believe the get/set are added here to keep a similar API to set_global_textmap(), set_tracer_provider() etc. ?
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Outdated
Show resolved
Hide resolved
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Show resolved
Hide resolved
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Outdated
Show resolved
Hide resolved
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Outdated
Show resolved
Hide resolved
| class TraceResponsePropagator: | ||
| """Experimental propagator that injects tracecontext into HTTP responses.""" | ||
|
|
||
| _HEADER_NAME = "traceresponse" |
There was a problem hiding this comment.
Nit: this is a class attribute, not a module-level constant, it should be lower cased.
|
|
||
| _HEADER_NAME = "traceresponse" | ||
|
|
||
| def _format_header(self, span_context): # pylint: disable=no-self-use |
There was a problem hiding this comment.
I would suggest to handle this with an ABC and static and abstract methods:
from abc import ABC, abstractmethod
class Parent(ABC):
@staticmethod
@abstractmethod
def method(arg):
pass
class Child(Parent):
@staticmethod
def method(arg):
print(arg)
Child().method(4)
class Child(Parent):
@staticmethod
def mathod(arg):
print(arg)
Child().mathod(4)4
Traceback (most recent call last):
File "tato.py", line 26, in <module>
Child().mathod(4)
TypeError: Can't instantiate abstract class Child with abstract methods method
d502b0f to
cb5c78b
Compare
092dcf3 to
e23dec1
Compare
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Outdated
Show resolved
Hide resolved
| _BACK_PROPAGATOR = None | ||
|
|
||
|
|
||
| def get_global_back_propagator(): |
There was a problem hiding this comment.
What I mean is that using back here is confusing. This is a propagator that is associated with instrumentation, right?
| _BACK_PROPAGATOR = None | ||
|
|
||
|
|
||
| def get_global_back_propagator(): |
There was a problem hiding this comment.
What do you think about keeping these get and set methods, @owais?
|
|
||
|
|
||
| class ResponsePropagator(ABC): | ||
| @abstractmethod |
There was a problem hiding this comment.
This feels like a class attribute actually. If you want to still use a method to access it, it should be a property:
class Parent:
_the_attribute = None
@property
def _attribute(self):
return self._the_attribute
class Child(Parent):
_the_attribute = "child_attribute"
print(Child()._attribute)There was a problem hiding this comment.
OK. Will make the change shortly.
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Outdated
Show resolved
Hide resolved
| def _format_header( | ||
| self, span_context | ||
| ) -> str: # pylint: disable=no-self-use | ||
| return 'traceparent;desc="00-{trace_id}-{span_id}-{:02x}"'.format( |
You're right. Even this implementation is calling it either "back propagator" or "response propagator". Agree we should pick one. I don't have a strong preference. Which one do you suggest to use? @ocelotl |
They kind of are. In the sense that only instrumentation is using them today and we don't document them for users but technically it's not tried to instrumentations at all. Users can use it in their manual code just like regular propagators. |
I prefer response, it is more specific. |
I mean the |
73a603b to
af7aa98
Compare
@ocelotl Ah. I feel the functions are much more nicer to use and are consistent with how other global objects are set by API (provider, propagators). I don't think they really add any harm. I can add some type checking or safety later if you'd like. |
opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
Outdated
Show resolved
Hide resolved
1eb8c0d to
7fba05a
Compare
bf0c681 to
880becc
Compare
ocelotl
left a comment
There was a problem hiding this comment.
This should work, approving. Just a question remains regarding ABCs and extract.
| self._func(carrier, key, value) | ||
|
|
||
|
|
||
| class ResponsePropagator(ABC): |
There was a problem hiding this comment.
Approving, but just a question: don't we have already an ABC for propagators? I understand that these are "back" propagators (and they propagate in only one way, if I understand correctly), but may there be any situation where extract also needs to be defined?
There was a problem hiding this comment.
These are generally for web servers to respond with. May be someone uses Python compiled to JS in browser extract would be helpful. For any other type of client, the client is in full control and can start a trace before sending requests out. Only JS in browser is unable to do that as browser starts first request with JS having no control over it.
But questions like this is exactly why adding it as a propagator made more sense so we can flesh out how this should work in some time and may be provide other SIGs with a reference implementation and feedback for spec.
|
@ocelotl |
| _RESPONSE_PROPAGATOR = propagator | ||
|
|
||
|
|
||
| class DictHeaderSetter: |
There was a problem hiding this comment.
Similarly to normal propagators, shouldn't Setter be an ABC so others can create their own Setter s?
| default_setter = DictHeaderSetter() | ||
|
|
||
|
|
||
| class FuncSetter: |
There was a problem hiding this comment.
Can we get some guidance (maybe some comments) on when FuncSetter should be used vs Setter?
There was a problem hiding this comment.
Added doc string that describes intention and usage.
05973b7 to
879aba3
Compare
The experimental back propagators inject trace response headers into HTTP responses. These are meant to be used by instrumentations and are not considered stable.
879aba3 to
18f8ac2
Compare
18f8ac2 to
8565c64
Compare
Description
The experimental back propagators inject trace response headers into
HTTP responses. These are meant to be used by instrumentations and are
not considered stable.
Contrib PRs that need this feature: open-telemetry/opentelemetry-python-contrib#436
Type of change
Please delete options that are not relevant.
How Has This Been Tested?
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration
Checklist: