plainx-sentry 0.6.0__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plainx-sentry
3
- Version: 0.6.0
3
+ Version: 0.8.0
4
4
  Author-email: Dave Gaeddert <dave.gaeddert@gmail.com>
5
5
  Requires-Python: >=3.11
6
- Requires-Dist: sentry-sdk>=2.24.0
6
+ Requires-Dist: sentry-sdk[opentelemetry]>=2.24.0
7
7
  Description-Content-Type: text/markdown
8
8
 
9
9
  # plainx-sentry
@@ -20,12 +20,6 @@ INSTALLED_PACKAGES = [
20
20
  # ...
21
21
  "plainx.sentry",
22
22
  ]
23
-
24
- MIDDLEWARE = [
25
- # Put SentryMiddleware as early as possible in the middleware stack
26
- "plainx.sentry.SentryMiddleware",
27
- # ...
28
- ]
29
23
  ```
30
24
 
31
25
  In your `base.html`, load `sentry` and include the `sentry_js` tag:
@@ -12,12 +12,6 @@ INSTALLED_PACKAGES = [
12
12
  # ...
13
13
  "plainx.sentry",
14
14
  ]
15
-
16
- MIDDLEWARE = [
17
- # Put SentryMiddleware as early as possible in the middleware stack
18
- "plainx.sentry.SentryMiddleware",
19
- # ...
20
- ]
21
15
  ```
22
16
 
23
17
  In your `base.html`, load `sentry` and include the `sentry_js` tag:
@@ -0,0 +1,11 @@
1
+ # plainx-sentry changelog
2
+
3
+ ## [0.7.0](https://github.com/davegaeddert/plainx-sentry/releases/plainx-sentry@0.7.0) (2025-07-19)
4
+
5
+ ### What's changed
6
+
7
+ - Middleware was removed in favor of using the OpenTelemetry integration and new otel instrumentation in Plain.
8
+
9
+ ### Upgrade instructions
10
+
11
+ - Remove `SentryMiddleware` and `SentryWorkerMiddleware` from your `app/settings.py`.
File without changes
@@ -0,0 +1,38 @@
1
+ import sentry_sdk
2
+ from opentelemetry import trace
3
+ from opentelemetry.propagate import set_global_textmap
4
+ from opentelemetry.sdk.trace import TracerProvider
5
+ from plain.packages import PackageConfig, register_config
6
+ from plain.runtime import settings
7
+ from sentry_sdk.integrations.opentelemetry import SentryPropagator, SentrySpanProcessor
8
+
9
+
10
+ @register_config
11
+ class PlainxSentryConfig(PackageConfig):
12
+ label = "plainxsentry"
13
+
14
+ def ready(self):
15
+ if settings.SENTRY_DSN and settings.SENTRY_AUTO_INIT:
16
+ sentry_sdk.init(
17
+ settings.SENTRY_DSN,
18
+ release=settings.SENTRY_RELEASE,
19
+ environment=settings.SENTRY_ENVIRONMENT,
20
+ send_default_pii=settings.SENTRY_PII_ENABLED,
21
+ traces_sample_rate=settings.SENTRY_TRACES_SAMPLE_RATE,
22
+ profiles_sample_rate=settings.SENTRY_PROFILES_SAMPLE_RATE,
23
+ instrumenter="otel",
24
+ **settings.SENTRY_INIT_KWARGS,
25
+ )
26
+
27
+ # Set up OpenTelemetry tracing with Sentry
28
+ if trace.get_tracer_provider() and not isinstance(
29
+ trace.get_tracer_provider(), trace.ProxyTracerProvider
30
+ ):
31
+ raise RuntimeError(
32
+ "A tracer provider already exists. Sentry's OpenTelemetry integration requires a clean tracer provider."
33
+ )
34
+
35
+ provider = TracerProvider()
36
+ provider.add_span_processor(SentrySpanProcessor())
37
+ trace.set_tracer_provider(provider)
38
+ set_global_textmap(SentryPropagator())
@@ -1,4 +1,5 @@
1
1
  import sentry_sdk
