Tags give the ability to mark specific points in history as being important
-
2.0.0
3835cc62 · ·Native Observability 2.0.0 Major release on 1.1.1. The report no longer publishes an invented overhead percentage summed from four hardcoded constants. The module measures its own cost on the server it runs on, in paired ON/OFF blocks against a control pass, and publishes the figure with its source named. Also: Drupal 12 compatibility, a database asked about window functions instead of assumed, five capture keys that reject an invalid imported value, and an uninstall that leaves no tempstore rows behind. UPGRADE NOTES - Run `drush updb`. One update hook runs, native_observability_report_update_10102. - The overhead section is set to hidden on every existing site. To publish a figure again, measure one with `drush no:overhead:measure --record`, or declare one by hand in the report settings. - Breaking: ObservabilityImpactEstimator and the config and message keys it fed are removed. There is no replacement value to migrate to, because the number they held was never measured.
-
1.1.1
c6d0f630 · ·Native Observability 1.1.1 Patch release on 1.1.0. Nine defects in data retention and capture, found by auditing the cleanup handlers, plus the test group annotations that Drupal 10 discovery requires and a quality gate that runs the five checks in one pass. Retention never deleted a span row. The threshold was built in seconds while started_at_ms stores epoch milliseconds, so with 30560 rows past a 24 hour window a run deleted none. The general capture switch governed the trace subscriber alone: 60 requests with capture disabled still wrote 780 rows, and with an OTLP endpoint configured still delivered spans to the collector. A page cache hit answered with the correlation id of the request that produced the cached copy, and its stored row carried no id at all. Tag invalidations had no per-request cap, and one request wrote 190 rows. A forced purge reported deleting nothing while removing 18672 rows, because it returned the result of TRUNCATE. UPGRADE NOTES - Run `drush updb`. Four update hooks run. - native_observability_update_10105 can raise trace_retention_hours, and prints why when it does: trace rows must outlive the rows that reference them. Review whether the longer window suits your privacy requirements. - native_observability_update_10106 rewrites stored request paths and reports how many it changed. - Rebuild caches immediately after deploying the files, before reopening traffic. This release adds a constructor argument to a middleware in the HTTP stack, so a warm container running new code fails every request until it is rebuilt.
-
1.1.0
d2adc245 · ·Native Observability 1.1.0 First minor release since 1.0.11. It carries new public surface, which is why it is not 1.0.12: a JSON records endpoint, new services, a new configuration key and two new export query parameters that did not exist before. UPGRADE NOTES - Run `drush updb`. native_observability_export_update_10002() decides the access model of the Prometheus scrape endpoint on your site. Without it, a site that scrapes without a bearer token will start being refused. - The module now ships a root composer.json declaring php >=8.2, above Drupal 10's own minimum. A Drupal 10 site on PHP 8.1 will not be offered this release and stays on 1.0.11. - CSV export filenames changed shape. Automation that collects them by name needs adjusting. NEW - Slow query records are served over a new route, native_observability_dashboard.api.database_records, as one gzip-compressed response instead of being embedded in the page. The module negotiates the compression itself rather than relying on web-server configuration. - Each dashboard tab loads only its own JavaScript. Overview, Cache, Database and Forensic have a library and a bundle apiece over a shared base and the charting engine, replacing the single bundle every page used to download. - Export links pin the window they were taken from. An export followed minutes after reading a table now returns that table, not a window that slid forward in the meantime. A from/to pair is honoured only when it spans exactly the duration its range key names and does not end in the future. - The Prometheus scrape endpoint refuses unauthenticated requests on new installs, with an explicit "Serve without a bearer token" opt-in and a security warning on the settings page for sites that need the old behaviour. - retention.max_rows is enforced by the cleanup handlers, which previously read the setting without acting on it. - The report has an Italian narrative, and the narrative keys it only had fallbacks for are now defined. - Documentation is published as a MkDocs site, with in-Drupal help pointing at it, screenshots of every settings tab, and a redrawn dependency graph. - The next-major compatibility analysis runs instead of being disabled. FIXED - The slow query records table was empty; it is filled again, its pager has the shared markup back, and the route and hotspot popups open again. - The slow query threshold is read from one place everywhere, instead of two values disagreeing. - The container compiles when the database observer is not installed. - Sorting a cache record table reorders the rows on screen. It used to reorder only the backing array, so a sorted column changed which rows landed on a page without changing the order they were read in. - Activity that never resolved a route is labelled instead of showing a blank cell, and no longer carries an inspect control that filters by an empty route and opens nothing. - A chart in a panel that starts hidden waits to be told the panel opened, through a resize observer, instead of re-checking on every animation frame for as long as the panel stayed shut. - The delete-all-spans confirmation is reachable again. - Injected properties survive form serialization. - Interface controls no longer leak into CSV exports, and the server-side exports use the same filename shape as the client-side ones. REMOVED - The dashboard library is now a dependency-only alias over the base and the four section libraries. It keeps working for anything outside the module that attaches it. js/dashboard.js and its esbuild entry are gone. - The server-side PDF exporter, which was never wired to anything. - CHANGELOG.md, in favour of the release notes on drupal.org. - A tracked .bak copy of the forensic template and a stray module-description.html. DEVELOPMENT - phpstan raised to level 6 across the module, with the iterables typed in every sub-module and the guards the type system proves unreachable removed. - The test suite runs against the previous major on the declared PHP floor. - ECA is installed in CI so the bridge can be analysed, and the phpstan gate is on again.
-
1.0.10
e7b32a6d · ·Native Observability 1.0.10 Eleven commits on top of 1.0.9. The headline themes: outbound HTTP tracing reworked as a Guzzle middleware on the shared http_handler_stack (so consumers that depend on the concrete GuzzleHttp\Client keep working), a buffered-span race that left duration_ms = NULL is closed, four CI repairs land on top of the refactor, the documentation is brought back in sync with the new instrumentation shape — including a worked guide on how to trace third-party HTTP integrations such as Typesense and Facets — and the static-analysis baseline is tightened from phpstan level 1 to level 2 with strict docblock types. Added - GuzzleSpanMiddleware (native_observability_spans) — outbound HTTP spans recorded by a middleware on the shared http_handler_stack instead of by a decorator on http_client. Per-call categorisation is opt-in via GuzzleSpanMiddleware::OPTION (subtype + name). - GuzzleTraceMiddleware (native_observability_execution) reworked along the same lines for execution-side outbound tracing. - drush no:token:* commands (TokenCommands) — generate, store and revoke the bearer token used by the export endpoints (/native-observability/prometheus, /native-observability/elastic). - RouteMetricsAggregator::aggregateAndPersistWindow($start, $end) — explicit wrapper companion to aggregateLatestCompletedWindow() and aggregateRollingWindow(), used to back-fill past 5-minute buckets. Changed - http_client is no longer wrapped by decorators. \Drupal::httpClient() returns a real GuzzleHttp\Client again, so consumers that type-hint the concrete class (most notably search_api_typesense) keep working without patches. - ServiceIntegrityInspector extended to recognise the two new middlewares (http_client.spans, http_client.execution) as integration points. - OpenTelemetryExporter and LivePrometheusMetricsReader updated to consume the new middleware-side span payload shape. Removed - HttpClientSpanDecorator — superseded by GuzzleSpanMiddleware. - InstrumentedHttpClientDecorator — superseded by GuzzleTraceMiddleware. Fixed - Buffered spans now close in place inside the deferred-persistence buffer (DatabaseSpanStorage + DeferredPersistenceBuffer::applyPatch), fixing a race that left duration_ms = NULL on bursts of outbound requests within the same kernel cycle. - drush no:k6:report no longer crashes with "Call to undefined method RouteMetricsAggregator::aggregateAndPersistWindow()" — the orphan call from K6ReportCommands::refreshAggregationForRun() is restored by the new wrapper. - GuzzleSpanMiddlewareTest no longer uses the deprecated Assert::isType() (PHPUnit 11) — the two with(...) expectations switch to IsType::TYPE_ARRAY, unblocking the phpstan job. - CI: phpunit test signatures, the obsolete unused-variable phpcs rule and a phpcs array-indentation pass in inline markup builders all repaired. QA - phpstan bumped from level 1 to level 2 with treatPhpDocTypesAsCertain: true. Closes the two gaps that let the aggregateAndPersistWindow() regression through in the first place (callers of methods that exist only on a docblock-typed property, and undefined-method calls revealed only after a rename); src/ is clean at the new level. - Two narrowly scoped ignoreErrors entries (Prophecy ObjectProphecy intercepted methods, PHPUnit createMock()->method('x') builder API) added with path: '*/tests/*' so src/ stays fully strict while the dynamic-dispatch blind spots of the test frameworks are accepted. Docs - _spans and _execution README files re-synced with the handler-stack middleware refactor (no more references to HttpClientSpanDecorator / "decorates http_client"). - New "Tracing third-party HTTP integrations" section with three integration patterns (constructor injection / local variable / facade), a Typesense + Facets worked example, and two caveats: search_api_typesense issues read queries from the browser via InstantSearch (no PHP path to instrument server-side), and drush php-script does not dispatch kernel.terminate (ad-hoc scripts must flush the span buffer explicitly). -
1.0.9
1b0e9cf9 · ·Native Observability 1.0.9 Twelve commits on top of 1.0.8. The headline themes: install presets, extraction of the scrape-side responsibilities into a dedicated sub-module, honest dependency declarations, and removal of the install-time sanity gate. Added - drush no:preset:raw, drush no:preset:dashboard, drush no:preset:integrations — single-command installers for the three documented consumer tiers. Idempotent (re-running prints "Already enabled") and end each invocation with a short Next-steps block. - native_observability_export — new sub-module that owns the pull-based scrape endpoints (/native-observability/prometheus, /native-observability/elastic) split out from native_observability_otel. Hard-deps on native_observability + spans + cache_observer (the three tables it reads). Ships its own settings form at /admin/config/development/native-observability/settings/export, config schema, permissions and Drupal State storage for the bearer token. Can be enabled without native_observability_otel. - CHANGELOG.md at the module root. - "Pick your tier" table in the README plus a seven-group copy-friendly install layout (one drush command per fenced bash block, modules on separate lines via backslash continuation). Changed - native_observability_dashboard.info.yml now declares hard dependencies on cache_observer and database_observer (the dashboard pages /dashboard/cache and /dashboard/database query those tables — without the modules they 500). - native_observability_eca_bridge.info.yml drops eca_ui, eca_log and eca_base — the bridge only uses Drupal\\eca\\* core symbols. - native_observability_eca_bridge_demo.info.yml gains eca_base and eca_log (the demo's rule pack uses eca_write_log_message and eca_scalar from those modules). - native_observability_otel reduced to OTLP push only — admin form, config schema and permissions all shrink accordingly. - phpstan.neon.dist now covers modules/native_observability_otel/tests/src and modules/native_observability_export/tests/src (closes a pre-existing gap). - README rewritten: tier table at the top, per-module Tier / Depends on / Required by headers, and the seven-group install layout. Removed - Drupal\\native_observability\\SanityCheck\\InstallGuard class and every InstallGuard::checkFor() call in hook_requirements('install'). Service-integrity conflicts no longer block module installation; they are still reported on the Status Report and via drush no:sanity-check. - Two scaffold-only .install files in dashboard and execution (their only content was the removed guard). - Route name aliases renamed (public URLs unchanged): native_observability_otel.prometheus_metrics → native_observability_export.prometheus_metrics native_observability_otel.prometheus_scrape → native_observability_export.prometheus_scrape native_observability_otel.elastic_export → native_observability_export.elastic_export Custom code calling Url::fromRoute() against the old names needs updating; /native-observability/prometheus and /native-observability/elastic paths are unchanged. Migrated - native_observability_export_update_10001 (auto-run by drush updb) moves: * Bearer-token State key native_observability_otel.secret.prometheus_bearer_token → native_observability_export.secret.prometheus_bearer_token * Prometheus config keys (prometheus_window_seconds, prometheus_label_strategy, prometheus_max_series) from native_observability_otel.settings to native_observability_export.settings. Idempotent and logged on the dblog channel native_observability_export. Fixed - TechnicalInsightsController dataset CSV exports (/admin/reports/native-observability/export/{dataset}) no longer 500 with AutowiringFailedException — TraceMetricsReader is now public so the on-the-fly controller autowire can resolve it. - The base module's hook_requirements('install') no longer fatals on Drupal 11 with "Class InstallGuard not found"; the autoloader issue is gone with the removal of the install-time guard. Verification done before tagging - Clean wipe + install of each tier via the new drush presets. - drush no:sanity-check OK on all three tiers. - drush no:validate-pipeline reports 7 PASS / 1 WARN / 0 FAIL on the local DDEV stack (Tempo WARN is the dev-environment block-flush window, not a module issue). - Cache backend rotation exercised on null, database, memcache, apcu and redis — the cache_observer logs every backend with consistent HIT/MISS/INVALIDATED distributions. - Upgrade scenario simulated: bearer token + Prometheus config keys migrate correctly on drush updb. - Static QA: phpcs 309 files clean, phpstan 0 errors, yaml-lint 80 files valid. drupal.org CI pipeline green across composer, composer-lint, phpcs, eslint, stylelint, yamllint, phpunit. -
1.0.8
1270aa04 · ·Native Observability 1.0.8 New features: - Forensic Route Analysis: dashboard tool to investigate a route/path by correlating traces, spans, and outbound HTTP/SQL signals, with a candidate picker, bulk subject management, and HTML export. - Deferred hot-path persistence: traces, spans, cache and database events are buffered in memory and flushed in a single batch at kernel.terminate. - Narrative observability report: long-form conclusion and action schema with scoring and privacy-aware export controls. Telemetry & Prometheus: - Prometheus scrape gated by a bearer token, stored in Drupal State (never in exported config; write-only field with a __clear__ sentinel). - Prometheus cardinality controls: configurable label strategy and a max-series cap with a truncation guard. - Exporter plugins migrated from annotations to PHP attributes. Cache & database observability: - Cache observability split into route-bound and orphan event surfaces; dashboard cache invalidated on trace insert with full header capture. - Database observer storage injection fixed and query records enriched. Dashboard: - Hardened trace sampling, eliminated the Technical Insights N+1 (single batch query per dataset), reworked the shared table/modal JavaScript. Security & robustness: - Closed a local file inclusion vector on the report narrative path. - Closed an open redirect on the request-log exclusion form + admin-route guard. - Fixed a latent fatal in the async HttpClientSpanDecorator path. - Hardened the install/update lifecycle and extracted a central PrivacyPolicy service that locks the no-raw-IP contract. Quality & CI: - Added kernel test infrastructure, extended drupal.org CI to gate PHPStan and a yamllint job, brought the module to clean PHPCS/PHPStan, consolidated docblocks, and refreshed the READMEs. Service integrity & safe install: - Service-integrity sanity check (ServiceIntegrityInspector, a /sanity-check report page and `drush no:sanity-check`) that verifies the family's service decorators, wrappers, stack middleware and event subscribers are intact and detects conflicting third-party overrides. - Install guard: a non-green base blocks installing the base and every sub-module, and a retro-fit update disables unsafe modules together with their dependents, so the family only installs on a conflict-free base. Cache observability tooling: - Internal Page Cache HIT/MISS captured via a stack middleware and reconciled with the dashboard KPIs (route-less HITs are listed under orphan records). - Route-bound and orphan cache-event tables made paginated and sortable, with row selection + "Delete selected" and per-table scoped "Delete all". - The cacheable-responses KPI now excludes the dashboard's own self-observation. - Alert when multiple dedicated cache systems (e.g. Redis + Memcache) cover the same bins (a chained-fast APCu + consistent layering is exempt). Settings: - All sub-module settings consolidated as tabs under /admin/config/development/native-observability/settings, present only when the owning module is enabled. Native Observability 1.0.8 adds the Forensic Route Analysis tool, deferred hot-path persistence and a narrative report, while hardening security, telemetry cardinality, and overall code quality on top of 1.0.7. It also adds a service-integrity sanity check with a conflict-aware safe-install guard, richer cache observability tooling (sortable/actionable cache tables, page-cache HIT/MISS reconciliation and a multi-cache alert), and a unified settings area.
-
1.0.7
66fbd91f · ·This release introduces a full request-log exclusion workflow and improves the dashboard/operator experience. Highlights: - Added a core request-log exclusion system in `native_observability` - Added a dedicated exclusions settings page under Native Observability settings - Added support for exclusion rules based on: - HTTP method - exact, prefix, and regex path matching - query conditions with `exists`, `missing`, `equals`, `regex`, `gte`, `lte`, and `between` - Implemented runtime caching for exclusion rules: - database remains the authoritative source - cache is used at runtime - in-memory reuse avoids repeated DB lookups on every request - Ensured excluded requests are suppressed across the request-correlated pipeline: - traces - spans - observers - metrics - exports - Added dashboard actions in Technical Insights: - `Exclude from logs` - `Re-enable logs` - Added deep-linking from the dashboard to the exclusions form with prefilled values and destination/backlink return flow - Improved dashboard labeling for unresolved external requests, including privacy-aware IP display - Refined the Technical Insights modal summary cards for a more compact and clearer layout - Added PHPUnit coverage for exclusion-rule normalization, matcher behavior, caching, and request-level exclusion propagation - Expanded README and module documentation with detailed guidance for exclusion rules, pattern matching, query operators, dashboard workflow, and runtime performance behavior Native Observability 1.0.7 makes noisy traffic suppression a first-class feature and helps keep traces, spans, and metrics focused on real application behavior. -
1.0.6
122c0f58 · ·Native Observability 1.0.6 - Added OpenTelemetry and Prometheus observability improvements, including a live Prometheus metrics reader, improved Prometheus metrics building, exporter registry refinements, and route exclusion support for tracing. - Added security and runtime hardening around trace collection, route filtering, and observability settings. - Added Grafana/Prometheus documentation cleanup and aligned OpenTelemetry admin links and README references. - Added Native Observability ECA Bridge integration, including ECA event definitions, event plugin/deriver support, unit coverage, and bridge documentation. - Added Native Observability ECA Bridge Demo module with sample ECA configurations for 500 errors, AJAX requests, slow requests, trace deletion, and trace logging workflows. - Improved the dashboard with span breakdown support, trace metric reading, optional section handling, primary KPI rendering updates, KPI card styling, and dashboard bundle updates. - Added route exclusion unit coverage for core tracing and OpenTelemetry tracing subscribers. - Added OpenTelemetry requirements and Prometheus metrics unit coverage. - Updated PHPUnit tests to avoid deprecated docblock coverage metadata where applicable. - Fixed PHPCS and PHPUnit regressions introduced during the new observability integrations. - Split frontend linting responsibilities between generic Drupal linting and dashboard-specific asset validation. - Added explicit Prettier, ESLint, Stylelint, and dashboard asset validation configuration to keep JS, SCSS, and compiled CSS/JS checks separate. - Integrated additional GitLab CI validation jobs as non-blocking checks while keeping PHPCS blocking. - Fixed remaining ESLint/Prettier formatting issues in execution AJAX correlation and report preview JavaScript. This release focuses on observability depth, ECA interoperability, Prometheus/Grafana readiness, dashboard metrics improvements, and CI/lint hardening.
-
1.0.5
c23d823e · ·Native Observability 1.0.5 Bug fixes and improvements: - Preserve selected dashboard time range while navigating across overview, cache, and database pages - Restore visibility and inspection of external Guzzle HTTP requests in the overview - Hide orphan trace links in Database Observer when the related trace no longer exists
-
1.0.3
47362696 · ·Release 1.0.3 Stabilization release focused on frontend linting and build consistency. - resolved the majority of ESLint issues across dashboard components - aligned JavaScript code with Prettier formatting standards - fixed build pipeline inconsistencies (esbuild + asset generation) - improved Drupal.t() usage for translatable strings - removed duplicated and invalid JS artifacts affecting validation Known limitations: - Stylelint validation is still in progress and will be completed in a subsequent release This release consolidates JavaScript stability and prepares the module for further frontend quality improvements.
-
1.0.2
34a735bd · ·Native Observability 1.0.2 This release introduces a major evolution of the Native Observability ecosystem, bringing together database observability, cache observability, a fully refactored dashboard, and a complete reporting system. Key features: ## Database Observability - Query-level analysis integrated into request lifecycle - Database time vs request time correlation - Detection of slow queries and query-heavy routes - Aggregated metrics for database performance - Dedicated insights to identify bottlenecks in persistence layer ## Cache Observability - Runtime cache behavior analysis - Cache hit/miss visibility across requests - Cacheability and invalidation insights - Detection of uncacheable responses and cache inefficiencies - Integration of cache metrics into dashboard and reports ## Dashboard (Refactored) - Complete refactor using Twig-driven components - Modular JavaScript architecture - Advanced chart rendering using Apache ECharts - Aggregated metrics visualization (throughput, latency, error rate) - Technical insights panels for routes, AJAX, cache and database - Improved UX and separation between data and presentation layers ## Observability Report System (New) - Interactive report builder with configurable scope - Structured preview with scoring and narrative insights - KPI summaries and technical evidence tables - Advanced charts (time series, scatter, gauge, radar, pie) - Technical appendices: - Route-level evidence - AJAX and external request analysis - Cache runtime insights - Database performance data ## Printable HTML Export - Full report export as printable HTML document - Deterministic layout optimized for browser print - Accurate rendering of charts using native browser engine - PDF generation via browser print dialog (no server-side PDF) ## General Improvements - Improved integration between tracing, metrics, and visualization layers - Enhanced correlation between requests, spans, cache, and database activity - Extensive documentation updates across modules - Improved inline code documentation - Initial translation hardening (reduction of hardcoded strings) - Cleanup of legacy and unused code paths Notes: - Server-side PDF generation has been removed in favor of browser-based printing - This release focuses on stability, usability, and observability clarity Native Observability continues to evolve as a fully Drupal-native observability platform, providing deep runtime insights without external agents or vendor lock-in.
-
1.0.1
96c54a68 · ·Release 1.0.1 Bugfix release. Fix uninstall cleanup to ensure all Native Observability storage is removed when the module is uninstalled.
-
1.0.0
9ba3f26c · ·Native Observability 1.0.0 stable release Full observability stack for Drupal including: - Request tracing engine - Execution monitoring - Span hierarchy and trace navigation - Metrics engine with aggregation - Prometheus metrics exporter - OpenTelemetry exporter (OTLP) - Elastic telemetry output - Drush tooling integration - Observability status block - Modular observability architecture This release finalizes Phase 1–4 of the Native Observability roadmap.
-
1.0.0-alpha8
9ba3f26c · ·Phase 4 finalization: Elastic telemetry output, OTEL exporters, Prometheus metrics and module documentation
-
-
1.0.0-alpha6
47aa4545 · ·Release 1.0.0-alpha6 Align observability submodule scaffolding and establish the correct Phase 3 architectural baseline.
-
1.0.0-alpha5
92cc249b · ·Release 1.0.0-alpha5 Phase 3 introduction: Metrics Engine foundation - Metrics architecture scaffolding - Observability module structure improvements - Span system stabilization
-