Temporarily set OpenTelemetry (OTel) collection level — withOtelCollect
R/otel-with.R
Description
Control Shiny's OTel collection level for particular reactive expression(s).
withOtelCollect() sets the OpenTelemetry collection level for
the duration of evaluating expr. localOtelCollect() sets the collection
level for the remainder of the current function scope.
Arguments
- collect
Character string specifying the OpenTelemetry collection level. Must be one of the following:
- expr
Expression to evaluate with the specified collection level (for
withOtelCollect()).- envir
Environment where the collection level should be set (for
localOtelCollect()). Defaults to the parent frame.
Value
withOtelCollect()returns the value ofexpr.localOtelCollect()is called for its side effect and returns the previouscollectvalue invisibly.
Details
Note that "session" and "reactive_update" levels are not permitted as
these are runtime-specific levels that should only be set permanently via
options(shiny.otel.collect = ...) or the SHINY_OTEL_COLLECT environment
variable, not temporarily during reactive expression creation.
Best practice
Best practice is to set the collection level for code that creates reactive expressions, not code that runs them. For instance:
# Disable telemetry for a reactive expression
withOtelCollect("none", {
my_reactive <- reactive({ ... })
})
# Disable telemetry for a render function
withOtelCollect("none", {
output$my_plot <- renderPlot({ ... })
})
#' # Disable telemetry for an observer
withOtelCollect("none", {
observe({ ... }))
})
# Disable telemetry for an entire module
withOtelCollect("none", {
my_result <- my_module("my_id")
})
# Use `my_result` as normal here
NOTE: It's not recommended to pipe existing reactive objects into
withOtelCollect() since they won't inherit their intended OTel settings,
leading to confusion.
See also
See the shiny.otel.collect option within shinyOptions. Setting
this value will globally control OpenTelemetry collection levels.
Examples
if (FALSE) { # \dontrun{
# Temporarily disable telemetry collection
withOtelCollect("none", {
# Code here won't generate telemetry
reactive({ input$x + 1 })
})
# Collect reactivity telemetry but not other events
withOtelCollect("reactivity", {
# Reactive execution will be traced
observe({ print(input$x) })
})
# Use local variant in a function
my_function <- function() {
localOtelCollect("none")
# Rest of function executes without telemetry
reactive({ input$y * 2 })
}
} # }