opentelemetry-instrumentation-botocore 0.51b0__tar.gz → 0.52b1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/PKG-INFO +4 -4
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/pyproject.toml +3 -3
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/__init__.py +146 -12
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/extensions/__init__.py +4 -0
- opentelemetry_instrumentation_botocore-0.52b1/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py +756 -0
- opentelemetry_instrumentation_botocore-0.52b1/src/opentelemetry/instrumentation/botocore/extensions/bedrock_utils.py +514 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/extensions/dynamodb.py +10 -2
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/extensions/lmbd.py +4 -1
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/extensions/sns.py +15 -13
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/extensions/sqs.py +7 -1
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/extensions/types.py +53 -4
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/version.py +1 -1
- opentelemetry_instrumentation_botocore-0.52b1/tests/README.md +11 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/bedrock_utils.py +165 -1
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_no_content.yaml +83 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_no_content_different_events.yaml +96 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_handles_event_stream_error.yaml +78 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_no_content.yaml +80 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_no_content_different_events.yaml +102 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_no_content_tool_call.yaml +615 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_with_content.yaml +77 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_with_content_different_events.yaml +105 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_with_content_tool_call.yaml +626 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_stream_with_invalid_model.yaml +57 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_tool_call_no_content.yaml +269 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_tool_call_with_content.yaml +269 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_with_content.yaml +81 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_with_content_different_events.yaml +96 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_converse_with_invalid_model.yaml +57 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_no_content[amazon.nova].yaml +91 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_no_content[amazon.titan].yaml +67 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_no_content[anthropic.claude].yaml +84 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_no_content_different_events[amazon.nova].yaml +107 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_no_content_different_events[anthropic.claude].yaml +98 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_no_content_tool_call.yaml +248 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_content[amazon.nova].yaml +83 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_content[amazon.titan].yaml +65 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_content[anthropic.claude].yaml +82 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_content_different_events[amazon.nova].yaml +107 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_content_different_events[anthropic.claude].yaml +98 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_content_tool_call.yaml +248 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_content_user_content_as_string.yaml +74 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_invalid_model.yaml +43 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/cassettes/test_invoke_model_with_response_stream_handles_stream_error.yaml +24 -23
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_invalid_model.yaml +43 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.nova].yaml +158 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.titan].yaml +64 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_no_content[anthropic.claude].yaml +138 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[amazon.nova].yaml +175 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[anthropic.claude].yaml +123 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_no_content_tool_call.yaml +468 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_with_content[amazon.nova].yaml +154 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_with_content[amazon.titan].yaml +63 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_with_content[anthropic.claude].yaml +132 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[amazon.nova].yaml +173 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[anthropic.claude].yaml +124 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/cassettes/test_invoke_model_with_response_stream_with_content_tool_call.yaml +473 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/conftest.py +229 -0
- opentelemetry_instrumentation_botocore-0.52b1/tests/test_botocore_bedrock.py +2521 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/test_botocore_dynamodb.py +7 -2
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/test_botocore_sns.py +9 -9
- opentelemetry_instrumentation_botocore-0.51b0/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py +0 -396
- opentelemetry_instrumentation_botocore-0.51b0/src/opentelemetry/instrumentation/botocore/extensions/bedrock_utils.py +0 -222
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_converse_stream_handles_event_stream_error.yaml +0 -71
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_converse_stream_with_content.yaml +0 -69
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_converse_stream_with_invalid_model.yaml +0 -54
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_converse_with_content.yaml +0 -55
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_converse_with_invalid_model.yaml +0 -54
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_content[amazon.nova].yaml +0 -58
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_content[amazon.titan].yaml +0 -57
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_content[anthropic.claude].yaml +0 -58
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_invalid_model.yaml +0 -51
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_response_stream_invalid_model.yaml +0 -51
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_response_stream_with_content[amazon.nova].yaml +0 -144
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_response_stream_with_content[amazon.titan].yaml +0 -61
- opentelemetry_instrumentation_botocore-0.51b0/tests/cassettes/test_invoke_model_with_response_stream_with_content[anthropic.claude].yaml +0 -124
- opentelemetry_instrumentation_botocore-0.51b0/tests/conftest.py +0 -121
- opentelemetry_instrumentation_botocore-0.51b0/tests/test_botocore_bedrock.py +0 -553
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/.gitignore +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/LICENSE +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/README.rst +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/environment_variables.py +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/extensions/_messaging.py +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/src/opentelemetry/instrumentation/botocore/package.py +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/__init__.py +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/test_botocore_instrumentation.py +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/test_botocore_lambda.py +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/test_botocore_messaging.py +0 -0
- {opentelemetry_instrumentation_botocore-0.51b0 → opentelemetry_instrumentation_botocore-0.52b1}/tests/test_botocore_sqs.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: opentelemetry-instrumentation-botocore
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.52b1
|
4
4
|
Summary: OpenTelemetry Botocore instrumentation
|
5
5
|
Project-URL: Homepage, https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-botocore
|
6
6
|
Project-URL: Repository, https://github.com/open-telemetry/opentelemetry-python-contrib
|
@@ -19,10 +19,10 @@ Classifier: Programming Language :: Python :: 3.11
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.12
|
20
20
|
Classifier: Programming Language :: Python :: 3.13
|
21
21
|
Requires-Python: >=3.8
|
22
|
-
Requires-Dist: opentelemetry-api~=1.
|
23
|
-
Requires-Dist: opentelemetry-instrumentation==0.
|
22
|
+
Requires-Dist: opentelemetry-api~=1.30
|
23
|
+
Requires-Dist: opentelemetry-instrumentation==0.52b1
|
24
24
|
Requires-Dist: opentelemetry-propagator-aws-xray~=1.0
|
25
|
-
Requires-Dist: opentelemetry-semantic-conventions==0.
|
25
|
+
Requires-Dist: opentelemetry-semantic-conventions==0.52b1
|
26
26
|
Provides-Extra: instruments
|
27
27
|
Requires-Dist: botocore~=1.0; extra == 'instruments'
|
28
28
|
Description-Content-Type: text/x-rst
|
@@ -26,9 +26,9 @@ classifiers = [
|
|
26
26
|
"Programming Language :: Python :: 3.13",
|
27
27
|
]
|
28
28
|
dependencies = [
|
29
|
-
"opentelemetry-api ~= 1.
|
30
|
-
"opentelemetry-instrumentation == 0.
|
31
|
-
"opentelemetry-semantic-conventions == 0.
|
29
|
+
"opentelemetry-api ~= 1.30",
|
30
|
+
"opentelemetry-instrumentation == 0.52b1",
|
31
|
+
"opentelemetry-semantic-conventions == 0.52b1",
|
32
32
|
"opentelemetry-propagator-aws-xray ~= 1.0",
|
33
33
|
]
|
34
34
|
|
@@ -76,6 +76,38 @@ for example:
|
|
76
76
|
)
|
77
77
|
ec2 = self.session.create_client("ec2", region_name="us-west-2")
|
78
78
|
ec2.describe_instances()
|
79
|
+
|
80
|
+
Extensions
|
81
|
+
----------
|
82
|
+
|
83
|
+
The instrumentation supports creating extensions for AWS services for enriching what is collected. We have extensions
|
84
|
+
for the following AWS services:
|
85
|
+
|
86
|
+
- Bedrock Runtime
|
87
|
+
- DynamoDB
|
88
|
+
- Lambda
|
89
|
+
- SNS
|
90
|
+
- SQS
|
91
|
+
|
92
|
+
Bedrock Runtime
|
93
|
+
***************
|
94
|
+
|
95
|
+
This extension implements the GenAI semantic conventions for the following API calls:
|
96
|
+
|
97
|
+
- Converse
|
98
|
+
- ConverseStream
|
99
|
+
- InvokeModel
|
100
|
+
- InvokeModelWithResponseStream
|
101
|
+
|
102
|
+
For the Converse and ConverseStream APIs tracing, events and metrics are implemented.
|
103
|
+
|
104
|
+
For the InvokeModel and InvokeModelWithResponseStream APIs tracing, events and metrics implemented only for a subset of
|
105
|
+
the available models, namely:
|
106
|
+
- Amazon Titan models
|
107
|
+
- Amazon Nova models
|
108
|
+
- Anthropic Claude
|
109
|
+
|
110
|
+
There is no support for tool calls with Amazon Models for the InvokeModel and InvokeModelWithResponseStream APIs.
|
79
111
|
"""
|
80
112
|
|
81
113
|
import logging
|
@@ -86,9 +118,15 @@ from botocore.endpoint import Endpoint
|
|
86
118
|
from botocore.exceptions import ClientError
|
87
119
|
from wrapt import wrap_function_wrapper
|
88
120
|
|
89
|
-
from opentelemetry.
|
121
|
+
from opentelemetry._events import get_event_logger
|
122
|
+
from opentelemetry.instrumentation.botocore.extensions import (
|
123
|
+
_find_extension,
|
124
|
+
_has_extension,
|
125
|
+
)
|
90
126
|
from opentelemetry.instrumentation.botocore.extensions.types import (
|
91
127
|
_AwsSdkCallContext,
|
128
|
+
_AwsSdkExtension,
|
129
|
+
_BotocoreInstrumentorContext,
|
92
130
|
)
|
93
131
|
from opentelemetry.instrumentation.botocore.package import _instruments
|
94
132
|
from opentelemetry.instrumentation.botocore.version import __version__
|
@@ -98,6 +136,7 @@ from opentelemetry.instrumentation.utils import (
|
|
98
136
|
suppress_http_instrumentation,
|
99
137
|
unwrap,
|
100
138
|
)
|
139
|
+
from opentelemetry.metrics import Instrument, Meter, get_meter
|
101
140
|
from opentelemetry.propagators.aws.aws_xray_propagator import AwsXRayPropagator
|
102
141
|
from opentelemetry.semconv.trace import SpanAttributes
|
103
142
|
from opentelemetry.trace import get_tracer
|
@@ -123,12 +162,15 @@ class BotocoreInstrumentor(BaseInstrumentor):
|
|
123
162
|
|
124
163
|
def _instrument(self, **kwargs):
|
125
164
|
# pylint: disable=attribute-defined-outside-init
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
165
|
+
|
166
|
+
# tracers are lazy initialized per-extension in _get_tracer
|
167
|
+
self._tracers = {}
|
168
|
+
# event_loggers are lazy initialized per-extension in _get_event_logger
|
169
|
+
self._event_loggers = {}
|
170
|
+
# meters are lazy initialized per-extension in _get_meter
|
171
|
+
self._meters = {}
|
172
|
+
# metrics are lazy initialized per-extension in _get_metrics
|
173
|
+
self._metrics: Dict[str, Dict[str, Instrument]] = {}
|
132
174
|
|
133
175
|
self.request_hook = kwargs.get("request_hook")
|
134
176
|
self.response_hook = kwargs.get("response_hook")
|
@@ -137,6 +179,10 @@ class BotocoreInstrumentor(BaseInstrumentor):
|
|
137
179
|
if propagator is not None:
|
138
180
|
self.propagator = propagator
|
139
181
|
|
182
|
+
self.tracer_provider = kwargs.get("tracer_provider")
|
183
|
+
self.event_logger_provider = kwargs.get("event_logger_provider")
|
184
|
+
self.meter_provider = kwargs.get("meter_provider")
|
185
|
+
|
140
186
|
wrap_function_wrapper(
|
141
187
|
"botocore.client",
|
142
188
|
"BaseClient._make_api_call",
|
@@ -149,6 +195,82 @@ class BotocoreInstrumentor(BaseInstrumentor):
|
|
149
195
|
self._patched_endpoint_prepare_request,
|
150
196
|
)
|
151
197
|
|
198
|
+
@staticmethod
|
199
|
+
def _get_instrumentation_name(extension: _AwsSdkExtension) -> str:
|
200
|
+
has_extension = _has_extension(extension._call_context)
|
201
|
+
return (
|
202
|
+
f"{__name__}.{extension._call_context.service}"
|
203
|
+
if has_extension
|
204
|
+
else __name__
|
205
|
+
)
|
206
|
+
|
207
|
+
def _get_tracer(self, extension: _AwsSdkExtension):
|
208
|
+
"""This is a multiplexer in order to have a tracer per extension"""
|
209
|
+
|
210
|
+
instrumentation_name = self._get_instrumentation_name(extension)
|
211
|
+
tracer = self._tracers.get(instrumentation_name)
|
212
|
+
if tracer:
|
213
|
+
return tracer
|
214
|
+
|
215
|
+
schema_version = extension.tracer_schema_version()
|
216
|
+
self._tracers[instrumentation_name] = get_tracer(
|
217
|
+
instrumentation_name,
|
218
|
+
__version__,
|
219
|
+
self.tracer_provider,
|
220
|
+
schema_url=f"https://opentelemetry.io/schemas/{schema_version}",
|
221
|
+
)
|
222
|
+
return self._tracers[instrumentation_name]
|
223
|
+
|
224
|
+
def _get_event_logger(self, extension: _AwsSdkExtension):
|
225
|
+
"""This is a multiplexer in order to have an event logger per extension"""
|
226
|
+
|
227
|
+
instrumentation_name = self._get_instrumentation_name(extension)
|
228
|
+
event_logger = self._event_loggers.get(instrumentation_name)
|
229
|
+
if event_logger:
|
230
|
+
return event_logger
|
231
|
+
|
232
|
+
schema_version = extension.event_logger_schema_version()
|
233
|
+
self._event_loggers[instrumentation_name] = get_event_logger(
|
234
|
+
instrumentation_name,
|
235
|
+
"",
|
236
|
+
schema_url=f"https://opentelemetry.io/schemas/{schema_version}",
|
237
|
+
event_logger_provider=self.event_logger_provider,
|
238
|
+
)
|
239
|
+
|
240
|
+
return self._event_loggers[instrumentation_name]
|
241
|
+
|
242
|
+
def _get_meter(self, extension: _AwsSdkExtension):
|
243
|
+
"""This is a multiplexer in order to have a meter per extension"""
|
244
|
+
|
245
|
+
instrumentation_name = self._get_instrumentation_name(extension)
|
246
|
+
meter = self._meters.get(instrumentation_name)
|
247
|
+
if meter:
|
248
|
+
return meter
|
249
|
+
|
250
|
+
schema_version = extension.meter_schema_version()
|
251
|
+
self._meters[instrumentation_name] = get_meter(
|
252
|
+
instrumentation_name,
|
253
|
+
"",
|
254
|
+
schema_url=f"https://opentelemetry.io/schemas/{schema_version}",
|
255
|
+
meter_provider=self.meter_provider,
|
256
|
+
)
|
257
|
+
|
258
|
+
return self._meters[instrumentation_name]
|
259
|
+
|
260
|
+
def _get_metrics(
|
261
|
+
self, extension: _AwsSdkExtension, meter: Meter
|
262
|
+
) -> Dict[str, Instrument]:
|
263
|
+
"""This is a multiplexer for lazy initialization of metrics required by extensions"""
|
264
|
+
instrumentation_name = self._get_instrumentation_name(extension)
|
265
|
+
metrics = self._metrics.get(instrumentation_name)
|
266
|
+
if metrics is not None:
|
267
|
+
return metrics
|
268
|
+
|
269
|
+
self._metrics.setdefault(instrumentation_name, {})
|
270
|
+
metrics = self._metrics[instrumentation_name]
|
271
|
+
_safe_invoke(extension.setup_metrics, meter, metrics)
|
272
|
+
return metrics
|
273
|
+
|
152
274
|
def _uninstrument(self, **kwargs):
|
153
275
|
unwrap(BaseClient, "_make_api_call")
|
154
276
|
unwrap(Endpoint, "prepare_request")
|
@@ -190,7 +312,15 @@ class BotocoreInstrumentor(BaseInstrumentor):
|
|
190
312
|
_safe_invoke(extension.extract_attributes, attributes)
|
191
313
|
end_span_on_exit = extension.should_end_span_on_exit()
|
192
314
|
|
193
|
-
|
315
|
+
tracer = self._get_tracer(extension)
|
316
|
+
event_logger = self._get_event_logger(extension)
|
317
|
+
meter = self._get_meter(extension)
|
318
|
+
metrics = self._get_metrics(extension, meter)
|
319
|
+
instrumentor_ctx = _BotocoreInstrumentorContext(
|
320
|
+
event_logger=event_logger,
|
321
|
+
metrics=metrics,
|
322
|
+
)
|
323
|
+
with tracer.start_as_current_span(
|
194
324
|
call_context.span_name,
|
195
325
|
kind=call_context.span_kind,
|
196
326
|
attributes=attributes,
|
@@ -198,7 +328,7 @@ class BotocoreInstrumentor(BaseInstrumentor):
|
|
198
328
|
# at a later time after the stream has been consumed
|
199
329
|
end_on_exit=end_span_on_exit,
|
200
330
|
) as span:
|
201
|
-
_safe_invoke(extension.before_service_call, span)
|
331
|
+
_safe_invoke(extension.before_service_call, span, instrumentor_ctx)
|
202
332
|
self._call_request_hook(span, call_context)
|
203
333
|
|
204
334
|
try:
|
@@ -209,12 +339,16 @@ class BotocoreInstrumentor(BaseInstrumentor):
|
|
209
339
|
except ClientError as error:
|
210
340
|
result = getattr(error, "response", None)
|
211
341
|
_apply_response_attributes(span, result)
|
212
|
-
_safe_invoke(
|
342
|
+
_safe_invoke(
|
343
|
+
extension.on_error, span, error, instrumentor_ctx
|
344
|
+
)
|
213
345
|
raise
|
214
346
|
_apply_response_attributes(span, result)
|
215
|
-
_safe_invoke(
|
347
|
+
_safe_invoke(
|
348
|
+
extension.on_success, span, result, instrumentor_ctx
|
349
|
+
)
|
216
350
|
finally:
|
217
|
-
_safe_invoke(extension.after_service_call)
|
351
|
+
_safe_invoke(extension.after_service_call, instrumentor_ctx)
|
218
352
|
self._call_response_hook(span, call_context, result)
|
219
353
|
|
220
354
|
return result
|
@@ -40,6 +40,10 @@ _KNOWN_EXTENSIONS = {
|
|
40
40
|
}
|
41
41
|
|
42
42
|
|
43
|
+
def _has_extension(call_context: _AwsSdkCallContext) -> bool:
|
44
|
+
return call_context.service in _KNOWN_EXTENSIONS
|
45
|
+
|
46
|
+
|
43
47
|
def _find_extension(call_context: _AwsSdkCallContext) -> _AwsSdkExtension:
|
44
48
|
try:
|
45
49
|
loader = _KNOWN_EXTENSIONS.get(call_context.service)
|