Skip to content

Commit 10b2fb4

Browse files
etserendclaude
andcommitted
feat(export): expose include_code_metric_metadata on export_records (HYBIM-788)
Port upstream commit e42a569 from rungalileo/galileo-python. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 5e30937 commit 10b2fb4

3 files changed

Lines changed: 44 additions & 1 deletion

File tree

src/splunk_ao/export.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def records(
4040
experiment_id: str | None = None,
4141
column_ids: list[str] | None = None,
4242
redact: bool = True,
43+
include_code_metric_metadata: bool = False,
4344
) -> Iterator[dict[str, Any]]:
4445
if filters is None:
4546
filters = []
@@ -56,6 +57,7 @@ def records(
5657
column_ids=column_ids,
5758
sort=sort,
5859
redact=redact,
60+
include_code_metric_metadata=include_code_metric_metadata,
5961
),
6062
)
6163

@@ -78,8 +80,9 @@ def export_records(
7880
experiment_id: str | None = None,
7981
column_ids: list[str] | None = None,
8082
redact: bool = True,
83+
include_code_metric_metadata: bool = False,
8184
) -> Iterator[dict[str, Any]]:
82-
"""Exports records from a Galileo project.
85+
"""Exports records from a Splunk AO project.
8386
8487
Defaults to the first logstream if `log_stream_id` and `experiment_id` are not provided.
8588
@@ -103,6 +106,10 @@ def export_records(
103106
A sort clause to order the exported records.
104107
redact
105108
Redact sensitive data from the response.
109+
include_code_metric_metadata
110+
If True, include per-row scorer metadata (the dict returned alongside the score by
111+
code-based scorers via the (score, metadata) tuple-return contract) on each
112+
MetricSuccess in the export. Off by default to keep payloads small.
106113
107114
Returns
108115
-------
@@ -132,4 +139,5 @@ def export_records(
132139
column_ids=column_ids,
133140
sort=sort,
134141
redact=redact,
142+
include_code_metric_metadata=include_code_metric_metadata,
135143
)

src/splunk_ao/resources/models/log_records_export_request.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class LogRecordsExportRequest:
4444
'LogRecordsTextFilter']]]): Filters to apply on the export
4545
sort (Union['LogRecordsSortClause', None, Unset]): Sort clause for the export. Defaults to native sort
4646
(created_at, id descending).
47+
include_code_metric_metadata (Union[Unset, bool]): If True, include per-row scorer metadata (the dict
48+
returned alongside the score by code-based scorers via the (score, metadata) tuple-return contract) on
49+
each MetricSuccess in the export. Default: False.
4750
"""
4851

4952
root_type: RootType
@@ -69,6 +72,7 @@ class LogRecordsExportRequest:
6972
]
7073
) = UNSET
7174
sort: Union["LogRecordsSortClause", None, Unset] = UNSET
75+
include_code_metric_metadata: Unset | bool = False
7276
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
7377

7478
def to_dict(self) -> dict[str, Any]:
@@ -136,6 +140,8 @@ def to_dict(self) -> dict[str, Any]:
136140
else:
137141
sort = self.sort
138142

143+
include_code_metric_metadata = self.include_code_metric_metadata
144+
139145
field_dict: dict[str, Any] = {}
140146
field_dict.update(self.additional_properties)
141147
field_dict.update({"root_type": root_type})
@@ -157,6 +163,8 @@ def to_dict(self) -> dict[str, Any]:
157163
field_dict["filters"] = filters
158164
if sort is not UNSET:
159165
field_dict["sort"] = sort
166+
if include_code_metric_metadata is not UNSET:
167+
field_dict["include_code_metric_metadata"] = include_code_metric_metadata
160168

161169
return field_dict
162170

@@ -313,6 +321,8 @@ def _parse_sort(data: object) -> Union["LogRecordsSortClause", None, Unset]:
313321

314322
sort = _parse_sort(d.pop("sort", UNSET))
315323

324+
include_code_metric_metadata = d.pop("include_code_metric_metadata", UNSET)
325+
316326
log_records_export_request = cls(
317327
root_type=root_type,
318328
column_ids=column_ids,
@@ -324,6 +334,7 @@ def _parse_sort(data: object) -> Union["LogRecordsSortClause", None, Unset]:
324334
metrics_testing_id=metrics_testing_id,
325335
filters=filters,
326336
sort=sort,
337+
include_code_metric_metadata=include_code_metric_metadata,
327338
)
328339

329340
log_records_export_request.additional_properties = d

tests/test_export.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,27 @@ def test_export_records_redact(mock_export_records_stream, redact_param):
272272
mock_export_records_stream.assert_called_once()
273273
request_body = mock_export_records_stream.call_args.kwargs["body"]
274274
assert request_body.redact == redact_param
275+
276+
277+
@patch("splunk_ao.export.export_records_stream")
278+
def test_export_records_include_code_metric_metadata_default(mock_export_records_stream):
279+
project_id = str(uuid4())
280+
mock_export_records_stream.return_value = iter([])
281+
282+
list(export_records(project_id=project_id, log_stream_id=str(uuid4())))
283+
284+
request_body = mock_export_records_stream.call_args.kwargs["body"]
285+
assert request_body.include_code_metric_metadata is False
286+
assert request_body.to_dict()["include_code_metric_metadata"] is False
287+
288+
289+
@patch("splunk_ao.export.export_records_stream")
290+
def test_export_records_include_code_metric_metadata_opt_in(mock_export_records_stream):
291+
project_id = str(uuid4())
292+
mock_export_records_stream.return_value = iter([])
293+
294+
list(export_records(project_id=project_id, log_stream_id=str(uuid4()), include_code_metric_metadata=True))
295+
296+
request_body = mock_export_records_stream.call_args.kwargs["body"]
297+
assert request_body.include_code_metric_metadata is True
298+
assert request_body.to_dict()["include_code_metric_metadata"] is True

0 commit comments

Comments
 (0)