|
| 1 | +otel_tracer_name <- "org.r-lib.httr2" |
| 2 | +otel_tracer <- NULL |
| 3 | +otel_is_tracing <- FALSE |
| 4 | + |
1 | 5 | # Attaches an Open Telemetry span that abides by the semantic conventions for |
2 | 6 | # HTTP clients to the request, including the associated W3C trace context |
3 | 7 | # headers. |
|
6 | 10 | req_with_span <- function( |
7 | 11 | req, |
8 | 12 | resend_count = 0, |
9 | | - tracer = get_tracer(), |
| 13 | + tracer = otel_tracer, |
10 | 14 | activation_scope = parent.frame(), |
11 | 15 | activate = TRUE |
12 | 16 | ) { |
13 | | - if (!is_tracing(tracer)) { |
| 17 | + if (!tracer_enabled(tracer)) { |
14 | 18 | cli::cli_abort( |
15 | 19 | "Cannot create request span; tracing is not enabled", |
16 | 20 | .internal = TRUE |
@@ -93,22 +97,24 @@ req_record_span_status <- function(req, resp = NULL) { |
93 | 97 | } |
94 | 98 | } |
95 | 99 |
|
96 | | -get_tracer <- function() { |
97 | | - if (!is.null(the$tracer)) { |
98 | | - return(the$tracer) |
99 | | - } |
100 | | - if (!is_installed("otel")) { |
101 | | - return(NULL) |
102 | | - } |
103 | | - if (is_testing()) { |
104 | | - # Don't cache the tracer in unit tests. It interferes with tracer provider |
105 | | - # injection in otelsdk::with_otel_record(). |
106 | | - return(otel::get_tracer("httr2")) |
107 | | - } |
108 | | - the$tracer <- otel::get_tracer("httr2") |
109 | | - the$tracer |
| 100 | +otel_cache_tracer <- function() { |
| 101 | + requireNamespace("otel", quietly = TRUE) || return() |
| 102 | + otel_tracer <<- otel::get_tracer(otel_tracer_name) |
| 103 | + otel_is_tracing <<- tracer_enabled(otel_tracer) |
| 104 | +} |
| 105 | + |
| 106 | +tracer_enabled <- function(tracer) { |
| 107 | + .subset2(tracer, "is_enabled")() |
110 | 108 | } |
111 | 109 |
|
112 | | -is_tracing <- function(tracer = get_tracer()) { |
113 | | - !is.null(tracer) && tracer$is_enabled() |
| 110 | +otel_refresh_tracer <- function(pkgname) { |
| 111 | + requireNamespace("otel", quietly = TRUE) || return() |
| 112 | + ns <- getNamespace(pkgname) |
| 113 | + do.call(unlockBinding, list("otel_is_tracing", ns)) # do.call for R CMD Check |
| 114 | + do.call(unlockBinding, list("otel_tracer", ns)) |
| 115 | + otel_tracer <- otel::get_tracer() |
| 116 | + ns[["otel_is_tracing"]] <- tracer_enabled(otel_tracer) |
| 117 | + ns[["otel_tracer"]] <- otel_tracer |
| 118 | + lockBinding("otel_is_tracing", ns) |
| 119 | + lockBinding("otel_tracer", ns) |
114 | 120 | } |
0 commit comments