vunet_flutter_plugin 0.0.1 copy "vunet_flutter_plugin: ^0.0.1" to clipboard
vunet_flutter_plugin: ^0.0.1 copied to clipboard

A Flutter plugin from VunetSystems for Mobile Real User Monitoring.

Changelog #

0.0.1 #

Fixed #

  • Removed the _TrackedHttpClient warning that fired when HttpOverrides.current was not TrackedHttpOverrides. It ran on already tracked clients (false alarm) and never on new HttpClient()s created after HttpOverrides.global was replaced (the actual miss). Install custom overrides before VuTelemetry.initialize().
  • TrackedHttpOverrides now forwards HttpClient and HttpClientRequest property writes to the inner client. Timeouts, User-Agent, autoUncompress, and package:http Content-Length / persistentConnection were previously stored only on the wrapper and silently ignored.
  • HTTP client spans from instrumentations.http: true + http.Client() now record the download phase. Response metadata getters used to end the span on a microtask before package:http listened to the body; a cancelable timer now waits for listen() (or closes unread-body spans without inflating duration).
  • Chained HttpOverrides now keep DNS/connect timing. TrackedHttpOverrides installs the instrumented connectionFactory on the prior override's client instead of wrapping it without connect instrumentation.
  • HTTP client spans are no longer lost when the response body is discarded with drain() (or any StreamSubscription.asFuture use). asFuture overwrites the subscription's onDone, which replaced the handler that ends the span, so the span never closed and never exported. The end hook now sits on an internal subscription the caller cannot overwrite, and a body abandoned part-way through (subscription cancelled) also closes its span.
  • A connectionFactory assigned to the HttpClient the SDK hands out is no longer dropped. connectionFactory is set-only, so the assignment used to replace the instrumented factory and silently end connect timing; the two are now composed — the app's factory does the connecting and timing is still recorded. Clearing it (null) restores the SDK's self-connecting factory.
  • OtelDioInterceptor no longer copies and stringifies every request and response header on each call. The maps are built only when captureRequestHeaders / captureResponseHeaders are non-empty; previously they were built and then discarded under the default empty allowlists.
  • Transport failures (no HTTP response received) now report http.response.status_code = 0 so they can be distinguished from 4xx/5xx responses. A status already set by applyResponse is never overwritten.
  • Frame jank monitoring no longer resolves the current screen or starts the aggregation timer until a slow/frozen frame is observed.
  • A replacement outermost Navigator (auth gate, keyed MaterialApp rebuild) now reports navigation.transition.type = app_initialization for its first route. The label previously followed _hasEverEmitted, so a depth-0 landing after anything had already emitted was tagged nested_initialization.
  • screen.name no longer drops back to the enclosing page when a nested Navigator's observers are re-attached — an inline RouteObserverService.nested() recreated on rebuild, or a GlobalKey reparenting that moves it under a new ancestor. NavigatorObserver.navigator is cleared by NavigatorState.deactivate, not only by disposal, so it was never a liveness flag; per-navigator state is now keyed on the live NavigatorState and retired when that unmounts.
  • pushAndRemoveUntil now reports navigation.transition.type = push. Flutter drains route additions before deletions, so the removals were relabelling the push as a pop — inverting every login / onboarding-completion transition.
  • tab_switch spans from a VuIndexScope with foldIntoScreenName: false now report the branch the user left as navigation.source.name instead of repeating the destination.
  • A shell that builds its branches on demand now emits a nested_initialization for each branch as it appears. Suppression of hidden IndexedStack siblings is scoped to the frame rather than to the emit-coalescing window, which every emit refreshed.
  • screen.name no longer picks a hidden branch when a Visibility(visible: true) sits between that branch and the shell that hides it.
  • screen.name no longer stays on a nested branch when a root PageRoute covers the shell, and a hidden depth-2 branch can no longer outrank a visible depth-1 one.
  • Reading navigation state no longer registers an InheritedWidget dependency from every nested Navigator, which made them rebuild on unrelated route changes.
  • A VuTelemetry.logTabChange call with no accompanying setState now completes and exports its span instead of leaving it open.
  • VuTelemetry.logTabChange with per-destination labels (dynamic titles) no longer grows a controller-driven group's label list without bound.
  • Dropped an unread SharedPreferences write from every route change (it also fanned out to every nested navigator, hidden branches included).

Added #

  • Flutter image.load instrumentation (Android Glide/Coil parity): opt-in VuNetworkImage / VuImage.network in core, plus sibling package vunet_flutter_plugin_cached_network_image for cached_network_image / flutter_cache_manager (VuInstrumentedCacheManager, VuCachedNetworkImageProvider, VuCachedNetworkImage). Spans use scope com.vunetsystems.rum.flutter.image with attrs image.url (query stripped), image.source, image.load.status, and optional image.model_type; network path emits a child HTTP GET under the image span.

