Merge pull request #116 from NathanielRN/move-instrumentation-requests

Move instrumentation requests
This commit is contained in:
alrex
2020-11-02 13:16:51 -08:00
committed by GitHub
5 changed files with 24 additions and 45 deletions

View File

@ -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

View File

@ -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]

View File

@ -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`

View File

@ -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"

View File

@ -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)