Skip to content

13. Custom data

Custom data allows you to attach metadata to object lists at two levels: per-object and per-log (root level). This metadata flows through the Evaluation Pipeline, is available for evaluator definition, appears as run attributes in Foretify Manager, and is visible in the Single Run Debugger.

13.1 Object-level custom data

Attach key-value pairs to individual objects in the object list to pass object-specific information. Use this data for checking, coverage collection, and custom modifiers.

In the protobuf definition, each object has a custom_data field:

repeated Pair custom_data = 21; // key-value string pairs

Each Pair contains a string key and a string value. The key must follow variable name conventions.

13.1.1 Setting object-level custom data

When creating an object list, add custom data entries to each object as needed:

custom_data = obj.custom_data.add()
custom_data.key = "my_attribute"
custom_data.value = "my_value"

Object-level custom data is available in OSC2 scenarios through the custom_data field of actors and can be used in watcher modifiers, checkers, and coverage functions.

13.2 Root-level custom data

Attach global metadata that describes log-level properties to the Root message. This is the recommended approach for metadata that applies to the entire log rather than to individual objects.

map<string, ftx.proto.AdditionalInfoData> custom_data = 16;

Unlike object-level custom data (which uses simple string pairs), root-level custom data supports rich typed values through the AdditionalInfoData message.

13.2.1 Supported value types

Type Protobuf field Description
String string_value Text value
Integer int64_value 64-bit signed integer
Unsigned integer uint64_value 64-bit unsigned integer
Double double_value Floating-point number
Boolean bool_value True or false
Enum enum_value Enum type name, string, and integer value
Duration duration_value Time duration
Timestamp timestamp_value Point in time
Link link URL with optional display name

13.2.2 Setting root-level custom data

When building the object list, populate the custom_data map on the Root message:

from shared_pb2 import AdditionalInfoData

root = Root()
entry = root.custom_data["source_url"]
entry.string_value = "s3://my-bucket/data/my-recording.zip"

entry = root.custom_data["record_id"]
entry.string_value = "2990270a-34b1-4104-aa50-1dd685fb12fa"

The map keys must follow variable name conventions (alphanumeric characters and underscores).

13.3 Custom data in the Evaluation Pipeline

13.3.1 Denoising

The denoiser can filter object-level custom data based on configuration. Define filter parameters in the denoiser configuration YAML file using the custom_data_filter_params section.

13.3.2 Evaluation traceability

Root-level custom data is propagated into the EvaluationTraceability message during pipeline processing:

message EvaluationTraceability {
    // ...
    map<string, AdditionalInfoData> custom_data = 7;
}

This ensures the metadata is preserved through ingestion and is included in the run summary that gets uploaded to Foretify Manager.

13.4 Custom data in Foretify Manager

When run results are uploaded to Foretify Manager, each key-value pair in evaluationTraceability.customData is automatically registered as a run attribute in the database.

  • If the attribute does not already exist, Foretify Manager creates it (similar to custom attributes in triage).
  • The attribute name is the custom data key, and the attribute value is the custom data value.
  • Attributes are subject to a slot limit. The default limit is 200 attributes and the maximum is 800. If the limit is reached, additional keys are dropped and a warning is logged. To change the limit, set the following property in application.properties:
test-run.evaluation-attributes.max-attributes=200

13.4.1 Viewing custom data in the Runs page

Custom data attributes appear as columns in the Runs page table. Add or remove these columns using the column selector to display the custom data fields relevant to your analysis.

13.4.2 Filtering by custom data

Custom data attributes are available as run filters in workspaces. For example, filter by source_url to focus on runs from a specific data source, or by record_id to locate a specific recording.

To filter and sort runs programmatically, see Evaluation Attributes in SDK.

13.4.3 Viewing custom data in the Single Run Debugger

Custom data is visible in the Single Run Debugger in two places:

  • Summary page — Root-level custom data fields appear under Evaluation Data alongside other evaluation traceability information such as split count and overlap.
  • Trace area — Root-level custom data appears under Evaluation Data.

For example, if you set source_url and record_id as root-level custom data in the object list, these fields appear in the summary page under Evaluation Data with their corresponding values.