Last updated:
Eval Result Records
Evals is in beta. Eval runs are not charged during the beta. Behavior and UI may change. Attributes prefixed with dash0.gen_ai.evaluation are in development and may change.
Dash0 stores every eval verdict as a log record. Use these records to query results in the Logs Explorer, or to build your own views, dashboards, and check rules on eval results. The built-in GenAI Evaluation Results logs view lists them with their type, eval name, label, and explanation.
Record Structure
- Event name:
gen_ai.evaluation.result. - Severity:
INFO. - Timestamp: The end time of the judged span, so a verdict falls in the same time bucket as the span it describes. The observed timestamp records when the judge produced the verdict.
- Trace and span IDs: The IDs of the judged span. Use them to correlate the record with its span.
- Resource: The resource of the judged span.
- Body: The eval name and the result, for example
Groundedness: 0.42,Answered the question: true, orRequest topic: billing.
Result Attributes
Each record carries attributes from the OpenTelemetry GenAI semantic conventions and Dash0-specific dash0.gen_ai.evaluation attributes.
OpenTelemetry GenAI Attributes
| Attribute | Description |
|---|---|
gen_ai.evaluation.name | Identifier of the eval, derived from its name when it was created. |
gen_ai.evaluation.score.value | The numeric score. For boolean evals, 1 for true and 0 for false. For categorical evals, the zero-based position of the label in the eval's label list. |
gen_ai.evaluation.score.label | For numeric and boolean evals, pass or fail. A numeric eval without a threshold always records pass. For categorical evals, the label the judge chose. |
gen_ai.evaluation.explanation | The judge's one-sentence explanation. |
gen_ai.response.id | The ID of the judge's response. |
To find failing results, filter on gen_ai.evaluation.score.label = fail. Categorical evals have no pass or fail outcome, so filter on the label you want to find instead, for example abuse.
Dash0 Attributes
| Attribute | Description |
|---|---|
dash0.gen_ai.evaluation.display_name | The eval's display name. |
dash0.gen_ai.evaluation.type | The output type: numeric, boolean, or categorical. |
dash0.gen_ai.evaluation.id | The ID of the eval definition. |
dash0.gen_ai.evaluation.version | The version of the eval definition that produced the verdict. |
dash0.gen_ai.evaluation.source | judge for verdicts produced by a Dash0 eval. |
dash0.gen_ai.evaluation.judge.model | The model class of the judge: light or standard. |
Usage Attributes
| Attribute | Description |
|---|---|
dash0.gen_ai.evaluation.usage.input_tokens | Input tokens the judge consumed, excluding cache reads and cache writes. |
dash0.gen_ai.evaluation.usage.output_tokens | Output tokens the judge generated. |
dash0.gen_ai.evaluation.usage.cache_read.input_tokens | Input tokens the judge read from the prompt cache. |
dash0.gen_ai.evaluation.usage.cache_creation.input_tokens | Input tokens the judge wrote to the prompt cache. |
dash0.gen_ai.evaluation.usage.credits | The credits computed for the judge call. This is the amount shown in the Credits column and the Breakdown card. Eval runs are not charged during the beta. |
Attributes Copied from the Judged Span
Each record also carries these attributes from the judged span when the span has them, so you can filter and group results the same way you filter spans:
- Agent and conversation:
gen_ai.agent.name,gen_ai.conversation.id,gen_ai.operation.name,gen_ai.harness.name. - Model:
gen_ai.provider.name,gen_ai.request.model. - Usage of the judged call:
gen_ai.usage.input_tokens,gen_ai.usage.output_tokens,gen_ai.usage.cache_creation.input_tokens,gen_ai.usage.cache_read.input_tokens,dash0.gen_ai.usage.cost. These describe the judged call, not the judge. - User and team:
user.id,user.name,user.email,dash0.team.name. - Version control:
dash0.gen_ai.vcs.provider.name,dash0.gen_ai.vcs.owner.name,dash0.gen_ai.vcs.repository.name,dash0.gen_ai.vcs.repository.url.full,dash0.gen_ai.vcs.ref.head.name,dash0.gen_ai.vcs.ref.head.type. - Instrumentation scope:
dash0.gen_ai.original_scope_nameholds the instrumentation scope name of the judged span, because the record's own scope is the Dash0 eval pipeline.
Failed Evaluations
When the judge call fails, Dash0 still writes a gen_ai.evaluation.result record for the span. The record carries the eval, usage, and copied attributes, plus an error.type attribute, but no score, label, or explanation. The Evals pages and the span sidebar ignore these records.
error.type | Meaning |
|---|---|
timeout | The judge did not respond in time. |
judge_call_failed | The call to the judge model failed. |
model_class_unavailable | The eval's model class is not available. |
no_response, no_text_output | The judge returned no usable output. |
output_truncated | The judge's answer was cut off. |
unparsable_output | The judge's answer did not have the expected shape. |
missing_score, invalid_score | A numeric verdict had no score, or a score outside 0.0 to 1.0. |
missing_value | A boolean verdict had no value. |
unknown_label | A categorical verdict named a label the eval does not define. |
empty_explanation | The judge returned no explanation. |
Spans that Dash0 skips before calling the judge, for example because a referenced attribute is missing, produce no record at all. See Limitations.
Further Reading
- Analyze Eval Results — Read scores, outcomes, and labels per eval and per span.
- Key Concepts — Terminology for triggers, sampling, verdicts, and credits.
- Logging — Query and filter log records in the Logs Explorer.