Tags

Tags give the ability to mark specific points in history as being important
  • 2.0.0

    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

    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

    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.11

    Native Observability 1.0.11
  • 1.0.10

    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

    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

    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

    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 · integrate lints ·
    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 · Fix stylelint ·
    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.4

    Release 1.0.4
    
    - Fixed PHPCS violations across the module
    - Fixed undefined method call in DatabaseObserverCleanupHandler
    - Fixed report HTML export rendering issues
    - Improved controller consistency
    
    Fixes #3580810
    Fixes #3580724
    Fixes #3580722
    Fixes #3580732
  • 1.0.3

    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 · Edit README.md ·
    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

    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

    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

    Phase 4 finalization: Elastic telemetry output, OTEL exporters, Prometheus metrics and module documentation
  • 1.0.0-alpha7

    Native Observability 1.0.0-alpha7
  • 1.0.0-alpha6

    Release 1.0.0-alpha6
    
    Align observability submodule scaffolding and establish the correct Phase 3 architectural baseline.
  • 1.0.0-alpha5

    Release 1.0.0-alpha5
    
    Phase 3 introduction: Metrics Engine foundation
    - Metrics architecture scaffolding
    - Observability module structure improvements
    - Span system stabilization
  • 1.0.0-alpha4

    Native Observability 1.0.0-alpha4