Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 3 additions & 9 deletions examples/tracing/templates/index.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<script src="https://browser.sentry-cdn.com/5.4.1/bundle.js" crossorigin="anonymous"></script>
<meta name="sentry-trace" content="{{ sentry_trace }}" />
Comment thread
BYK marked this conversation as resolved.
<script src="https://browser.sentry-cdn.com/6.17.7/bundle.js" crossorigin="anonymous"></script>
{{ sentry_trace }}
<!-- TODO: Replace with real tracing integration once it's fixed -->
<script src="/static/tracing.js" crossorigin="anonymous"></script>

Expand All @@ -14,14 +16,6 @@
debug: true
});

window.setTimeout(function() {
const scope = Sentry.getCurrentHub().getScope();
// TODO: Wait for Daniel's traceparent API
scope.setSpan(scope.getSpan().constructor.fromTraceparent(
"00-{{ traceparent['sentry-trace'].strip("-") }}-00"
));
});

async function compute() {
const res = await fetch(
"/compute/" +
Expand Down
20 changes: 20 additions & 0 deletions sentry_sdk/integrations/flask.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@

try:
from flask import ( # type: ignore
Markup,
Request,
Flask,
_request_ctx_stack,
_app_ctx_stack,
__version__ as FLASK_VERSION,
)
from flask.signals import (
before_render_template,
got_request_exception,
request_started,
)
Expand Down Expand Up @@ -77,6 +79,7 @@ def setup_once():
if version < (0, 10):
raise DidNotEnable("Flask 0.10 or newer is required.")

before_render_template.connect(_add_sentry_trace)
request_started.connect(_request_started)
got_request_exception.connect(_capture_exception)

Expand All @@ -94,6 +97,23 @@ def sentry_patched_wsgi_app(self, environ, start_response):
Flask.__call__ = sentry_patched_wsgi_app # type: ignore


def _add_sentry_trace(sender, template, context, **extra):
# type: (Flask, Any, Dict[str, Any], **Any) -> None

if "sentry_trace" in context:
return

sentry_span = Hub.current.scope.span
context["sentry_trace"] = (
Markup(
'<meta name="sentry-trace" content="%s" />'
% (sentry_span.to_traceparent(),)
)
if sentry_span
else ""
)


def _request_started(sender, **kwargs):
# type: (Flask, **Any) -> None
hub = Hub.current
Expand Down
42 changes: 40 additions & 2 deletions tests/integrations/flask/test_flask.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@

flask = pytest.importorskip("flask")

from flask import Flask, Response, request, abort, stream_with_context
from flask import (
Flask,
Response,
request,
abort,
stream_with_context,
render_template_string,
)
from flask.views import View

from flask_login import LoginManager, login_user
Expand Down Expand Up @@ -365,7 +372,7 @@ def index():
assert transaction_event["request"]["data"] == data


@pytest.mark.parametrize("input_char", [u"a", b"a"])
@pytest.mark.parametrize("input_char", ["a", b"a"])
def test_flask_too_large_raw_request(sentry_init, input_char, capture_events, app):
sentry_init(integrations=[flask_sentry.FlaskIntegration()], request_bodies="small")

Expand Down Expand Up @@ -737,3 +744,34 @@ def dispatch_request(self):

assert event["message"] == "hi"
assert event["transaction"] == "hello_class"


def test_sentry_trace_context(sentry_init, app, capture_events):
sentry_init(integrations=[flask_sentry.FlaskIntegration()])
events = capture_events()

@app.route("/")
def index():
sentry_span = Hub.current.scope.span
capture_message(sentry_span.to_traceparent())
return render_template_string("{{ sentry_trace }}")

with app.test_client() as client:
response = client.get("/")
assert response.status_code == 200
assert response.data.decode(
"utf-8"
) == '<meta name="sentry-trace" content="%s" />' % (events[0]["message"],)


def test_dont_override_sentry_trace_context(sentry_init, app):
sentry_init(integrations=[flask_sentry.FlaskIntegration()])

@app.route("/")
def index():
return render_template_string("{{ sentry_trace }}", sentry_trace="hi")

with app.test_client() as client:
response = client.get("/")
assert response.status_code == 200
assert response.data == b"hi"