diff --git a/extensions/usage-metrics-dashboard/.gitignore b/extensions/usage-metrics-dashboard/.gitignore index edcac17f..d4720efb 100644 --- a/extensions/usage-metrics-dashboard/.gitignore +++ b/extensions/usage-metrics-dashboard/.gitignore @@ -1,2 +1,3 @@ .posit/ app_cache/ +.Renviron diff --git a/extensions/usage-metrics-dashboard/R/otel.R b/extensions/usage-metrics-dashboard/R/otel.R new file mode 100644 index 00000000..6ef79425 --- /dev/null +++ b/extensions/usage-metrics-dashboard/R/otel.R @@ -0,0 +1,3 @@ +is_otel_tracing <- function() { + requireNamespace("otel", quietly = TRUE) && otel::is_tracing_enabled() +} diff --git a/extensions/usage-metrics-dashboard/R/visit_processing.R b/extensions/usage-metrics-dashboard/R/visit_processing.R index cee7f49a..01958cec 100644 --- a/extensions/usage-metrics-dashboard/R/visit_processing.R +++ b/extensions/usage-metrics-dashboard/R/visit_processing.R @@ -8,6 +8,9 @@ filter_visits_by_time_window <- function(visits, session_window) { if (session_window == 0) { return(visits) } else { + if (is_otel_tracing()) { + otel::start_local_active_span("filter visits by time window") + } visits |> group_by(content_guid, user_guid) |> # Compute time diffs and filter out hits within the session diff --git a/extensions/usage-metrics-dashboard/app.R b/extensions/usage-metrics-dashboard/app.R index 9290f72a..3f2fcf7c 100644 --- a/extensions/usage-metrics-dashboard/app.R +++ b/extensions/usage-metrics-dashboard/app.R @@ -1,3 +1,17 @@ +library(otel) +library(otelsdk) + +otel_tracer_name <- "co.posit.connect-extensions.usage-metrics-dashboard" + +if (is_otel_tracing()) { + print("OTEL ENABLED") + initialization_span <- otel::start_local_active_span( + "initialization" + ) +} else { + print("OTEL DISABLED") +} + library(shiny) library(bslib) library(shinyjs) @@ -61,6 +75,10 @@ content_usage_table_search_method = JS( ) ui <- function(request) { + if (is_otel_tracing()) { + otel::start_local_active_span("ui") + } + page_sidebar( useShinyjs(), theme = bs_theme(version = 5), @@ -269,6 +287,9 @@ ui <- function(request) { } server <- function(input, output, session) { + if (is_otel_tracing()) { + otel::start_local_active_span("server") + } # Set up Connect client; handle error if Visitor API Key integration isn't # present. @@ -604,6 +625,9 @@ server <- function(input, output, session) { bindCache(active_user_guid) usage_data_meta <- reactive({ + if (is_otel_tracing()) { + otel::start_local_active_span("load usage data") + } req(active_user_role %in% c("administrator", "publisher")) from <- as.POSIXct(paste(date_range()$from, "00:00:00"), tz = "") to <- as.POSIXct(paste(date_range()$to, "23:59:59"), tz = "") @@ -635,6 +659,9 @@ server <- function(input, output, session) { # Filter the raw data based on selected scope, app mode and session window usage_data_visits <- reactive({ + if (is_otel_tracing()) { + otel::start_local_active_span("filter usage data") + } req(content()) scope_filtered_usage <- usage_data_raw() |> filter(content_guid %in% content()$guid) @@ -656,6 +683,9 @@ server <- function(input, output, session) { # Create data for the main table and summary export. multi_content_table_data <- reactive({ + if (is_otel_tracing()) { + otel::start_local_active_span("multi-content table: process data") + } req(nrow(usage_data_visits()) > 0) usage_summary <- usage_data_visits() |> group_by(content_guid) |> @@ -747,6 +777,11 @@ server <- function(input, output, session) { " output$content_usage_table <- renderReactable({ + otel::log("Logging from the Usage Metrics Dashboard") + + if (is_otel_tracing()) { + otel::start_local_active_span("multi-content table: render") + } data <- multi_content_table_data() table <- reactable( @@ -894,12 +929,18 @@ server <- function(input, output, session) { # Single-content detail view data ---- selected_content_usage <- reactive({ + if (is_otel_tracing()) { + otel::start_local_active_span("single-content view: filter data") + } req(selected_guid()) usage_data_raw() |> filter(content_guid == selected_guid()) }) all_visits_data <- reactive({ + if (is_otel_tracing()) { + otel::start_local_active_span("single-content view: all visits data") + } all_visits <- selected_content_usage() |> # Compute time diffs and filter out hits within the session group_by(user_guid) |> @@ -925,6 +966,11 @@ server <- function(input, output, session) { }) aggregated_visits_data <- reactive({ + if (is_otel_tracing()) { + otel::start_local_active_span( + "single-content view: aggregated visits data" + ) + } filtered_visits <- selected_content_usage() |> group_by(user_guid) |> @@ -953,6 +999,11 @@ server <- function(input, output, session) { # Single-content detail view UI and outputs ---- output$aggregated_visits <- renderReactable({ + if (is_otel_tracing()) { + otel::start_local_active_span( + "single-content view: render aggregated visits table" + ) + } reactable( aggregated_visits_reactable_data(), selection = "multiple", @@ -999,6 +1050,11 @@ server <- function(input, output, session) { }) output$all_visits <- renderReactable({ + if (is_otel_tracing()) { + otel::start_local_active_span( + "single-content view: render all visits table" + ) + } reactable( all_visits_data(), defaultSorted = "timestamp", @@ -1153,6 +1209,11 @@ server <- function(input, output, session) { }) output$daily_visits_plot <- renderPlotly({ + if (is_otel_tracing()) { + otel::start_local_active_span( + "single-content view: render visits plotly" + ) + } p <- ggplot( daily_hit_data(), aes( @@ -1168,6 +1229,11 @@ server <- function(input, output, session) { }) output$visit_timeline_plot <- renderPlotly({ + if (is_otel_tracing()) { + otel::start_local_active_span( + "single-content view: render visits timeline" + ) + } visit_order <- aggregated_visits_data()$display_name data <- all_visits_data() |> mutate(display_name = factor(display_name, levels = rev(visit_order))) @@ -1237,4 +1303,9 @@ server <- function(input, output, session) { } enableBookmarking("url") + +if (is_otel_tracing()) { + otel::end_span(initialization_span) +} + shinyApp(ui, server) diff --git a/extensions/usage-metrics-dashboard/renv.lock b/extensions/usage-metrics-dashboard/renv.lock index 6dd404bf..9d102adf 100644 --- a/extensions/usage-metrics-dashboard/renv.lock +++ b/extensions/usage-metrics-dashboard/renv.lock @@ -136,10 +136,10 @@ }, "Rcpp": { "Package": "Rcpp", - "Version": "1.0.14", + "Version": "1.1.0", "Source": "Repository", "Title": "Seamless R and C++ Integration", - "Date": "2025-01-11", + "Date": "2025-07-01", "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", "Imports": [ @@ -159,9 +159,9 @@ "RoxygenNote": "6.1.1", "Encoding": "UTF-8", "NeedsCompilation": "yes", - "Author": "Dirk Eddelbuettel [aut, cre] (), Romain Francois [aut] (), JJ Allaire [aut] (), Kevin Ushey [aut] (), Qiang Kou [aut] (), Nathan Russell [aut], Iñaki Ucar [aut] (), Doug Bates [aut] (), John Chambers [aut]", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), JJ Allaire [aut] (ORCID: ), Kevin Ushey [aut] (ORCID: ), Qiang Kou [aut] (ORCID: ), Nathan Russell [aut], Iñaki Ucar [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), John Chambers [aut]", "Maintainer": "Dirk Eddelbuettel ", - "Repository": "CRAN" + "Repository": "RSPM" }, "askpass": { "Package": "askpass", @@ -443,7 +443,7 @@ }, "commonmark": { "Package": "commonmark", - "Version": "1.9.5", + "Version": "2.0.0", "Source": "Repository", "Type": "Package", "Title": "High Performance CommonMark and Github Markdown Rendering in R", @@ -461,7 +461,7 @@ "Language": "en-US", "Encoding": "UTF-8", "NeedsCompilation": "yes", - "Author": "Jeroen Ooms [aut, cre] (), John MacFarlane [cph] (Author of cmark)", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), John MacFarlane [cph] (Author of cmark)", "Maintainer": "Jeroen Ooms ", "Repository": "CRAN" }, @@ -570,36 +570,6 @@ "Maintainer": "Davis Vaughan ", "Repository": "CRAN" }, - "crayon": { - "Package": "crayon", - "Version": "1.5.3", - "Source": "Repository", - "Title": "Colored Terminal Output", - "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Brodie\", \"Gaslam\", , \"brodie.gaslam@yahoo.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "The crayon package is now superseded. Please use the 'cli' package for new projects. Colored terminal output on terminals that support 'ANSI' color and highlight codes. It also works in 'Emacs' 'ESS'. 'ANSI' color support is automatically detected. Colors and highlighting can be combined and nested. New styles can also be created easily. This package was inspired by the 'chalk' 'JavaScript' project.", - "License": "MIT + file LICENSE", - "URL": "https://r-lib.github.io/crayon/, https://github.com/r-lib/crayon", - "BugReports": "https://github.com/r-lib/crayon/issues", - "Imports": [ - "grDevices", - "methods", - "utils" - ], - "Suggests": [ - "mockery", - "rstudioapi", - "testthat", - "withr" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.1", - "Collate": "'aaa-rstudio-detect.R' 'aaaa-rematch2.R' 'aab-num-ansi-colors.R' 'aac-num-ansi-colors.R' 'ansi-256.R' 'ansi-palette.R' 'combine.R' 'string.R' 'utils.R' 'crayon-package.R' 'disposable.R' 'enc-utils.R' 'has_ansi.R' 'has_color.R' 'link.R' 'styles.R' 'machinery.R' 'parts.R' 'print.R' 'style-var.R' 'show.R' 'string_operations.R'", - "NeedsCompilation": "no", - "Author": "Gábor Csárdi [aut, cre], Brodie Gaslam [ctb], Posit Software, PBC [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, "crosstalk": { "Package": "crosstalk", "Version": "1.2.1", @@ -1519,36 +1489,38 @@ }, "later": { "Package": "later", - "Version": "1.4.2", + "Version": "1.4.4", "Source": "Repository", "Type": "Package", "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", - "Authors@R": "c( person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@posit.co\"), person(\"Joe\", \"Cheng\", role = c(\"aut\"), email = \"joe@posit.co\"), person(\"Charlie\", \"Gao\", role = c(\"aut\"), email = \"charlie.gao@shikokuchuo.net\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(family = \"Posit Software, PBC\", role = \"cph\"), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", - "URL": "https://r-lib.github.io/later/, https://github.com/r-lib/later", - "BugReports": "https://github.com/r-lib/later/issues", "License": "MIT + file LICENSE", + "URL": "https://later.r-lib.org, https://github.com/r-lib/later", + "BugReports": "https://github.com/r-lib/later/issues", "Imports": [ "Rcpp (>= 0.12.9)", "rlang" ], - "LinkingTo": [ - "Rcpp" - ], - "RoxygenNote": "7.3.2", "Suggests": [ "knitr", "nanonext", - "R6", "rmarkdown", - "testthat (>= 2.1.0)" + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" ], "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-18", "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", "NeedsCompilation": "yes", - "Author": "Winston Chang [aut, cre], Joe Cheng [aut], Charlie Gao [aut] (), Posit Software, PBC [cph], Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", - "Maintainer": "Winston Chang ", - "Repository": "CRAN" + "Author": "Winston Chang [aut], Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Maintainer": "Charlie Gao ", + "Repository": "RSPM" }, "lattice": { "Package": "lattice", @@ -1704,11 +1676,11 @@ }, "magrittr": { "Package": "magrittr", - "Version": "2.0.3", + "Version": "2.0.4", "Source": "Repository", "Type": "Package", "Title": "A Forward-Pipe Operator for R", - "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"cre\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"cre\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", "Description": "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, \"Ceci n'est pas un pipe.\"", "License": "MIT + file LICENSE", "URL": "https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr", @@ -1727,11 +1699,11 @@ "ByteCompile": "Yes", "Config/Needs/website": "tidyverse/tidytemplate", "Encoding": "UTF-8", - "RoxygenNote": "7.1.2", + "RoxygenNote": "7.3.3", "NeedsCompilation": "yes", - "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], RStudio [cph, fnd]", - "Maintainer": "Lionel Henry ", - "Repository": "CRAN" + "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "memoise": { "Package": "memoise", @@ -1884,6 +1856,83 @@ "Maintainer": "Jeroen Ooms ", "Repository": "CRAN" }, + "otel": { + "Package": "otel", + "Version": "0.2.0", + "Source": "Repository", + "Title": "OpenTelemetry R API", + "Authors@R": "person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "High-quality, ubiquitous, and portable telemetry to enable effective observability. OpenTelemetry is a collection of tools, APIs, and SDKs used to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. This package implements the OpenTelemetry API: . Use this package as a dependency if you want to instrument your R package for OpenTelemetry.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "cli", + "glue", + "jsonlite", + "otelsdk", + "processx", + "shiny", + "spelling", + "testthat (>= 3.0.0)", + "utils", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "URL": "https://otel.r-lib.org, https://github.com/r-lib/otel", + "Additional_repositories": "https://github.com/r-lib/otelsdk/releases/download/devel", + "BugReports": "https://github.com/r-lib/otel/issues", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" + }, + "otelsdk": { + "Package": "otelsdk", + "Version": "0.2.2", + "Source": "Repository", + "Title": "'R' 'SDK' and Exporters for 'OpenTelemetry'", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(family = \"opentelemetry-cpp authors\", role = \"ctb\") )", + "Description": "'OpenTelemetry' is a collection of tools, 'APIs', and 'SDKs' used to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. This package contains the 'OpenTelemetry' 'SDK', and exporters. Use this package to export traces, metrics, logs from instrumented 'R' code. Use the 'otel' package to instrument your 'R' code for 'OpenTelemetry'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "cmake, protobuf-compiler, libprotobuf, libcurl, zlib, GNU make", + "Imports": [ + "otel", + "utils" + ], + "Suggests": [ + "callr", + "cli", + "curl", + "gh", + "jsonlite", + "processx", + "ps", + "rlang", + "spelling", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "URL": "https://otelsdk.r-lib.org, https://github.com/r-lib/otelsdk", + "Config/Needs/check": "r-lib/otel, gaborcsardi/testthatlabs", + "Config/Needs/coverage": "r-lib/otel, gaborcsardi/testthatlabs", + "Config/Needs/website": "tidyverse/tidytemplate, r-lib/otel", + "BugReports": "https://github.com/r-lib/otelsdk/issues", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd] (ROR: ), opentelemetry-cpp authors [ctb]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, "pillar": { "Package": "pillar", "Version": "1.10.2", @@ -2043,47 +2092,49 @@ }, "promises": { "Package": "promises", - "Version": "1.3.3", + "Version": "1.4.0", "Source": "Repository", "Type": "Package", "Title": "Abstractions for Promise-Based Asynchronous Programming", - "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", "Description": "Provides fundamental abstractions for doing asynchronous programming in R using promises. Asynchronous programming is useful for allowing a single R process to orchestrate multiple tasks in the background while also attending to something else. Semantics are similar to 'JavaScript' promises, but with a syntax that is idiomatic R.", "License": "MIT + file LICENSE", "URL": "https://rstudio.github.io/promises/, https://github.com/rstudio/promises", "BugReports": "https://github.com/rstudio/promises/issues", + "Depends": [ + "R (>= 4.1.0)" + ], "Imports": [ "fastmap (>= 1.1.0)", "later", + "lifecycle", "magrittr (>= 1.5)", + "otel (>= 0.2.0)", "R6", - "Rcpp", - "rlang", - "stats" + "rlang" ], "Suggests": [ "future (>= 1.21.0)", "knitr", + "mirai", + "otelsdk (>= 0.2.0)", "purrr", + "Rcpp", "rmarkdown", "spelling", "testthat (>= 3.0.0)", "vembedr" ], - "LinkingTo": [ - "later", - "Rcpp" - ], "VignetteBuilder": "knitr", "Config/Needs/website": "rsconnect, tidyverse/tidytemplate", "Config/testthat/edition": "3", "Config/usethis/last-upkeep": "2025-05-27", "Encoding": "UTF-8", "Language": "en-US", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "yes", - "Author": "Joe Cheng [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Joe Cheng ", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut, cre] (ORCID: ), Winston Chang [aut] (ORCID: ), Charlie Gao [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Barret Schloerke ", "Repository": "CRAN" }, "purrr": { @@ -2480,72 +2531,81 @@ }, "shiny": { "Package": "shiny", - "Version": "1.10.0", - "Source": "Repository", + "Version": "1.11.1.9001", + "Source": "GitHub", "Type": "Package", "Title": "Web Application Framework for R", - "Authors@R": "c( person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@posit.co\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@posit.co\"), person(\"JJ\", \"Allaire\", role = \"aut\", email = \"jj@posit.co\"), person(\"Carson\", \"Sievert\", role = \"aut\", email = \"carson@posit.co\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", role = \"aut\", email = \"barret@posit.co\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Yihui\", \"Xie\", role = \"aut\", email = \"yihui@posit.co\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", role = \"aut\", email = \"jonathan@posit.co\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(family = \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(family = \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(family = \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(family = \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(family = \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"John\", \"Fraser\", role = c(\"ctb\", \"cph\"), comment = \"showdown.js library\"), person(\"John\", \"Gruber\", role = c(\"ctb\", \"cph\"), comment = \"showdown.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(family = \"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", "License": "GPL-3 | file LICENSE", + "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", + "BugReports": "https://github.com/rstudio/shiny/issues", "Depends": [ - "R (>= 3.0.2)", - "methods" + "methods", + "R (>= 3.0.2)" ], "Imports": [ - "utils", + "bslib (>= 0.6.0)", + "cachem (>= 1.1.0)", + "cli", + "commonmark (>= 2.0.0)", + "fastmap (>= 1.1.1)", + "fontawesome (>= 0.4.0)", + "glue (>= 1.3.2)", "grDevices", + "htmltools (>= 0.5.4)", "httpuv (>= 1.5.2)", - "mime (>= 0.3)", "jsonlite (>= 0.9.16)", - "xtable", - "fontawesome (>= 0.4.0)", - "htmltools (>= 0.5.4)", + "later (>= 1.0.0)", + "lifecycle (>= 0.2.0)", + "mime (>= 0.3)", + "otel", + "promises (>= 1.4.0)", "R6 (>= 2.0)", + "rlang (>= 0.4.10)", "sourcetools", - "later (>= 1.0.0)", - "promises (>= 1.3.2)", "tools", - "crayon", - "rlang (>= 0.4.10)", - "fastmap (>= 1.1.1)", + "utils", "withr", - "commonmark (>= 1.7)", - "glue (>= 1.3.2)", - "bslib (>= 0.6.0)", - "cachem (>= 1.1.0)", - "lifecycle (>= 0.2.0)" + "xtable" ], "Suggests": [ + "Cairo (>= 1.5-5)", "coro (>= 1.1.0)", "datasets", "DT", - "Cairo (>= 1.5-5)", - "testthat (>= 3.0.0)", - "knitr (>= 1.6)", - "markdown", - "rmarkdown", + "dygraphs", + "future", "ggplot2", - "reactlog (>= 1.0.0)", + "knitr (>= 1.6)", "magrittr", - "yaml", - "future", - "dygraphs", + "markdown", + "mirai", + "otelsdk (>= 0.2.0)", "ragg", + "reactlog (>= 1.0.0)", + "rmarkdown", + "sass", "showtext", - "sass" + "testthat (>= 3.2.1)", + "watcher", + "yaml" ], - "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", - "BugReports": "https://github.com/rstudio/shiny/issues", - "Collate": "'globals.R' 'app-state.R' 'app_template.R' 'bind-cache.R' 'bind-event.R' 'bookmark-state-local.R' 'bookmark-state.R' 'bootstrap-deprecated.R' 'bootstrap-layout.R' 'conditions.R' 'map.R' 'utils.R' 'bootstrap.R' 'busy-indicators-spinners.R' 'busy-indicators.R' 'cache-utils.R' 'deprecated.R' 'devmode.R' 'diagnose.R' 'extended-task.R' 'fileupload.R' 'graph.R' 'reactives.R' 'reactive-domains.R' 'history.R' 'hooks.R' 'html-deps.R' 'image-interact-opts.R' 'image-interact.R' 'imageutils.R' 'input-action.R' 'input-checkbox.R' 'input-checkboxgroup.R' 'input-date.R' 'input-daterange.R' 'input-file.R' 'input-numeric.R' 'input-password.R' 'input-radiobuttons.R' 'input-select.R' 'input-slider.R' 'input-submit.R' 'input-text.R' 'input-textarea.R' 'input-utils.R' 'insert-tab.R' 'insert-ui.R' 'jqueryui.R' 'knitr.R' 'middleware-shiny.R' 'middleware.R' 'timer.R' 'shiny.R' 'mock-session.R' 'modal.R' 'modules.R' 'notifications.R' 'priorityqueue.R' 'progress.R' 'react.R' 'reexports.R' 'render-cached-plot.R' 'render-plot.R' 'render-table.R' 'run-url.R' 'runapp.R' 'serializers.R' 'server-input-handlers.R' 'server-resource-paths.R' 'server.R' 'shiny-options.R' 'shiny-package.R' 'shinyapp.R' 'shinyui.R' 'shinywrappers.R' 'showcase.R' 'snapshot.R' 'staticimports.R' 'tar.R' 'test-export.R' 'test-server.R' 'test.R' 'update-input.R' 'utils-lang.R' 'version_bs_date_picker.R' 'version_ion_range_slider.R' 'version_jquery.R' 'version_jqueryui.R' 'version_selectize.R' 'version_strftime.R' 'viewer.R'", - "RoxygenNote": "7.3.2", - "Encoding": "UTF-8", - "RdMacros": "lifecycle", - "Config/testthat/edition": "3", "Config/Needs/check": "shinytest2", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.3", + "Collate": "'globals.R' 'app-state.R' 'app_template.R' 'bind-cache.R' 'bind-event.R' 'bookmark-state-local.R' 'bookmark-state.R' 'bootstrap-deprecated.R' 'bootstrap-layout.R' 'conditions.R' 'map.R' 'utils.R' 'bootstrap.R' 'busy-indicators-spinners.R' 'busy-indicators.R' 'cache-utils.R' 'deprecated.R' 'devmode.R' 'diagnose.R' 'extended-task.R' 'fileupload.R' 'graph.R' 'reactives.R' 'reactive-domains.R' 'history.R' 'hooks.R' 'html-deps.R' 'image-interact-opts.R' 'image-interact.R' 'imageutils.R' 'input-action.R' 'input-checkbox.R' 'input-checkboxgroup.R' 'input-date.R' 'input-daterange.R' 'input-file.R' 'input-numeric.R' 'input-password.R' 'input-radiobuttons.R' 'input-select.R' 'input-slider.R' 'input-submit.R' 'input-text.R' 'input-textarea.R' 'input-utils.R' 'insert-tab.R' 'insert-ui.R' 'jqueryui.R' 'knitr.R' 'middleware-shiny.R' 'middleware.R' 'timer.R' 'shiny.R' 'mock-session.R' 'modal.R' 'modules.R' 'notifications.R' 'otel-attr-srcref.R' 'otel-bind.R' 'otel-error.R' 'otel-label.R' 'otel-reactive-update.R' 'otel-session.R' 'otel-shiny.R' 'priorityqueue.R' 'progress.R' 'react.R' 'reexports.R' 'render-cached-plot.R' 'render-plot.R' 'render-table.R' 'run-url.R' 'runapp.R' 'serializers.R' 'server-input-handlers.R' 'server-resource-paths.R' 'server.R' 'shiny-options.R' 'shiny-package.R' 'shinyapp.R' 'shinyui.R' 'shinywrappers.R' 'showcase.R' 'snapshot.R' 'staticimports.R' 'tar.R' 'test-export.R' 'test-server.R' 'test.R' 'update-input.R' 'utils-lang.R' 'utils-tags.R' 'version_bs_date_picker.R' 'version_ion_range_slider.R' 'version_jquery.R' 'version_jqueryui.R' 'version_selectize.R' 'version_strftime.R' 'viewer.R'", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteRepo": "shiny", + "RemoteUsername": "rstudio", + "RemoteRef": "HEAD", + "RemoteSha": "b56c275364c8a7e609274a61b775ef2e003f6399", "NeedsCompilation": "no", - "Author": "Winston Chang [aut, cre] (), Joe Cheng [aut], JJ Allaire [aut], Carson Sievert [aut] (), Barret Schloerke [aut] (), Yihui Xie [aut], Jeff Allen [aut], Jonathan McPherson [aut], Alan Dipert [aut], Barbara Borges [aut], Posit Software, PBC [cph, fnd], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Prem Nawaz Khan [ctb] (Bootstrap accessibility plugin), Victor Tsaran [ctb] (Bootstrap accessibility plugin), Dennis Lembree [ctb] (Bootstrap accessibility plugin), Srinivasu Chakravarthula [ctb] (Bootstrap accessibility plugin), Cathy O'Connor [ctb] (Bootstrap accessibility plugin), PayPal, Inc [cph] (Bootstrap accessibility plugin), Stefan Petre [ctb, cph] (Bootstrap-datepicker library), Andrew Rowls [ctb, cph] (Bootstrap-datepicker library), Brian Reavis [ctb, cph] (selectize.js library), Salmen Bejaoui [ctb, cph] (selectize-plugin-a11y library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library), SpryMedia Limited [ctb, cph] (DataTables library), John Fraser [ctb, cph] (showdown.js library), John Gruber [ctb, cph] (showdown.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), R Core Team [ctb, cph] (tar implementation from R)", - "Maintainer": "Winston Chang ", - "Repository": "CRAN" + "Author": "Winston Chang [aut] (), Joe Cheng [aut], JJ Allaire [aut], Carson Sievert [aut, cre] (), Barret Schloerke [aut] (), Garrick Aden-Buie [aut] (), Yihui Xie [aut], Jeff Allen [aut], Jonathan McPherson [aut], Alan Dipert [aut], Barbara Borges [aut], Posit Software, PBC [cph, fnd] (03wc8by49), jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Prem Nawaz Khan [ctb] (Bootstrap accessibility plugin), Victor Tsaran [ctb] (Bootstrap accessibility plugin), Dennis Lembree [ctb] (Bootstrap accessibility plugin), Srinivasu Chakravarthula [ctb] (Bootstrap accessibility plugin), Cathy O'Connor [ctb] (Bootstrap accessibility plugin), PayPal, Inc [cph] (Bootstrap accessibility plugin), Stefan Petre [ctb, cph] (Bootstrap-datepicker library), Andrew Rowls [ctb, cph] (Bootstrap-datepicker library), Brian Reavis [ctb, cph] (selectize.js library), Salmen Bejaoui [ctb, cph] (selectize-plugin-a11y library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library), SpryMedia Limited [ctb, cph] (DataTables library), Ivan Sagalaev [ctb, cph] (highlight.js library), R Core Team [ctb, cph] (tar implementation from R)", + "Maintainer": "Carson Sievert " }, "shinycssloaders": { "Package": "shinycssloaders",