# Instrument HTTP Requests | Sentry for Python

As a prerequisite to setting up [Requests](https://docs.sentry.io/product/insights/requests.md), you’ll need to first [set up tracing](https://docs.sentry.io/platforms/python/tracing.md). Once this is done, the Python SDK will automatically instrument outgoing HTTP requests made via `HTTPConnection` and show the data in the [requests-monitoring dashboard](https://sentry.io/orgredirect/organizations/:orgslug/insights/backend/http.md). If that doesn't fit your use case, you can set up using custom instrumentation described below.

## [Custom Instrumentation](https://docs.sentry.io/.md#custom-instrumentation)

For detailed information about which data can be set, see the [Requests Module developer specifications](https://develop.sentry.dev/sdk/performance/modules/requests.md).

### [Wrap HTTP Requests in a Span](https://docs.sentry.io/.md#wrap-http-requests-in-a-span)

NOTE: Refer to [HTTP Span Data Conventions](https://develop.sentry.dev/sdk/performance/span-data-conventions.md#http) for a full list of the span data attributes.

Here is an example of an instrumented function that makes HTTP requests:

```python
from urllib.parse import urlparse
import requests

def make_request(method, url):
    span = sentry_sdk.start_span(
        op="http.client",
        name="%s %s" % (method, url),
    )

    span.set_data("http.request.method", method)

    parsed_url = urlparse(url)
    span.set_data("url", url)
    span.set_data("server.address", parsed_url.hostname)
    span.set_data("server.port", parsed_url.port)

    response = requests.request(method=method, url=url)

    span.set_data("http.response.status_code", response.status_code)
    span.set_data("http.response_content_length", response.headers["content-length"])

    span.finish()

    return response
```
