i.e. something like this
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider, SpanProcessor
from opentelemetry.trace import Span
class InheritResourceProcessor(SpanProcessor):
def __init__(self, resource):
# freeze the resource attrs to avoid repeated lookups
self._attrs = dict(resource.attributes)
def on_start(self, span: Span, parent_context):
# only set if the span didn't override it
for k, v in self._attrs.items():
if span.attributes.get(k) is None:
span.set_attribute(k, v)
def on_end(self, span): pass
def shutdown(self): pass
def force_flush(self, timeout_millis: int = 30000): pass
resource = Resource.create({
"openinference.project.name": "my-proj",
"env": "prod",
"team": "llm-platform",
})
provider = TracerProvider(resource=resource)
provider.add_span_processor(InheritResourceProcessor(provider.resource))
# ... register provider, get tracer, create spans as usual