-
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
Changes from 11 commits
99e5a10
1e6a816
a06bb56
437803b
19e45cd
66e61ef
24f9dc3
6442b4d
919bb0a
7b05c73
01a6ccd
567fea3
f68f753
26980e3
491f7df
b474ed9
d2ae1a0
30ea333
cf48a08
442ac62
b19f147
9d6cef4
68e4586
fa24199
b709457
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 |
---|---|---|
|
@@ -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,45 @@ 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? 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. Commented code maybe? 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. Yeah, commented code — it's not
toph-allen marked this conversation as resolved.
Show resolved
Hide resolved
|
||
# 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. | ||
# 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. | ||
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", | ||
toph-allen marked this conversation as resolved.
Show resolved
Hide resolved
|
||
USE.NAMES = FALSE | ||
) | ||
} | ||
|
||
df2[[col_name]] <- NULL | ||
df2 | ||
} | ||
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 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 can see what you mean, and this does align with what you've been saying about other server objects. I hear what you're saying about parsing to data frames for data interchange and I think that approach would be great to use for, say, the integrations endpoints that I just added stories for. For the data from the hits endpoint, presenting it as anything other than a data frame goes back to feeling kinda not-R-idiomatic, as it isn't data that can… hmm… So definitely one of the tasks, and maybe the main task that I can imagine for this data is to, like, treat it as a data frame and filter, plot, etc., it. But another thing you might want to do is, like, get the content item associated with this hit. And yeah, in that case, you might just want to be able to pass the I still think we might want to keep code like this around in an Open to a variety of options — let's discuss what the best approach would be to finalize and merge this PR. 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. Discussed this in the Libraries Guild meeting. Some takeaways:
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. Calling I think these are the approaches open to us, in order of… least to most code in the package:
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. Maybe an option that splits the difference somewhat would be to have the function return a list, provide an 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.
@karawoo I took this approach — take a look and see how it reads to you! |
||
|
||
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 | ||
} | ||
} | ||
] |
Uh oh!
There was an error while loading. Please reload this page.