Skip to content

Commit 6d81b45

Browse files
committed
ZO-1629: Work around NonRecordingSpan opentelemetry bug
AFAICT otel violates its own API here, should use get_span_context() instead: File "opentelemetry/instrumentation/utils.py", line 160, in _generate_opentelemetry_traceparent _span_id = trace.format_span_id(span.context.span_id) AttributeError: 'NonRecordingSpan' object has no attribute 'context' I'm backporting open-telemetry/opentelemetry-python-contrib#1200 which sidesteps the issue by using propagate to generate the traceparent header instead of doing it manually.
1 parent f614eae commit 6d81b45

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

core/docs/changelog/ZO-1629.change

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ZO-1629: Work around NonRecordingSpan opentelemetry bug

core/src/zeit/connector/postgresql.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from google.cloud.storage.retry import DEFAULT_RETRY
55
from io import BytesIO, StringIO
66
from logging import getLogger
7+
from opentelemetry.trace.propagation import tracecontext
78
from operator import itemgetter
89
from sqlalchemy import Boolean, TIMESTAMP, Unicode, UnicodeText
910
from sqlalchemy import Column, ForeignKey, select
@@ -18,6 +19,7 @@
1819
from zeit.connector.resource import CachedResource
1920
import collections
2021
import opentelemetry.instrumentation.sqlalchemy
22+
import opentelemetry.instrumentation.utils
2123
import os
2224
import os.path
2325
import sqlalchemy
@@ -66,8 +68,7 @@ def __init__(self, dsn, storage_project, storage_bucket,
6668
self.session = sqlalchemy.orm.scoped_session(
6769
sqlalchemy.orm.sessionmaker(bind=self.engine, future=True))
6870
zope.sqlalchemy.register(self.session)
69-
EngineTracer(zeit.cms.tracing.default_tracer(),
70-
self.engine, enable_commenter=True)
71+
EngineTracer(zeit.cms.tracing.default_tracer(), self.engine)
7172
self.gcs_client = storage.Client(project=storage_project)
7273
self.bucket = self.gcs_client.bucket(storage_bucket)
7374

@@ -448,4 +449,15 @@ def _before_cur_exec(
448449
for k, v in params.items():
449450
p.write('%s=%r\n' % (k, str(v)[:100]))
450451
context._otel_span.set_attribute('db.parameters', p.getvalue())
452+
# XXX We bypass enable_commenter in superclass, until
453+
# opentelemetry-python-contrib#1200 is released.
454+
statement += self._generate_comment()
451455
return statement, params
456+
457+
propagator = tracecontext.TraceContextTextMapPropagator()
458+
459+
def _generate_comment(self):
460+
meta = {}
461+
self.propagator.inject(meta)
462+
return opentelemetry.instrumentation.utils._generate_sql_comment(
463+
**meta)

0 commit comments

Comments
 (0)