snowflakedb / snowflake-connector-python

Snowflake Connector for Python
https://pypi.python.org/pypi/snowflake-connector-python/
Apache License 2.0
597 stars 473 forks source link

SNOW-1763555: OpenTelemetry integration utterly breaks driver if using DataDog #2084

Open lattwood opened 2 weeks ago

lattwood commented 2 weeks ago

Python version

N/A

Operating system and processor architecture

N/A

Installed packages

ddtrace
opentelemetry-api

What did you do?

I used the driver w/ Datadog APM, which installs the opentelemetry packages that are used as the check to see if we can inject trace context.

With DataDog, this gets happens on every query, and it fails to run.

This is because the only exception caught is ModuleNotFoundError, and opentracing is throwing a ValueError which isn't getting caught.

(please forgive any typos, I copied the backtrace from a screenshot)

ValueError: Propagator tracecontext not found. It is either misspelled or not installed.
  File "/var/task/lambda_function.py", line 116, in lambda_handler
    process_scan(
  File "/var/task/store.py", line 92, in process_scan
    upload_file_to_snowflake(cursor, secrets, file_name=sv_file, table=snowflake_table)
  File "/var/task/store.py", line 55, in upload_file_to_snowflake
    cursor.execute (
  File "/var/task/snowflake/connector/cursor.py", line 984, in execute
    ret = self._execute_helper(query, **kwargs)
  File "/var/task/snowflake/connector/cursor.py", line 695, in _execute_helper
    ret = self._connection.cmd_query(
  File "/var/task/snowflake/connector/connection.py", line 1350, in cd_query
    ret = self. rest. request(
  File "/var/task/snowflake/connector/network.py", line 483, in request
    from opentelemetry.propagate import inject
  File "<frozen importlib._bootstrap»", line 1176, in _find_and_load
  File "<frozen importlib._bootstrap»", line 1147, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap»", Line 690, in _load_unlocked
  File "/var/task/ddtrace/internal/module.py", line 295, in _exec_module
    self.loader.exec_module (module)
  File "/var/task/opentelemetry/propagate/__init__.py", line 149, in ‹module>
    raise ValueError(

What did you expect to see?

I would expect that opentelemetry integration would be done via this- https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation

and not via a hack in the actual library that breaks the driver for anyone that has opentelemetry installed but not in-use.

I hope that this issue results in that change being reverted, and the original requestor of the feature gets this done properly in the open-telemetry project.

Can you set logging to DEBUG and collect the logs?

We already have it at DEBUG and that's the problem.
lattwood commented 2 weeks ago

This was directly caused by #1989

lattwood commented 2 weeks ago

Aside- what kind of commit title is test?

image
lattwood commented 2 weeks ago

User has to import opentelemetry and configure it to have this. This code executes only if the import succeeds which requires user to import and configure opentelemetry.

specifically this is the erroneous assumption, there are many ways the import can fail.

schammah commented 3 days ago

affected by this as well any estimate to resolve?

fbexiga commented 3 days ago

Seems like a straightforward issue to fix... Can we get some eyes on this one? @sfc-gh-mkeller @sfc-gh-yuwang @sfc-gh-aling @sfc-gh-sghosh @sfc-gh-yixie @sfc-gh-aalam

sfc-gh-dszmolka commented 3 days ago

thanks folks for drawing attention to this, we'll take a look.

sfc-gh-bdrutu commented 1 day ago

Thanks for your bug report, this is very valuable input. Unfortunately, after further investigation this proves to be an issue specific to DataDog because by just including a clean opentelemetry-api dependency does not reproduce this problem, which means that what they include is not the "full" opentelemetry-api (see the fact that in opentelemetry-api the tracecontext is available see here and here and here(here you can see the exception being thrown).

This is still a problem that Snowflake can fix by catching all the exceptions there, though that is not the right way of writing code, since you cannot have a catch all exception every time you call any API that should not return an exception, but Snowflake will do it anyway since tracing should not break your data aplication.

lattwood commented 21 hours ago

@sfc-gh-bdrutu Based on what you've said, I've taken the liberty of opening an issue on the ddtrace-py repository- https://github.com/DataDog/dd-trace-py/issues/11407

bogdandrutu commented 20 hours ago

I would expect that opentelemetry integration would be done via this- https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation

and not via a hack in the actual library that breaks the driver for anyone that has opentelemetry installed but not in-use.

I hope that this issue results in that change being reverted, and the original requestor of the feature gets this done properly in the open-telemetry project.

Based on my experience with OpenTelemetry in different environments, OpenTelemetry was designed with flexibility in mind, supporting scenarios where telemetry is directly embedded within libraries, rather than requiring separate instrumentation libraries.

PaulBormanTR commented 19 hours ago

I'm facing this as well. Specifically, incompatible with https://github.com/DataDog/datadog-lambda-python/releases/tag/v6.99.0 Was this introduced by https://github.com/snowflakedb/snowflake-connector-python/commit/0d005199204a90082ec22b63008bb6e44500ec44?

lattwood commented 19 hours ago

@bogdandrutu you literally have the same bio on your two accounts.

Image Image

sfc-gh-mkeller commented 17 hours ago

Since I was unable to reproduce the issue I'd really like someone with the issue to test drive the change I proposed in #2106 . Please don't forget to let us know if it worked properly!