github rstudio/shiny v1.12.0
shiny 1.12.0

2 hours ago

OpenTelemetry support

  • Shiny now supports OpenTelemetry via
    {otel}. By default, if
    otel::is_tracing_enabled() returns TRUE, then {shiny} records all
    OpenTelemetry spans. See {otelsdk}'s Collecting Telemetry
    Data
    for more details
    on configuring OpenTelemetry. (#4269, #4300)

  • Supported values for options(shiny.otel.collect) (or
    Sys.getenv("SHINY_OTEL_COLLECT")):

    • "none" - No Shiny OpenTelemetry tracing.
    • "session" - Adds session start/end spans.
    • "reactive_update" - Spans for any synchronous/asynchronous reactive
      update. (Includes "session" features).
    • "reactivity" - Spans for all reactive expressions. (Includes
      "reactive_update" features).
    • "all" [default] - All Shiny OpenTelemetry tracing. Currently equivalent
      to "reactivity".
  • OpenTelemetry spans are recorded for:

    • session_start: Wraps the calling of the server() function. Also
      contains HTTP request within the attributes.
    • session_end: Wraps the calling of the onSessionEnded() handlers.
    • reactive_update: Signals the start of when Shiny knows something is to
      be calculated. This span ends when there are no more reactive updates
      (promises or synchronous) to be calculated.
    • reactive, observe, output: Captures the calculation (including any
      async promise chains) of a reactive expression (reactive()), an observer
      (observe()), or an output render function (render*()).
    • reactive debounce, reactive throttle: Captures the calculation
      (including any async promise chains) of a debounce()d or throttle()d
      reactive expression.
    • reactiveFileReader, reactivePoll: Captures the calculation
      (including any async promise chains) of a reactiveFileReader() or
      reactivePoll().
    • ExtendedTask: Captures the calculation (including any async promise
      chains) of an ExtendedTask.
  • OpenTelemetry Logs are recorded for:

    • Set reactiveVal <name> - When a reactiveVal() is set
    • Set reactiveValues <name>$<key> - When a reactiveValues() element is
      set
    • Fatal or unhandled errors - When an error occurs that causes the session
      to end, or when an unhandled error occurs in a reactive context. Contains
      the error within the attributes. To unsanitize the error message being
      collected, set options(shiny.otel.sanitize.errors = FALSE).
    • Set ExtendedTask <name> <value> - When an ExtendedTask's respective
      reactive value (e.g., status, value, and error) is set.
    • <ExtendedTask name> add to queue - When an ExtendedTask is added to
      the task queue.
  • All OpenTelemetry logs and spans will contain a session.id attribute
    containing the active session ID.

New features

  • updateActionButton() and updateActionLink() now accept values other than
    shiny::icon() for the icon argument (e.g., fontawesome::fa(),
    bsicons::bs_icon(), etc). (#4249)

Bug fixes and minor improvements

  • Showcase mode now uses server-side markdown rendering with the
    {commonmark} package, providing support for GitHub Flavored Markdown
    features (tables, strikethrough, autolinks, task lists). While most existing
    README.md files should continue to work as expected, some minor rendering
    differences may occur due to the change in markdown processor. (#4202,
    #4201)

  • debounce(), reactiveFileReader(), reactivePoll(), reactiveValues(),
    and throttle() now attempt to retrieve the assigned name for the default
    label if the srcref is available. If a value cannot easily be produced, a
    default label is used instead. (#4269, #4300)

  • The default label for items described below will now attempt to retrieve the
    assigned name if the srcref is available. If a value can not easily be
    produced, a default label will be used instead. This should improve the
    OpenTelemetry span labels and the reactlog experience. (#4269, #4300)

    • reactiveValues(), reactivePoll(), reactiveFileReader(), debounce(),
      throttle(), observe()
    • Combinations of bindEvent() and reactive() / observe()
    • Combination of bindCache() and reactive()
  • updateActionButton() and updateActionLink() now correctly render HTML
    content passed to the label argument. (#4249)

  • updateSelectizeInput() no longer creates multiple remove buttons when
    options = list(plugins="remove_button") is used. (#4275)

  • dateRangeInput()/updateDateRangeInput() now correctly considers the time
    zones of date-time objects (POSIXct) passed to the start, end, min and
    max arguments. (thanks @ismirsehregal, #4318)

Breaking changes

  • The return value of actionButton() and actionLink() now wraps label
    and icon in an additional HTML container element. This allows
    updateActionButton() and updateActionLink() to distinguish between the
    label and icon when making updates, and allows spacing between label
    and icon to be more easily customized via CSS.

Don't miss a new shiny release

NewReleases is sending notifications on new releases.