-
Notifications
You must be signed in to change notification settings - Fork 26
feat: support new metrics firehose api with get_usage()
#404
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
99e5a10
1e6a816
a06bb56
437803b
19e45cd
66e61ef
24f9dc3
6442b4d
919bb0a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -818,6 +818,33 @@ Connect <- R6::R6Class( | |||||||||||||||||||||||||||
self$GET(path, query = query) | ||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
#' @description Get content usage data. | ||||||||||||||||||||||||||||
#' @param from Optional `Date` or `POSIXt`; start of the time window. If a | ||||||||||||||||||||||||||||
#' `Date`, coerced to `YYYY-MM-DDT00:00:00` in the caller's time zone. | ||||||||||||||||||||||||||||
#' @param to Optional `Date` or `POSIXt`; end of the time window. If a | ||||||||||||||||||||||||||||
#' `Date`, coerced to `YYYY-MM-DDT23:59:59` in the caller's time zone. | ||||||||||||||||||||||||||||
Comment on lines
+821
to
+825
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure this is doing what we expect with timezones. And actually, I'm not even totally sure what is intended. So maybe we should work that out here and then adapt the code to fit? When we send timestamps to Connect with this function do we want them to be transformed to UTC from the caller's local timezone before being sent? Or some other behavior? One thing to note: If I'm reading this correctly, Lines 16 to 28 in e8c8075
|
||||||||||||||||||||||||||||
inst_content_hits = function(from = NULL, to = NULL) { | ||||||||||||||||||||||||||||
error_if_less_than(self$version, "2025.04.0") | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
# If this is called with date objects with no timestamp attached, it's | ||||||||||||||||||||||||||||
# reasonable to assume that the caller is indicating the days as an | ||||||||||||||||||||||||||||
# inclusive range. | ||||||||||||||||||||||||||||
if (inherits(from, "Date")) { | ||||||||||||||||||||||||||||
from <- as.POSIXct(paste(from, "00:00:00")) | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
if (inherits(to, "Date")) { | ||||||||||||||||||||||||||||
to <- as.POSIXct(paste(to, "23:59:59")) | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
self$GET( | ||||||||||||||||||||||||||||
v1_url("instrumentation", "content", "hits"), | ||||||||||||||||||||||||||||
query = list( | ||||||||||||||||||||||||||||
from = make_timestamp(from), | ||||||||||||||||||||||||||||
to = make_timestamp(to) | ||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
#' @description Get running processes. | ||||||||||||||||||||||||||||
procs = function() { | ||||||||||||||||||||||||||||
warn_experimental("procs") | ||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -58,15 +58,19 @@ ensure_column <- function(data, default, name) { | |
# manual fix because vctrs::vec_cast cannot cast double -> datetime or char -> datetime | ||
col <- coerce_datetime(col, default, name = name) | ||
} | ||
|
||
if (inherits(default, "fs_bytes") && !inherits(col, "fs_bytes")) { | ||
col <- coerce_fsbytes(col, default) | ||
} | ||
|
||
if (inherits(default, "integer64") && !inherits(col, "integer64")) { | ||
col <- bit64::as.integer64(col) | ||
} | ||
|
||
if (inherits(default, "list") && !inherits(col, "list")) { | ||
col <- list(col) | ||
} | ||
|
||
col <- vctrs::vec_cast(col, default, x_arg = name) | ||
} | ||
data[[name]] <- col | ||
|
@@ -101,6 +105,65 @@ parse_connectapi <- function(data) { | |
)) | ||
} | ||
|
||
# nolint start | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What linting are we escaping here? |
||
# Unnests a list column similarly to `tidyr::unnest_wider()`, bringing the | ||
# entries of each list-item up to the top level. Makes some simplifying | ||
# assumptions for the sake of performance: | ||
# 1. All inner variables are treated as character vectors; | ||
# 2. The names of the first entry of the list-column are used as the | ||
# names of variables to extract. | ||
# Performance example: | ||
# > nrow(x_raw) | ||
# [1] 373632 | ||
# > nrow(x_raw) | ||
# [1] 373632 | ||
# > t_tidyr <- system.time( | ||
# + x_tidyr <- tidyr::unnest_wider(x_raw, data) | ||
# + ) | ||
# > t_custom <- system.time( | ||
# + x_custom <- fast_unnest_character(x_raw, "data") | ||
# + ) | ||
# > identical(x_tidyr, x_custom) | ||
# [1] TRUE | ||
# > t_tidyr | ||
# user system elapsed | ||
# 7.018 0.137 7.172 | ||
# > t_custom | ||
# user system elapsed | ||
# 0.281 0.005 0.285 | ||
# nolint end | ||
fast_unnest_character <- function(df, col_name) { | ||
if (!is.character(col_name)) { | ||
stop("col_name must be a character vector") | ||
} | ||
if (!col_name %in% names(df)) { | ||
stop("col_name is not present in df") | ||
} | ||
|
||
list_col <- df[[col_name]] | ||
|
||
new_cols <- names(list_col[[1]]) | ||
|
||
df2 <- df | ||
for (col in new_cols) { | ||
df2[[col]] <- vapply( | ||
list_col, | ||
function(row) { | ||
if (is.null(row[[col]])) { | ||
NA_character_ | ||
} else { | ||
row[[col]] | ||
} | ||
}, | ||
"1", | ||
USE.NAMES = FALSE | ||
) | ||
} | ||
|
||
df2[[col_name]] <- NULL | ||
df2 | ||
} | ||
Comment on lines
+135
to
+165
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Thinking about this a bit more: this isn't a huge chunk of code of course, but it is another chunk that we will take on the maintenance of if we go this route. This is another example where having our data interchange within connectapi be all data frames means we have to worry about the performance of json-parsed list responses into data frames and make sure those data frames are in a natural structure for folks to use. If we relied instead on only the parsed list data as our interchange and then gave folks |
||
|
||
coerce_fsbytes <- function(x, to, ...) { | ||
if (is.numeric(x)) { | ||
fs::as_fs_bytes(x) | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
[ | ||
{ | ||
"id": 8966707, | ||
"user_guid": null, | ||
"content_guid": "475618c9", | ||
"timestamp": "2025-04-30T12:49:16.269904Z", | ||
"data": { | ||
"path": "/hello", | ||
"user_agent": "Datadog/Synthetics" | ||
} | ||
}, | ||
{ | ||
"id": 8966708, | ||
"user_guid": null, | ||
"content_guid": "475618c9", | ||
"timestamp": "2025-04-30T12:49:17.002848Z", | ||
"data": { | ||
"path": "/world", | ||
"user_agent": null | ||
} | ||
}, | ||
{ | ||
"id": 8967206, | ||
"user_guid": null, | ||
"content_guid": "475618c9", | ||
"timestamp": "2025-04-30T13:01:47.40738Z", | ||
"data": { | ||
"path": "/chinchilla", | ||
"user_agent": "Datadog/Synthetics" | ||
} | ||
}, | ||
{ | ||
"id": 8967210, | ||
"user_guid": null, | ||
"content_guid": "475618c9", | ||
"timestamp": "2025-04-30T13:04:13.176791Z", | ||
"data": { | ||
"path": "/lava-lamp", | ||
"user_agent": "Datadog/Synthetics" | ||
} | ||
}, | ||
{ | ||
"id": 8966214, | ||
"user_guid": "fecbd383", | ||
"content_guid": "b0eaf295", | ||
"timestamp": "2025-04-30T12:36:13.818466Z", | ||
"data": { | ||
"path": null, | ||
"user_agent": null | ||
} | ||
} | ||
] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can also get rid of
any::cyclocomp
here too, yeah?connectapi/.github/workflows/lint.yaml
Lines 25 to 26 in e8c8075