Changed #

  • HTTP client phase timings (dns_ms, connect_ms, ttfb_ms, download_ms, total_ms, and event duration_ms) are now floating-point milliseconds, so a 0.4 ms hop is recorded as 0.4 rather than truncated to 0 or omitted. Unmeasured phases (pooled connect, download that never started) stay omitted.
  • Added InitializationParams.httpConnectionFactory, plus the HttpConnectionFactory typedef it takes (exported from both flutter_sdk.dart and http_instrumentation.dart). A connectionFactory installed inside a prior HttpOverrides' createHttpClient cannot be read back (the property is set-only), so TrackedHttpOverrides replaces it and custom pooling / proxying / mTLS is lost. Supply it here (or via TrackedHttpOverrides.install(connectionFactory:)) and it is composed with connect timing instead. Only the combined connect phase is reported then — dns is unavailable, since the lookup happens inside the supplied factory.
  • Added HttpSpanRecorder.capturesRequestHeaders / capturesResponseHeaders to http_instrumentation.dart. Custom adapters can check them before building a header map, since the allowlist is read at call time and empty by default.
  • Nested-navigator docs now show a State-held RouteObserverService.nested() instead of one allocated inline in build.
  • Documented W3C Trace Context Level 1 as the HTTP propagation contract: inject always uses traceparent version 00.
  • Added SDK developer logging controls via InitializationParams.logLevel with SdkLogLevel.info as the default. SdkLogLevel.debug now emits lifecycle, HTTP, navigation, error, and frame-monitoring diagnostics from the Flutter layer.
  • app.jank frame monitoring now uses display refresh-rate budgets, microsecond-precision comparisons, per-window total_frames / jank rates, separate slow vs frozen and build vs raster counters, and span timestamps anchored to the observed frame window (not flush time).
  • foldIntoScreenName is now available on every tab API, not just VuIndexScope: VuTabScope, VuTelemetry.observeTabController and VuTelemetry.logTabChange all accept it (default true, unchanged behaviour). On the imperative APIs it applies to the call that first registers the group — the flag is fixed for the group's lifetime.

Breaking #

  • ui.navigation spans moved to a navigation.* attribute vocabulary. The observer no longer writes screen.name, last.screen.name, screen.route, or last.screen.route:
    • screen.name (destination) is now navigation.destination.name. ScreenNameSpanProcessor still stamps screen.name at span start with the same destination value, but without the 'unknown' fallback — when the destination widget class cannot be derived (a route that is neither a MaterialPageRoute nor a CupertinoPageRoute, or one pushed before the navigator is attached) the span now carries no screen.name where it previously carried the literal "unknown".
    • last.screen.name is now navigation.source.name, and the initial route's value changed from 'unknown' to 'app_launch'.
    • screen.route and last.screen.route are removed. navigation.destination.type / navigation.source.type carry the route class (material / cupertino / page / unknown), not the route path, so dashboards grouping ui.navigation by route path lose that data unless a router integration supplies it. vunet_flutter_plugin_go_router does: it writes the matched path pattern to navigation.destination.route / navigation.source.route and the concrete path (query stripped) to navigation.destination.uri / navigation.source.uri. The core observer cannot — a Navigator does not know its own path patterns — so those four attributes are absent, not unknown, without an integration. Spans also gained navigation.transition.type, navigation.entry.type, navigation.trigger, navigation.is_initial, navigation.duration_ms, navigation.ttid_ms, and navigation.transition.completed.
  • Removed the shared_preferences dependency — nothing in the SDK reads it any more. Apps that were picking it up transitively must declare it themselves.
  • Renamed VuTelemetry.logClickEvent to VuTelemetry.logInteraction; the signal covers gestures and value changes, not only clicks. No alias is kept — call sites must be updated.
  • ui.interaction spans no longer emit event.name. The first argument to VuTelemetry.logInteraction is now the widget acted on and is emitted as app.widget.name (blank values fall back to unknown). Backend queries keyed on event.name stop working and need coordinated updates.
  • ui.interaction spans now always carry app.widget.source (flutter) and interaction.type. interaction.type comes from the new optional logInteraction(interactionType:) parameter, defaulting to InteractionTypes.tap; the InteractionTypes vocabulary (tap, gesture, value_change, menu, menu_item) is exported from flutter_sdk.dart and mirrors the native iOS SDK. Entries in attributes can no longer override these three keys.
  • app.widget.name / app.widget.source deliberately differ from the native iOS spelling (element.name / ui.framework) for the same ui.interaction span name. Backend queries must branch by platform until one spelling wins.
  • logInteraction no longer writes screen.name itself. ScreenNameSpanProcessor still stamps it at span start (native does not add it to spans bridged from Flutter), but the 'unknown' fallback is gone: an interaction fired before the first route resolves now emits no screen.name where it previously emitted the literal "unknown". Queries filtering or grouping on that literal change behaviour. Precedence also flips — a screen.name passed in attributes now overrides the processor instead of being discarded.
  • HTTP spans no longer write screen.name themselves. ScreenNameSpanProcessor still stamps it at span start, but the 'unknown' fallback is gone: a request before the first route resolves now emits no screen.name where it previously emitted the literal "unknown". The screenName argument was removed from HttpSpanRecorder.start.
  • Moved Dio instrumentation (OtelDioInterceptor, attachInstrumentedDio) out of vunet_flutter_plugin into the sibling package vunet_flutter_plugin_dio. Apps that use Dio must add that dependency and import package:vunet_flutter_plugin_dio/vunet_flutter_plugin_dio.dart. The hard dio dependency was removed from core.
  • Added package:vunet_flutter_plugin/http_instrumentation.dart for official HTTP client integrations and advanced custom adapters (HttpSpanRecorder, timing helpers, InstrumentationScopes). App code should continue to use flutter_sdk.dart.
  • Replaced InitializationParams.enableSlowFrameTracking with instrumentations.jankDetection on nested InstrumentationsConfig. Also gates auto-install of error handlers (errors) and TrackedHttpOverrides (http). Navigation and Dio remain app-wired.
  • Renamed Flutter RUM instrumentation scopes to com.vunetsystems.rum.flutter.* (e.g. HTTP → ...http, Dio → ...http.dio, custom action → ...custom.action). Backends that filter on instrumentationScope.name must update queries.
  • Removed legacy Flutter anr-instrumentation / freezeDetected span emission (native SDK owns ANR/jank).
  • RUM tracers now set instrumentation scope version to the plugin version.
  • Custom actions: use VuTelemetry.action.startAction / withAction (was VuAction.startAction / withAction). VuAction remains the handle type.
  • Error spans share scope com.vunetsystems.rum.flutter.errors with distinct names (flutter.ui.error, flutter.platform.error, flutter.custom.error) and error.source. Only custom errors are app-facing via VuTelemetry.error.record(...); UI/platform capture is SDK-internal.

