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