---
title: Build Dashboards with Code Coverage Data
description: >-
  Build Datadog dashboards on Code Coverage events: track repository coverage
  and break it down by service, code owner, or flag.
breadcrumbs: Docs > Code Coverage > Build Dashboards with Code Coverage Data
---

# Build Dashboards with Code Coverage Data

{% callout %}
# Important note for users on the following Datadog sites: app.ddog-gov.com, us2.ddog-gov.com

{% alert level="danger" %}
This product is not supported for your selected [Datadog site](https://docs.datadoghq.com/getting_started/site.md). ({% placeholder "user-datadog-site-name" /%}).
{% /alert %}

{% /callout %}

## Overview{% #overview %}

Code Coverage events are available as a data source in [Datadog dashboards](https://app.datadoghq.com/dashboard/lists). This page describes the event model, the facets you can query, and the query patterns for the most common widgets.

## Coverage event model{% #coverage-event-model %}

Each report uploaded with `datadog-ci coverage upload` produces several events in Datadog:

- One **repository event** that represents the report as a whole. This event carries no `@service`, `@codeowner`, or `@report.flag` tag.
- One **per-service event** for each [service](https://docs.datadoghq.com/code_coverage/monorepo_support.md) the report covers, tagged with `@service`.
- One **per-code-owner event** for each [code owner](https://docs.datadoghq.com/code_coverage/monorepo_support.md) the report covers, tagged with `@codeowner`.
- One **per-flag event** for each [flag](https://docs.datadoghq.com/code_coverage/flags.md) applied to the report, tagged with `@report.flag`.

Any dashboard query that doesn't isolate one of these event types ends up combining all of them and counting the same report multiple times. The query examples below demonstrate selecting exactly one event type at a time.

## Available query facets{% #available-query-facets %}

| Facet               | Description                                                                                                                                                                                                       |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| @git.repository.id  | URL-style repository identifier in lowercase, without the scheme; for example, `github.com/datadog/documentation`. Scope every widget query to a single repository.                                               |
| @git.default_branch | `true` on events from the repository's default branch. Add this only when a widget should report on the default branch. Use it instead of `@git.branch` when the default branch name differs across repositories. |
| @git.branch         | Branch name; for example, `main`. Use to target a specific named branch.                                                                                                                                          |
| @git.commit.sha     | Commit the report was uploaded for. Useful as a `group by` for per-commit timeseries.                                                                                                                             |
| @service            | Service name. Present only on per-service events.                                                                                                                                                                 |
| @codeowner          | Code owner team. Present only on per-code-owner events.                                                                                                                                                           |
| @report.flag        | Flag name. Present only on per-flag events.                                                                                                                                                                       |

## Build coverage widgets{% #build-coverage-widgets %}

Each example is the query filter for one widget. Replace `<REPOSITORY_ID>` with the lowercase, URL-style identifier of your repository (for example, `github.com/datadog/documentation`).

{% alert level="info" %}
The breakdown examples (by service, code owner, and flag) do not restrict by branch. They aggregate coverage across every branch that has uploaded reports, including feature branches and pull requests. Add `@git.default_branch:true` or `@git.branch:<BRANCH_NAME>` to limit a widget to a specific branch.
{% /alert %}

### Track overall coverage on the default branch{% #track-overall-coverage-on-the-default-branch %}

Use this filter in a Query Value widget for the current coverage number, or a Timeseries widget for a trend line over time.

```text
@git.repository.id:<REPOSITORY_ID> @git.default_branch:true -@split:true -@report.flag:*
```

`-@split:true` excludes per-service and per-code-owner events, and `-@report.flag:*` excludes per-flag events, leaving only the repository event.

### Break down coverage by service{% #break-down-coverage-by-service %}

Compare coverage across the services in a monorepo. Use this filter in a Top List or a Timeseries widget, grouped by `@service`.

```text
@git.repository.id:<REPOSITORY_ID> @service:*
```

### Break down coverage by code owner{% #break-down-coverage-by-code-owner %}

Compare coverage across teams. Use this filter in a Top List or a Timeseries widget, grouped by `@codeowner`.

```text
@git.repository.id:<REPOSITORY_ID> @codeowner:*
```

### Break down coverage by flag{% #break-down-coverage-by-flag %}

Compare coverage across [flags](https://docs.datadoghq.com/code_coverage/flags.md), for example by test type or runtime version. Use this filter in a Top List or a Timeseries widget, grouped by `@report.flag`.

```text
@git.repository.id:<REPOSITORY_ID> @report.flag:*
```

### Example: coverage on `main` for a specific repository{% #example-coverage-on-main-for-a-specific-repository %}

```text
@git.repository.id:github.com/datadog/documentation @git.branch:main -@split:true -@report.flag:*
```

This example uses `@git.branch:main` to target a named branch. To follow the default branch on any repository, use `@git.default_branch:true` instead.

## Further reading{% #further-reading %}

- [Code Coverage](https://docs.datadoghq.com/code_coverage.md)
- [Set up Code Coverage](https://docs.datadoghq.com/code_coverage/setup.md)
- [Organize coverage data with flags](https://docs.datadoghq.com/code_coverage/flags.md)
- [Use Code Coverage in monorepos](https://docs.datadoghq.com/code_coverage/monorepo_support.md)
