mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-07-30 05:32:30 +08:00
Merge pull request #116 from NathanielRN/move-instrumentation-requests
Move instrumentation requests
This commit is contained in:
@ -2,6 +2,13 @@
|
||||
|
||||
## Unreleased
|
||||
|
||||
## Version 0.15b0
|
||||
|
||||
Released 2020-11-02
|
||||
|
||||
- Add support for tracking http metrics
|
||||
([#1230](https://github.com/open-telemetry/opentelemetry-python/pull/1230))
|
||||
|
||||
## Version 0.13b0
|
||||
|
||||
Released 2020-09-17
|
||||
@ -10,7 +17,7 @@ Released 2020-09-17
|
||||
([#1040](https://github.com/open-telemetry/opentelemetry-python/pull/1040))
|
||||
- Drop support for Python 3.4
|
||||
([#1099](https://github.com/open-telemetry/opentelemetry-python/pull/1099))
|
||||
- Add support for tracking http metrics
|
||||
- Add support for http metrics
|
||||
([#1116](https://github.com/open-telemetry/opentelemetry-python/pull/1116))
|
||||
|
||||
## Version 0.12b0
|
||||
|
@ -39,13 +39,13 @@ package_dir=
|
||||
=src
|
||||
packages=find_namespace:
|
||||
install_requires =
|
||||
opentelemetry-api == 0.15.dev0
|
||||
opentelemetry-instrumentation == 0.15.dev0
|
||||
opentelemetry-api == 0.15b0
|
||||
opentelemetry-instrumentation == 0.15b0
|
||||
requests ~= 2.0
|
||||
|
||||
[options.extras_require]
|
||||
test =
|
||||
opentelemetry-test == 0.15.dev0
|
||||
opentelemetry-test == 0.15b0
|
||||
httpretty ~= 1.0
|
||||
|
||||
[options.packages.find]
|
||||
|
@ -49,12 +49,12 @@ from opentelemetry.instrumentation.metric import (
|
||||
MetricMixin,
|
||||
)
|
||||
from opentelemetry.instrumentation.requests.version import __version__
|
||||
from opentelemetry.instrumentation.utils import http_status_to_canonical_code
|
||||
from opentelemetry.instrumentation.utils import http_status_to_status_code
|
||||
from opentelemetry.trace import SpanKind, get_tracer
|
||||
from opentelemetry.trace.status import (
|
||||
EXCEPTION_STATUS_FIELD,
|
||||
Status,
|
||||
StatusCanonicalCode,
|
||||
StatusCode,
|
||||
)
|
||||
|
||||
# A key to a context variable to avoid creating duplicate spans when instrumenting
|
||||
@ -155,9 +155,7 @@ def _instrument(tracer_provider=None, span_callback=None):
|
||||
except Exception as exc: # pylint: disable=W0703
|
||||
exception = exc
|
||||
setattr(
|
||||
exception,
|
||||
EXCEPTION_STATUS_FIELD,
|
||||
_exception_to_canonical_code(exception),
|
||||
exception, EXCEPTION_STATUS_FIELD, StatusCode.ERROR,
|
||||
)
|
||||
result = getattr(exc, "response", None)
|
||||
finally:
|
||||
@ -171,9 +169,7 @@ def _instrument(tracer_provider=None, span_callback=None):
|
||||
span.set_attribute("http.status_text", result.reason)
|
||||
span.set_status(
|
||||
Status(
|
||||
http_status_to_canonical_code(
|
||||
result.status_code
|
||||
)
|
||||
http_status_to_status_code(result.status_code)
|
||||
)
|
||||
)
|
||||
labels["http.status_code"] = str(result.status_code)
|
||||
@ -221,17 +217,6 @@ def _uninstrument_from(instr_root, restore_as_bound_func=False):
|
||||
setattr(instr_root, instr_func_name, original)
|
||||
|
||||
|
||||
def _exception_to_canonical_code(exc: Exception) -> StatusCanonicalCode:
|
||||
if isinstance(
|
||||
exc,
|
||||
(InvalidURL, InvalidSchema, MissingSchema, URLRequired, ValueError),
|
||||
):
|
||||
return StatusCanonicalCode.INVALID_ARGUMENT
|
||||
if isinstance(exc, Timeout):
|
||||
return StatusCanonicalCode.DEADLINE_EXCEEDED
|
||||
return StatusCanonicalCode.UNKNOWN
|
||||
|
||||
|
||||
class RequestsInstrumentor(BaseInstrumentor, MetricMixin):
|
||||
"""An instrumentor for requests
|
||||
See `BaseInstrumentor`
|
||||
|
@ -12,4 +12,4 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
__version__ = "0.15.dev0"
|
||||
__version__ = "0.15b0"
|
||||
|
@ -25,7 +25,7 @@ from opentelemetry.sdk import resources
|
||||
from opentelemetry.sdk.util import get_dict_as_key
|
||||
from opentelemetry.test.mock_textmap import MockTextMapPropagator
|
||||
from opentelemetry.test.test_base import TestBase
|
||||
from opentelemetry.trace.status import StatusCanonicalCode
|
||||
from opentelemetry.trace.status import StatusCode
|
||||
|
||||
|
||||
class RequestsIntegrationTestBase(abc.ABC):
|
||||
@ -81,9 +81,7 @@ class RequestsIntegrationTestBase(abc.ABC):
|
||||
},
|
||||
)
|
||||
|
||||
self.assertIs(
|
||||
span.status.canonical_code, trace.status.StatusCanonicalCode.OK
|
||||
)
|
||||
self.assertIs(span.status.status_code, trace.status.StatusCode.UNSET)
|
||||
|
||||
self.check_span_instrumentation_info(
|
||||
span, opentelemetry.instrumentation.requests
|
||||
@ -123,8 +121,7 @@ class RequestsIntegrationTestBase(abc.ABC):
|
||||
self.assertEqual(span.attributes.get("http.status_text"), "Not Found")
|
||||
|
||||
self.assertIs(
|
||||
span.status.canonical_code,
|
||||
trace.status.StatusCanonicalCode.NOT_FOUND,
|
||||
span.status.status_code, trace.status.StatusCode.ERROR,
|
||||
)
|
||||
|
||||
def test_uninstrument(self):
|
||||
@ -263,9 +260,7 @@ class RequestsIntegrationTestBase(abc.ABC):
|
||||
span.attributes,
|
||||
{"component": "http", "http.method": "GET", "http.url": self.URL},
|
||||
)
|
||||
self.assertEqual(
|
||||
span.status.canonical_code, StatusCanonicalCode.UNKNOWN
|
||||
)
|
||||
self.assertEqual(span.status.status_code, StatusCode.ERROR)
|
||||
|
||||
self.assertIsNotNone(RequestsInstrumentor().meter)
|
||||
self.assertEqual(len(RequestsInstrumentor().meter.metrics), 1)
|
||||
@ -307,9 +302,7 @@ class RequestsIntegrationTestBase(abc.ABC):
|
||||
"http.status_text": "Internal Server Error",
|
||||
},
|
||||
)
|
||||
self.assertEqual(
|
||||
span.status.canonical_code, StatusCanonicalCode.INTERNAL
|
||||
)
|
||||
self.assertEqual(span.status.status_code, StatusCode.ERROR)
|
||||
self.assertIsNotNone(RequestsInstrumentor().meter)
|
||||
self.assertEqual(len(RequestsInstrumentor().meter.metrics), 1)
|
||||
recorder = RequestsInstrumentor().meter.metrics.pop()
|
||||
@ -334,9 +327,7 @@ class RequestsIntegrationTestBase(abc.ABC):
|
||||
self.perform_request(self.URL)
|
||||
|
||||
span = self.assert_span()
|
||||
self.assertEqual(
|
||||
span.status.canonical_code, StatusCanonicalCode.UNKNOWN
|
||||
)
|
||||
self.assertEqual(span.status.status_code, StatusCode.ERROR)
|
||||
|
||||
@mock.patch(
|
||||
"requests.adapters.HTTPAdapter.send", side_effect=requests.Timeout
|
||||
@ -346,9 +337,7 @@ class RequestsIntegrationTestBase(abc.ABC):
|
||||
self.perform_request(self.URL)
|
||||
|
||||
span = self.assert_span()
|
||||
self.assertEqual(
|
||||
span.status.canonical_code, StatusCanonicalCode.DEADLINE_EXCEEDED
|
||||
)
|
||||
self.assertEqual(span.status.status_code, StatusCode.ERROR)
|
||||
|
||||
|
||||
class TestRequestsIntegration(RequestsIntegrationTestBase, TestBase):
|
||||
@ -371,9 +360,7 @@ class TestRequestsIntegration(RequestsIntegrationTestBase, TestBase):
|
||||
span.attributes,
|
||||
{"component": "http", "http.method": "POST", "http.url": url},
|
||||
)
|
||||
self.assertEqual(
|
||||
span.status.canonical_code, StatusCanonicalCode.INVALID_ARGUMENT
|
||||
)
|
||||
self.assertEqual(span.status.status_code, StatusCode.ERROR)
|
||||
|
||||
def test_if_headers_equals_none(self):
|
||||
result = requests.get(self.URL, headers=None)
|
||||
|
Reference in New Issue
Block a user