plain.observer 0.6.0__tar.gz → 0.6.1__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.

Potentially problematic release.


This version of plain.observer might be problematic. Click here for more details.

Files changed (34) hide show
  1. {plain_observer-0.6.0 → plain_observer-0.6.1}/PKG-INFO +1 -1
  2. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/CHANGELOG.md +12 -0
  3. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/config.py +6 -0
  4. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/logging.py +3 -2
  5. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/models.py +0 -11
  6. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/otel.py +4 -2
  7. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/observer/partials/log.html +2 -6
  8. {plain_observer-0.6.0 → plain_observer-0.6.1}/pyproject.toml +1 -1
  9. {plain_observer-0.6.0 → plain_observer-0.6.1}/.gitignore +0 -0
  10. {plain_observer-0.6.0 → plain_observer-0.6.1}/LICENSE +0 -0
  11. {plain_observer-0.6.0 → plain_observer-0.6.1}/README.md +0 -0
  12. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/README.md +0 -0
  13. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/__init__.py +0 -0
  14. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/admin.py +0 -0
  15. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/cli.py +0 -0
  16. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/core.py +0 -0
  17. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/default_settings.py +0 -0
  18. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/migrations/0001_initial.py +0 -0
  19. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/migrations/0002_trace_share_created_at_trace_share_id_trace_summary_and_more.py +0 -0
  20. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/migrations/0003_span_plainobserv_span_id_e7ade3_idx.py +0 -0
  21. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/migrations/0004_trace_app_name_trace_app_version.py +0 -0
  22. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/migrations/0005_log_log_plainobserv_trace_i_fcfb7d_idx_and_more.py +0 -0
  23. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/migrations/0006_remove_log_logger.py +0 -0
  24. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/migrations/__init__.py +0 -0
  25. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/observer/partials/span.html +0 -0
  26. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/observer/trace.html +0 -0
  27. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/observer/trace_detail.html +0 -0
  28. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/observer/trace_share.html +0 -0
  29. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/observer/traces.html +0 -0
  30. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/toolbar/observer.html +0 -0
  31. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/templates/toolbar/observer_button.html +0 -0
  32. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/toolbar.py +0 -0
  33. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/urls.py +0 -0
  34. {plain_observer-0.6.0 → plain_observer-0.6.1}/plain/observer/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain.observer
3
- Version: 0.6.0
3
+ Version: 0.6.1
4
4
  Summary: On-page telemetry and observability tools for Plain.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,17 @@
1
1
  # plain-observer changelog
2
2
 
3
+ ## [0.6.1](https://github.com/dropseed/plain/releases/plain-observer@0.6.1) (2025-09-09)
4
+
5
+ ### What's changed
6
+
7
+ - Log messages are now stored in their formatted form instead of as raw log records, improving display consistency and performance ([b646699](https://github.com/dropseed/plain/commit/b646699e46))
8
+ - Observer log handler now copies the formatter from the app logger to ensure consistent log formatting ([b646699](https://github.com/dropseed/plain/commit/b646699e46))
9
+ - Simplified log display template by removing redundant level display element ([b646699](https://github.com/dropseed/plain/commit/b646699e46))
10
+
11
+ ### Upgrade instructions
12
+
13
+ - No changes required
14
+
3
15
  ## [0.6.0](https://github.com/dropseed/plain/releases/plain-observer@0.6.0) (2025-09-09)
4
16
 
5
17
  ### What's changed
@@ -46,6 +46,12 @@ class Config(PackageConfig):
46
46
 
47
47
  # Install the logging handler to capture logs during traces
48
48
  if observer_log_handler not in app_logger.handlers:
49
+ # Copy formatter from existing app_logger handler to match log formatting
50
+ for handler in app_logger.handlers:
51
+ if handler.formatter:
52
+ observer_log_handler.setFormatter(handler.formatter)
53
+ break
54
+
49
55
  app_logger.addHandler(observer_log_handler)
50
56
 
51
57
  @staticmethod
@@ -44,9 +44,10 @@ class ObserverLogHandler(logging.Handler):
44
44
  if trace_info["mode"] != ObserverMode.PERSIST.value:
45
45
  return
46
46
 
47
- # Store the log record with span context
47
+ # Store the formatted message with span context
48
48
  log_entry = {
49
- "record": record,
49
+ "message": self.format(record),
50
+ "level": record.levelname,
50
51
  "span_id": span_id,
51
52
  "timestamp": datetime.fromtimestamp(record.created, tz=UTC),
52
53
  }
@@ -500,14 +500,3 @@ class Log(models.Model):
500
500
  models.Index(fields=["timestamp"]),
501
501
  models.Index(fields=["trace"]),
502
502
  ]
503
-
504
- @classmethod
505
- def from_log_record(cls, *, record, trace, span):
506
- """Create a Log instance from a Python log record."""
507
- return cls(
508
- trace=trace,
509
- timestamp=datetime.fromtimestamp(record.created, tz=UTC),
510
- level=record.levelname,
511
- message=record.getMessage(),
512
- span=span,
513
- )
@@ -353,9 +353,11 @@ class ObserverSpanProcessor(SpanProcessor):
353
353
 
354
354
  log_models = []
355
355
  for log_entry in logs:
356
- log_model = Log.from_log_record(
357
- record=log_entry["record"],
356
+ log_model = Log(
358
357
  trace=trace,
358
+ timestamp=log_entry["timestamp"],
359
+ level=log_entry["level"],
360
+ message=log_entry["message"],
359
361
  span=span_id_to_model.get(log_entry["span_id"]),
360
362
  )
361
363
  log_models.append(log_model)
@@ -6,14 +6,10 @@
6
6
  </svg>
7
7
  </div>
8
8
  <span class="text-white/40 whitespace-nowrap tabular-nums" title="{{ log.timestamp|localtime }}">{{ log.timestamp|localtime|strftime("%-I:%M:%S %p") }}</span>
9
- <span class="font-mono px-1 py-0 text-xs font-medium rounded
9
+ <span data-level="{{ log.level }}" class="font-mono text-white/90 break-words
10
10
  data-[level='DEBUG']:text-stone-400
11
- data-[level='INFO']:text-blue-400
12
11
  data-[level='WARNING']:text-yellow-400
13
12
  data-[level='ERROR']:text-red-400
14
- data-[level='CRITICAL']:text-red-300
15
- text-stone-400 text-center flex-shrink-0"
16
- data-level="{{ log.level }}">{{ log.level }}</span>
17
- <span class="font-mono text-white/90 break-words">{{ log.message }}</span>
13
+ data-[level='CRITICAL']:text-red-300">{{ log.message }}</span>
18
14
  </div>
19
15
  </div>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain.observer"
3
- version = "0.6.0"
3
+ version = "0.6.1"
4
4
  description = "On-page telemetry and observability tools for Plain."
5
5
  authors = [{name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev"}]
6
6
  license = "BSD-3-Clause"
File without changes
File without changes