Skip to content

Commit 1a2fe33

Browse files
Add global_settings fallback in ES instrumentation (#1454)
* Fallback to global_settings in elasticsearch * Fallback to global_settings in graphql * Fixup: ruff lint --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent e6b1046 commit 1a2fe33

File tree

6 files changed

+76
-5
lines changed

6 files changed

+76
-5
lines changed

newrelic/api/datastore_trace.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from newrelic.api.time_trace import TimeTrace, current_trace
1818
from newrelic.common.async_wrapper import async_wrapper as get_async_wrapper
1919
from newrelic.common.object_wrapper import FunctionWrapper, wrap_object
20+
from newrelic.core.config import global_settings
2021
from newrelic.core.datastore_node import DatastoreNode
2122

2223

@@ -86,7 +87,8 @@ def __enter__(self):
8687
self.port_path_or_id = transaction._intern_string(self.port_path_or_id)
8788
self.database_name = transaction._intern_string(self.database_name)
8889

89-
datastore_tracer_settings = transaction.settings.datastore_tracer
90+
settings = transaction.settings or global_settings()
91+
datastore_tracer_settings = settings.datastore_tracer
9092
self.instance_reporting_enabled = datastore_tracer_settings.instance_reporting.enabled
9193
self.database_name_enabled = datastore_tracer_settings.database_name_reporting.enabled
9294
return result

newrelic/api/graphql_trace.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from newrelic.api.transaction import current_transaction
1919
from newrelic.common.async_wrapper import async_wrapper as get_async_wrapper
2020
from newrelic.common.object_wrapper import FunctionWrapper, wrap_object
21+
from newrelic.core.config import global_settings
2122
from newrelic.core.graphql_node import GraphQLOperationNode, GraphQLResolverNode
2223

2324

@@ -49,7 +50,7 @@ def formatted(self):
4950
transaction = current_transaction(active_only=False)
5051

5152
# Record SQL settings
52-
settings = transaction.settings
53+
settings = transaction.settings or global_settings()
5354
tt = settings.transaction_tracer
5455
self.graphql_format = tt.record_sql
5556

newrelic/hooks/datastore_elasticsearch.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from newrelic.api.transaction import current_transaction
1717
from newrelic.common.object_wrapper import function_wrapper, wrap_function_wrapper
1818
from newrelic.common.package_version_utils import get_package_version_tuple
19+
from newrelic.core.config import global_settings
1920

2021
# An index name can be a string, None or a sequence. In the case of None
2122
# an empty string or '*', it is the same as using '_all'. When a string
@@ -139,7 +140,8 @@ def _nr_wrapper_Elasticsearch_method_(wrapped, instance, args, kwargs):
139140
with trace:
140141
result = wrapped(*args, **kwargs)
141142

142-
tracer_settings = trace.settings.datastore_tracer
143+
settings = trace.settings or global_settings()
144+
tracer_settings = settings.datastore_tracer
143145

144146
if tracer_settings.instance_reporting.enabled:
145147
try:
@@ -182,7 +184,8 @@ async def _nr_wrapper_AsyncElasticsearch_method_(wrapped, instance, args, kwargs
182184
with trace:
183185
result = await wrapped(*args, **kwargs)
184186

185-
tracer_settings = trace.settings.datastore_tracer
187+
settings = trace.settings or global_settings()
188+
tracer_settings = settings.datastore_tracer
186189

187190
if tracer_settings.instance_reporting.enabled:
188191
try:
@@ -783,7 +786,8 @@ def _nr_get_connection_wrapper(wrapped, instance, args, kwargs):
783786

784787
host = port_path_or_id = "unknown"
785788
try:
786-
tracer_settings = trace.settings.datastore_tracer
789+
settings = trace.settings or global_settings()
790+
tracer_settings = settings.datastore_tracer
787791

788792
if tracer_settings.instance_reporting.enabled:
789793
host, port_path_or_id = conn._nr_host_port

tests/datastore_elasticsearch/test_async_elasticsearch.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from testing_support.validators.validate_transaction_metrics import validate_transaction_metrics
2121

2222
from newrelic.api.background_task import background_task
23+
from newrelic.api.transaction import current_transaction
2324

2425
# Settings
2526

@@ -193,5 +194,24 @@ def test_async_elasticsearch_operation_enabled(async_client, loop):
193194
loop.run_until_complete(_exercise_es(async_client))
194195

195196

197+
@validate_transaction_errors(errors=[])
198+
@validate_transaction_metrics(
199+
"test_async_elasticsearch:test_async_elasticsearch_operation_enabled_empty_transaction_settings",
200+
scoped_metrics=_enable_scoped_metrics,
201+
rollup_metrics=_enable_rollup_metrics,
202+
background_task=True,
203+
)
204+
@override_application_settings(_enable_instance_settings)
205+
@background_task()
206+
def test_async_elasticsearch_operation_enabled_empty_transaction_settings(async_client, loop):
207+
transaction = current_transaction()
208+
settings = transaction._settings
209+
transaction._settings = None
210+
211+
loop.run_until_complete(_exercise_es(async_client))
212+
213+
transaction._settings = settings
214+
215+
196216
def test_async_elasticsearch_no_transaction(async_client, loop):
197217
loop.run_until_complete(_exercise_es(async_client))

tests/datastore_elasticsearch/test_elasticsearch.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from testing_support.validators.validate_transaction_metrics import validate_transaction_metrics
2121

2222
from newrelic.api.background_task import background_task
23+
from newrelic.api.transaction import current_transaction
2324

2425
# Settings
2526

@@ -189,5 +190,24 @@ def test_elasticsearch_operation_enabled(client):
189190
_exercise_es(client)
190191

191192

193+
@validate_transaction_errors(errors=[])
194+
@validate_transaction_metrics(
195+
"test_elasticsearch:test_elasticsearch_operation_enabled_empty_transaction_settings",
196+
scoped_metrics=_enable_scoped_metrics,
197+
rollup_metrics=_enable_rollup_metrics,
198+
background_task=True,
199+
)
200+
@override_application_settings(_enable_instance_settings)
201+
@background_task()
202+
def test_elasticsearch_operation_enabled_empty_transaction_settings(client):
203+
transaction = current_transaction()
204+
settings = transaction._settings
205+
transaction._settings = None
206+
207+
_exercise_es(client)
208+
209+
transaction._settings = settings
210+
211+
192212
def test_elasticsearch_no_transaction(client):
193213
_exercise_es(client)

tests/framework_graphql/test_application.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
from framework_graphql.test_application_async import error_middleware_async, example_middleware_async
2424
from newrelic.api.background_task import background_task
25+
from newrelic.api.transaction import current_transaction
2526
from newrelic.common.object_names import callable_name
2627
from newrelic.common.package_version_utils import get_package_version
2728

@@ -110,6 +111,29 @@ def _test():
110111
_test()
111112

112113

114+
def test_transaction_empty_settings(target_application):
115+
framework, version, target_application, is_bg, schema_type, extra_spans = target_application
116+
117+
@validate_transaction_metrics(
118+
"query/<anonymous>/hello",
119+
"GraphQL",
120+
rollup_metrics=_graphql_base_rollup_metrics(framework, version, True),
121+
background_task=True,
122+
)
123+
@background_task()
124+
def _test():
125+
transaction = current_transaction()
126+
settings = transaction._settings
127+
transaction._settings = None
128+
129+
response = target_application("{ hello }")
130+
assert response["hello"] == "Hello!"
131+
132+
transaction._settings = settings
133+
134+
_test()
135+
136+
113137
@dt_enabled
114138
def test_query_and_mutation(target_application):
115139
framework, version, target_application, is_bg, schema_type, extra_spans = target_application

0 commit comments

Comments
 (0)