Skip to content

recorders

recorders

Functions:

Name Description
stage_timer

Record wall time for a stage when collection is active.

record_stage

Record a pre-timed stage measurement if collection is active.

record_ndd_workflow

Record one DataDesigner workflow execution through the adapter boundary.

record_model_workflow

Record one sanitized model-backed workflow execution.

record_run_metadata

Record sanitized run/config metadata once per anonymizer run.

stage_timer(stage, **fields)

Record wall time for a stage when collection is active.

Source code in src/anonymizer/measurement/recorders.py
@contextmanager
def stage_timer(stage: str, **fields: Any) -> Iterator[dict[str, Any]]:
    """Record wall time for a stage when collection is active."""
    collector = current_collector()
    if collector is None:
        yield fields
        return

    started = time.perf_counter()
    status = "completed"
    try:
        yield fields
    except BaseException:
        status = "error"
        raise
    finally:
        elapsed_sec = time.perf_counter() - started
        collector.record(
            "stage",
            stage=stage,
            status=status,
            elapsed_sec=elapsed_sec,
            **fields,
            **_row_throughput_fields(
                elapsed_sec=elapsed_sec,
                input_row_count=_coerce_int(fields.get("input_row_count"), default=-1),
                output_row_count=_coerce_int(fields.get("output_row_count"), default=-1),
            ),
        )

record_stage(stage, *, elapsed_sec, status='completed', **fields)

Record a pre-timed stage measurement if collection is active.

Source code in src/anonymizer/measurement/recorders.py
def record_stage(stage: str, *, elapsed_sec: float, status: str = "completed", **fields: Any) -> None:
    """Record a pre-timed stage measurement if collection is active."""
    collector = current_collector()
    if collector is None:
        return
    collector.record(
        "stage",
        stage=stage,
        status=status,
        elapsed_sec=elapsed_sec,
        **fields,
        **_row_throughput_fields(
            elapsed_sec=elapsed_sec,
            input_row_count=_coerce_int(fields.get("input_row_count"), default=-1),
            output_row_count=_coerce_int(fields.get("output_row_count"), default=-1),
        ),
    )

record_ndd_workflow(*, workflow_name, model_aliases, input_row_count, output_row_count, failed_record_count, elapsed_sec, status='completed', seed_row_count=None, preview_num_records=None, column_count=None, column_names=None, model_usage=None)

Record one DataDesigner workflow execution through the adapter boundary.

Source code in src/anonymizer/measurement/recorders.py
def record_ndd_workflow(
    *,
    workflow_name: str,
    model_aliases: list[str],
    input_row_count: int,
    output_row_count: int | None,
    failed_record_count: int | None,
    elapsed_sec: float,
    status: str = "completed",
    seed_row_count: int | None = None,
    preview_num_records: int | None = None,
    column_count: int | None = None,
    column_names: list[str] | None = None,
    model_usage: Mapping[str, Any] | None = None,
) -> None:
    """Record one DataDesigner workflow execution through the adapter boundary."""
    _record_model_workflow(
        workflow_name=workflow_name,
        model_aliases=model_aliases,
        input_row_count=input_row_count,
        output_row_count=output_row_count,
        failed_record_count=failed_record_count,
        elapsed_sec=elapsed_sec,
        status=status,
        seed_row_count=seed_row_count,
        preview_num_records=preview_num_records,
        column_count=column_count,
        column_names=column_names,
        model_usage=model_usage,
        record_type="ndd_workflow",
        extra_fields=None,
    )

record_model_workflow(*, workflow_name, model_aliases, input_row_count, output_row_count, failed_record_count, elapsed_sec, status='completed', seed_row_count=None, preview_num_records=None, column_count=None, column_names=None, model_usage=None, extra_fields=None)

Record one sanitized model-backed workflow execution.

Use this for non-DataDesigner model calls that still need benchmark accounting. Raw prompts, text, responses, and replacement values do not belong in model_usage.

Source code in src/anonymizer/measurement/recorders.py
def record_model_workflow(
    *,
    workflow_name: str,
    model_aliases: list[str],
    input_row_count: int,
    output_row_count: int | None,
    failed_record_count: int | None,
    elapsed_sec: float,
    status: str = "completed",
    seed_row_count: int | None = None,
    preview_num_records: int | None = None,
    column_count: int | None = None,
    column_names: list[str] | None = None,
    model_usage: Mapping[str, Any] | None = None,
    extra_fields: Mapping[str, Any] | None = None,
) -> None:
    """Record one sanitized model-backed workflow execution.

    Use this for non-DataDesigner model calls that still need benchmark
    accounting. Raw prompts, text, responses, and replacement values do not
    belong in ``model_usage``.
    """
    _record_model_workflow(
        workflow_name=workflow_name,
        model_aliases=model_aliases,
        input_row_count=input_row_count,
        output_row_count=output_row_count,
        failed_record_count=failed_record_count,
        elapsed_sec=elapsed_sec,
        status=status,
        seed_row_count=seed_row_count,
        preview_num_records=preview_num_records,
        column_count=column_count,
        column_names=column_names,
        model_usage=model_usage,
        record_type="model_workflow",
        extra_fields=extra_fields,
    )

record_run_metadata(*, config, data, mode, strategy, input_row_count, preview_num_records, model_configs)

Record sanitized run/config metadata once per anonymizer run.

Source code in src/anonymizer/measurement/recorders.py
def record_run_metadata(
    *,
    config: Any,
    data: Any,
    mode: str,
    strategy: str,
    input_row_count: int,
    preview_num_records: int | None,
    model_configs: list[Any],
) -> None:
    """Record sanitized run/config metadata once per anonymizer run."""
    collector = current_collector()
    if collector is None:
        return

    detect = getattr(config, "detect", None)
    source = str(getattr(data, "source", ""))
    collector.record(
        "run",
        mode=mode,
        strategy=strategy,
        input_row_count=input_row_count,
        preview_num_records=preview_num_records,
        source_hash=collector.record_hash(row_index="source", text=source),
        input_source=_source_metadata(source),
        input_text_column=str(getattr(data, "text_column", "")),
        input_has_id_column=bool(getattr(data, "id_column", None)),
        input_has_data_summary=bool(getattr(data, "data_summary", None)),
        detect=_detect_config_metadata(detect),
        replace=_replace_config_metadata(getattr(config, "replace", None)),
        rewrite=_rewrite_config_metadata(getattr(config, "rewrite", None)),
        models=[_model_config_metadata(model_config) for model_config in model_configs],
        runtime=_runtime_metadata(),
    )