2
+ from plain.auth import get_request_user
2
3
  from plain.runtime import settings
3
4
  from plain.templates import register_template_extension
4
5
  from plain.templates.jinja.extensions import InclusionTagExtension
@@ -25,8 +26,8 @@ class SentryJSExtension(InclusionTagExtension):
25
26
  }
26
27
 
27
28
  if "request" in context:
28
- # Use request.user by default (avoids accidental "user" variable confusion)
29
- user = getattr(context["request"], "user", None)
29
+ # Get the authenticated user from the request
30
+ user = get_request_user(context["request"])
30
31
  else:
31
32
  # Get user directly if no request (like in server error context)
32
33
  user = context.get("user", None)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plainx-sentry"
3
- version = "0.6.0"
3
+ version = "0.8.0"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  authors = [
@@ -8,7 +8,7 @@ authors = [
8
8
  ]
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
11
- "sentry-sdk>=2.24.0",
11
+ "sentry-sdk[opentelemetry]>=2.24.0",
12
12
  ]
13
13
 
14
14
  [dependency-groups]
@@ -22,6 +22,9 @@ dev = [
22
22
  [tool.hatch.build.targets.wheel]
23
23
  packages = ["plainx"]
24
24
 
25
+
26
+ [tool.plain.code.biome]
27
+ version = "2.1.2"
25
28
  [build-system]
26
29
  requires = ["hatchling"]
27
30
  build-backend = "hatchling.build"
@@ -17,7 +17,6 @@ MIDDLEWARE = [
17
17
  "plain.sessions.middleware.SessionMiddleware",
18
18
  "plain.middleware.common.CommonMiddleware",
19
19
  "plain.csrf.middleware.CsrfViewMiddleware",
20
- "plain.auth.middleware.AuthenticationMiddleware",
21
20
  "plain.middleware.clickjacking.XFrameOptionsMiddleware",
22
21
  "plainx.sentry.middleware.SentryFeedbackMiddleware",
23
22
  ]
@@ -1,5 +1,6 @@
1
1
  import sentry_sdk
2
2
  from plain.auth import get_user_model
3
+ from plain.auth.requests import set_request_user
3
4
  from plain.views import TemplateView
4
5
 
5
6
  from plainx.sentry.templatetags.sentry import sentry_js
@@ -39,7 +40,7 @@ def test_sentry_pii_enabled(settings, rf):
39
40
  settings.SENTRY_PII_ENABLED = True
40
41
 
41
42
  request = rf.get("/")
42
- request.user = get_user_model()(id=1, email="test@example.com", username="test")
43
+ set_request_user(request, get_user_model()(id=1, email="test@example.com", username="test"))
43
44
 
44
45
  assert sentry_js({"request": request}) == {
45
46
  "sentry_js_enabled": True,
@@ -83,7 +84,7 @@ def test_sentry_pii_disabled(settings, rf):
83
84
  settings.SENTRY_PII_ENABLED = False
84
85
 
85
86
  request = rf.get("/")
86
- request.user = get_user_model()(id=1, email="test@example.com", username="test")
87
+ set_request_user(request, get_user_model()(id=1, email="test@example.com", username="test"))
87
88
 
88
89
  assert sentry_js({"request": request}) == {
89
90
  "sentry_js_enabled": True,
@@ -104,7 +105,7 @@ def test_sentry_release_env(settings, rf):
104
105
  settings.SENTRY_ENVIRONMENT = "production"
105
106
 
106
107
  request = rf.get("/")
107
- request.user = get_user_model()(id=1, email="test@example.com", username="test")
108
+ set_request_user(request, get_user_model()(id=1, email="test@example.com", username="test"))
108
109
 
109
110
  assert sentry_js({"request": request}) == {
110
111
  "sentry_js_enabled": True,