0.18.6 - 2024-08-15 #

Full Changelog

Merged pull requests:

0.18.5 - 2024-08-01 #

Full Changelog

Merged pull requests:

0.18.4 - 2024-07-18 #

Full Changelog

Closed issues:

  • [Question] What is correct way to call Context.current.span now? #173
  • RecordException doesn't capture Exception as Event #152

Merged pull requests:

0.18.3 - 2024-05-23 #

Full Changelog

Closed issues:

  • I can't find withContext and setSpan from README #162

Merged pull requests:

0.18.2 - 2024-04-01 #

Full Changelog

Closed issues:

  • PreFlight request support #154

Merged pull requests:

0.18.1 - 2024-02-26 #

Full Changelog

Closed issues:

  • Process crashes when no collector is running #147
  • 0.18.0 release to pub.flutter-io.cn? #142

Merged pull requests:

0.18.0 - 2024-01-18 #

Full Changelog

Closed issues:

  • Support for Events? #116

Merged pull requests:

0.17.0 - 2023-11-10 #

Full Changelog

Merged pull requests:

0.16.2 - 2023-07-11 #

Full Changelog

Merged pull requests:

0.16.1 - 2023-05-25 #

Full Changelog

Merged pull requests:

0.16.0 - 2023-05-25 #

Full Changelog

Closed issues:

  • MeterProvider doesn't yet support resources #87

Merged pull requests:

0.14.4 - 2022-11-10 #

0.15.1 - 2022-11-08 #

Full Changelog

Closed issues:

  • We need a pull request template #82
  • SDK.MetricsOptions.setUnits lack implementation #77
  • MetricOptions.setDescription lacks implementation #76

Merged pull requests:

0.15.0 - 2022-09-14 #

1.0.0 - 2022-09-13 #

Full Changelog

Closed issues:

  • Global setup code should be exposed via the api not via the sdk #80

Merged pull requests:

0.14.3 - 2022-08-18 #

Full Changelog

Closed issues:

  • Repo lacks assets helpful to contributors #69
  • Pub publishing indicates warning related to missing changelog #67
  • opentelemetry-dart should expose CI results to contributors #64

Merged pull requests:

  • O11Y-2149: Resolve changelog warning for publishing to public pub server #68 (dustinlessard-wf)

0.14.2 - 2022-08-17 #

Full Changelog

Merged pull requests:

0.14.1 - 2022-06-14 #

Full Changelog

Merged pull requests:

0.14.0 - 2022-06-03 #

Full Changelog

Merged pull requests:

0.13.0 - 2022-06-03 #

Full Changelog

Merged pull requests:

  • trace shouldn't alter the return type of the function being traced #58 (jasonaguilon-wf)

0.12.1 - 2022-05-26 #

Full Changelog

Merged pull requests:

0.12.0 - 2022-05-26 #

Full Changelog

Merged pull requests:

  • O11Y-1784: Tracing attributes should follow naming convention guidelines #54 (michaelyeager-wf)

0.11.1 - 2022-05-25 #

Full Changelog

Merged pull requests:

  • O11Y-1770: Add required files to opentelemetry-dart repo for OSS #51 (keruitan-wk)

0.11.0 - 2022-05-25 #

Full Changelog

Merged pull requests:

0.10.0 - 2022-05-11 #

Full Changelog

Merged pull requests:

  • O11Y-1489: Update span processors to match otel spec #59 (keruitan-wk)

0.9.4 - 2022-05-10 #

Full Changelog

Merged pull requests:

0.9.3 - 2022-05-09 #

Full Changelog

Merged pull requests:

0.9.2 - 2022-05-06 #

Full Changelog

Merged pull requests:

0.9.1 - 2022-05-04 #

Full Changelog

Merged pull requests:

0.9.0 - 2022-04-29 #

Full Changelog

Merged pull requests:

0.8.0 - 2022-04-27 #

Full Changelog

Merged pull requests:

  • O11Y-1508: Change Span to use high resolution time instead of DateTime.now() #39 (michaelyeager-wf)

0.7.0 - 2022-04-26 #

Full Changelog

Merged pull requests:

0.6.0 - 2022-04-18 #

Full Changelog

Merged pull requests:

0.5.0 - 2022-04-15 #

Full Changelog

Merged pull requests:

0.4.1 - 2022-04-14 #

Full Changelog

Merged pull requests:

0.4.0 - 2022-04-13 #

Full Changelog

Merged pull requests:

  • O11Y-1631: add SpanLimits, implement maxNumAttributes and maxNumAttributeLength #42 (changliu-wk)

0.3.0 - 2022-04-13 #

Full Changelog

Merged pull requests:

0.2.0 - 2022-03-11 #

Full Changelog

Merged pull requests:

  • O11Y-1504: wo11y-dart tracer.trace spans don't end until the parent span ends #41 (michaelyeager-wf)

0.1.21 - 2022-02-24 #

Full Changelog

Merged pull requests:

0.1.20 - 2022-02-24 #

Full Changelog

Merged pull requests:

0.1.19 - 2022-02-24 #

Full Changelog

Merged pull requests:

0.1.18 - 2022-01-12 #

Full Changelog

Merged pull requests:

0.1.17 - 2022-01-06 #

Full Changelog

Merged pull requests:

0.1.16 - 2021-12-20 #

Full Changelog

Merged pull requests:

0.1.15 - 2021-12-17 #

Full Changelog

Merged pull requests:

0.1.14 - 2021-12-10 #

Full Changelog

Merged pull requests:

0.1.13 - 2021-11-22 #

Full Changelog

Merged pull requests:

0.1.12 - 2021-11-16 #

Full Changelog

Merged pull requests:

0.1.11 - 2021-11-15 #

Full Changelog

Merged pull requests:

0.1.10 - 2021-11-15 #

Full Changelog

Merged pull requests:

0.1.9 - 2021-11-11 #

Full Changelog

Merged pull requests:

0.1.8 - 2021-11-01 #

Full Changelog

Merged pull requests:

0.1.7 - 2021-10-28 #

Full Changelog

Merged pull requests:

0.1.6 - 2021-10-28 #

Full Changelog

Merged pull requests:

0.1.5 - 2021-10-21 #

Full Changelog

Merged pull requests:

  • O11Y-1045: opentelemetry-dart must manage different contexts for async code #19 (michaelyeager-wf)

0.1.4 - 2021-10-06 #

Full Changelog

Merged pull requests:

0.1.3 - 2021-10-05 #

Full Changelog

Merged pull requests:

0.1.2 - 2021-10-04 #

Full Changelog

Merged pull requests:

0.1.1 - 2021-10-04 #

Full Changelog

Merged pull requests:

0.1.0 - 2021-10-01 #

Full Changelog

Merged pull requests:

0.0.2 - 2021-08-27 #

Full Changelog

Merged pull requests:

0.0.1 (2021-08-27) #

Full Changelog

Merged pull requests:

* This Changelog was automatically generated by github_changelog_generator