# ThousandEyes for OpenTelemetry Data Model v1

## Supported Test Types

**Note**: An asterisk (\*) signifies attributes that are commonly found in many tests. Tests that do not include these common attributes typically have other agent-related attributes, such as OneWay metrics, or monitor information for BGP tests.

### Network & App Synthetics Tests

| **Test Type**                    | **Metrics**                                                                                                                                                                                                                                                            | **Specific Attributes**                                                                                                                                                                                                      |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Http Server                      | <ul><li><code>http.metrics.availability</code> (percentage)</li><li><code>http.metrics.throughput</code> (bytes/second)</li><li><code>http.metrics.response.time</code> (milliseconds)</li></ul>                                                                       | <ul><li><code>url</code></li><li><code>server.ip</code></li><li><code>response.code</code></li><li><code>error.type</code></li></ul>                                                                                         |
| Agent-to-Server (Network)        | <ul><li><code>net.metrics.latency</code> (milliseconds)</li><li><code>net.metrics.loss</code> (percentage)</li><li><code>net.metrics.jitter</code> (milliseconds)</li></ul>                                                                                            | <ul><li><code>server.name</code></li><li><code>server.ip</code></li></ul>                                                                                                                                                    |
| One-way Agent-to-Agent (Network) | <ul><li><code>net.metrics.latency</code> (milliseconds)</li><li><code>net.metrics.loss</code> (percentage)</li><li><code>net.metrics.jitter</code> (milliseconds)</li></ul>                                                                                            | <ul><li><code>direction</code></li><li><code>source.agent.*</code></li><li><code>target.agent.*</code></li></ul>                                                                                                             |
| Two-way Agent-to-Agent (Network) | <ul><li><code>net.metrics.latency</code> (milliseconds)</li><li><code>net.metrics.loss</code> (percentage)</li><li><code>net.metrics.jitter</code> (milliseconds)</li></ul>                                                                                            | <ul><li><code>direction</code></li></ul>                                                                                                                                                                                     |
| BGP                              | <ul><li><code>bgp.metrics.path.changes</code> (number)</li><li><code>bgp.metrics.reachability</code> (percentage)</li><li><code>bgp.metrics.updates</code> (number)</li></ul>                                                                                          | <ul><li><code>monitor.id</code></li><li><code>monitor.name</code></li><li><code>monitor.location</code></li><li><code>prefix</code></li><li><code>network.as.path</code></li></ul>                                           |
| Web Transaction                  | <ul><li><code>webtransaction.metrics.transaction.time</code> (milliseconds)</li><li><code>webtransaction.metrics.errors</code> (number: 0 if there are no errors, 1 if there are errors)</li><li><code>webtransaction.metrics.completion</code> (percentage)</li></ul> | <ul><li><code>error.type</code></li><li><code>error.details</code></li></ul>                                                                                                                                                 |
| DNS Server                       | <ul><li><code>dnsserver.metrics.availability</code> (percentage)</li><li><code>dnsserver.metrics.resolution.time</code> (milliseconds)</li></ul>                                                                                                                       | <ul><li><code>error.details</code></li><li><code>server.id</code></li><li><code>server.name</code></li></ul>                                                                                                                 |
| DNSSEC                           | <ul><li><code>dnssec.metrics.validity</code> (percentage)</li></ul>                                                                                                                                                                                                    | <ul><li><code>error.details</code></li></ul>                                                                                                                                                                                 |
| DNS Trace                        | <ul><li><code>dnstrace.metrics.availability</code> (percentage)</li><li><code>dnstrace.metrics.query.time</code> (milliseconds)</li></ul>                                                                                                                              | <ul><li><code>error.details</code></li><li><code>query.count</code></li><li><code>query.failed\_count</code></li><li><code>finalserver</code></li></ul>                                                                      |
| Page Load                        | <ul><li><code>pageload.metrics.completion</code> (percentage)</li><li><code>pageload.metrics.time</code> (milliseconds)</li></ul>                                                                                                                                      | <ul><li><code>error.details</code></li><li><code>error.num</code></li><li><code>response.time.first</code></li><li><code>response.time.dom</code></li><li><code>object.size</code></li><li><code>object.num</code></li></ul> |
| FTP Server                       | <ul><li><code>ftp.metrics.availability</code> (percentage)</li><li><code>ftp.metrics.response.time</code> (milliseconds)</li><li><code>ftp.metrics.throughput</code> (bytes/second)</li></ul>                                                                          | <ul><li><code>error.type</code></li><li><code>server.ip</code></li></ul>                                                                                                                                                     |
| SIP Server                       | <ul><li><code>sip.metrics.availability</code> (percentage)</li><li><code>sip.metrics.response.time</code> (milliseconds)</li><li><code>sip.metrics.total.time</code> (milliseconds)</li></ul>                                                                          | <ul><li><code>error.type</code></li><li><code>error.details</code></li><li><code>server.ip</code></li></ul>                                                                                                                  |
| RTP Stream                       | <ul><li><code>rtp.metrics.mos</code> (score)</li><li><code>rtp.metrics.loss</code> (percentage)</li><li><code>rtp.metrics.discards</code> (percentage)</li><li><code>rtp.metrics.latency</code> (milliseconds)</li></ul>                                               | <ul><li><code>server.ip</code></li></ul>                                                                                                                                                                                     |
| API Test                         | <ul><li><code>api.metrics.completion</code> (percentage)</li><li><code>api.metrics.time</code> (milliseconds)</li></ul>                                                                                                                                                | <ul><li><code>error.type</code></li><li><code>error.details</code></li></ul>                                                                                                                                                 |
| API Test per step                | <ul><li><code>api.step.metrics.completion</code> (percentage)</li><li><code>api.step.metrics.time</code> (milliseconds)</li></ul>                                                                                                                                      | <ul><li><code>step</code></li><li><code>url.full</code></li><li><code>http.request.method</code></li></ul>                                                                                                                   |

### Endpoint Experience Tests

| **Test Type**             | **Metrics**                                                                                                                                                                                      | **Specific Attributes**                                                                                                              |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
| Http Server               | <ul><li><code>http.metrics.availability</code> (percentage)</li><li><code>http.metrics.throughput</code> (bytes/second)</li><li><code>http.metrics.response.time</code> (milliseconds)</li></ul> | <ul><li><code>url</code></li><li><code>server.ip</code></li><li><code>response.code</code></li><li><code>error.type</code></li></ul> |
| Agent-to-Server (Network) | <ul><li><code>net.metrics.latency</code> (milliseconds)</li><li><code>net.metrics.loss</code> (percentage)</li><li><code>net.metrics.jitter</code> (milliseconds)</li></ul>                      | <ul><li><code>server.ip</code></li></ul>                                                                                             |

## Metrics

### Network & App Synthetics Test Data

#### HTTP Server

| **Key**                          | **Data Type**       | **Description**                                                                                                                 |
| -------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **`http.metrics.availability`**  | Float (percentage)  | Calculated depending on the errors reported during the test. In case there is any error, the availability is 0, otherwise 100%. |
| **`http.metrics.throughput`**    | Long (bytes/second) | Throughput of test in bytes/second.                                                                                             |
| **`http.metrics.response.time`** | Long (milliseconds) | Total time it took to execute the request.                                                                                      |

#### Agent-to-Server (Network)

| **Key**                   | **Data Type**       | **Description**                                                 |
| ------------------------- | ------------------- | --------------------------------------------------------------- |
| **`net.metrics.latency`** | Long (milliseconds) | The maximum round trip time for the packets sent to the target. |
| **`net.metrics.loss`**    | Float (percentage)  | Packet loss.                                                    |
| **`net.metrics.jitter`**  | Long (milliseconds) | Standard deviation for the round trip times.                    |

#### Agent-to-Agent (One-Way)

| **Key**                   | **Data Type**       | **Description**                          |
| ------------------------- | ------------------- | ---------------------------------------- |
| **`net.metrics.latency`** | Long (milliseconds) | The average latency for this data point. |
| **`net.metrics.loss`**    | Float (percentage)  | Packet loss.                             |
| **`net.metrics.jitter`**  | Long (milliseconds) | The average jitter for this data point.  |

#### Agent-to-Agent (Two-Way)

| **Key**                   | **Data Type**       | **Description**                          |
| ------------------------- | ------------------- | ---------------------------------------- |
| **`net.metrics.latency`** | Long (milliseconds) | The average latency for this data point. |
| **`net.metrics.loss`**    | Float (percentage)  | The average loss for this data point.    |
| **`net.metrics.jitter`**  | Long (milliseconds) | The average jitter for this data point.  |

#### Web Transaction

| **Key**                                       | **Data Type**       | **Description**                                                                                                      |
| --------------------------------------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------- |
| **`webtransaction.metrics.transaction.time`** | Long (milliseconds) | The time it took the transaction to complete successfully. This metric is not exposed if there are errors.           |
| **`webtransaction.metrics.completion`**       | Float (percentage)  | Percentage of completion of the transaction. 100% if the transaction completes successfully, 0% if there are errors. |
| **`webtransaction.metrics.errors`**           | Long (count)        | Determines whether there were errors or not. 1 if there’s an error processing the transaction, 0 if not.             |

#### DNS Server

| **Key**                                 | **Data Type**       | **Description**                                                                                                                 |
| --------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **`dnsserver.metrics.availability`**    | Float (percentage)  | Calculated depending on the errors reported during the test. In case there is any error, the availability is 0, otherwise 100%. |
| **`dnsserver.metrics.resolution.time`** | Long (milliseconds) | DNS resolve time.                                                                                                               |

#### DNSSEC

| **Key**                       | **Data Type**      | **Description**                                                                                                             |
| ----------------------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------- |
| **`dnssec.metrics.validity`** | Float (percentage) | Calculated depending on the errors reported during the test. In case there is any error, the validity is 0, otherwise 100%. |

#### DNS Trace

| **Key**                             | **Data Type**       | **Description**                                                                                                             |
| ----------------------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **`dnstrace.metrics.availability`** | Float (percentage)  | Calculated depending on the errors reported during the test. In case there is any error, the validity is 0, otherwise 100%. |
| **`dnstrace.metrics.query.time`**   | Long (milliseconds) | Final query time.                                                                                                           |

#### Page load

| **Key**                           | **Data Type**       | **Description**                                                                                                             |
| --------------------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **`pageload.metrics.completion`** | Float (percentage)  | Calculated depending on the errors reported during the test. In case there is any error, the validity is 0, otherwise 100%. |
| **`pageload.metrics.time`**       | Long (milliseconds) | Time to completely load the page.                                                                                           |

#### FTP Server

| **Key**                         | **Data Type**       | **Description**                                                                                                                 |
| ------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **`ftp.metrics.availability`**  | Float (percentage)  | Calculated depending on the errors reported during the test. In case there is any error, the availability is 0, otherwise 100%. |
| **`ftp.metrics.throughput`**    | Long (bytes/second) | Throughput of test in bytes/second.                                                                                             |
| **`ftp.metrics.response.time`** | Long (milliseconds) | Total time it took to get the first byte while executing the request.                                                           |

#### SIP Server

| **Key**                         | **Data Type**       | **Description**                                                                                                                 |
| ------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **`sip.metrics.availability`**  | Float (percentage)  | Calculated depending on the errors reported during the test. In case there is any error, the availability is 0, otherwise 100%. |
| **`sip.metrics.response.time`** | Long (milliseconds) | Total time it took to get the first byte while executing the request.                                                           |
| **`sip.metrics.total.time`**    | Long (milliseconds) | Total time it took until the last response was received.                                                                        |

#### RTP Stream

| **Key**                    | **Data Type**       | **Description**                                                                                                                                                                                 |
| -------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`rtp.metrics.mos`**      | Float (score)       | Mean opinion score (MOS). A measurement of perceived voice quality, ranging from 1 to 5. A MOS of 5 indicates excellent voice call quality, while a MOS of 1 indicates poor voice call quality. |
| **`rtp.metrics.loss`**     | Float (percentage)  | Percentage of frames lost computed from lost frames count and total frames.                                                                                                                     |
| **`rtp.metrics.discards`** | Float (percentage)  | Percentage of frames discarded computed from discarded frames count and total frames.                                                                                                           |
| **`rtp.metrics.latency`**  | Long (milliseconds) | Total time it took for the test round execution.                                                                                                                                                |

#### API

| **Key**                      | **Data Type**       | **Description**                                               |
| ---------------------------- | ------------------- | ------------------------------------------------------------- |
| **`api.metrics.time`**       | Long (milliseconds) | The time the entire API test took to run including all steps. |
| **`api.metrics.completion`** | Float (percentage)  | Percentage of completion of all the steps of the API test.    |

Per request:

| **`api.step.metrics.time`**       | Long (milliseconds) | The time it took the API test to complete the step.                                                                       |
| --------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| **`api.step.metrics.completion`** | Float (percentage)  | Percentage of completion of the step of the API test. 100% if the step is completed successfully, 0% if there are errors. |

### Endpoint Experience Test Data

#### HTTP Server

| **Key**                          | **Data Type**       | **Description**                                                                                                                 |
| -------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **`http.metrics.availability`**  | Float (percentage)  | Calculated depending on the errors reported during the test. In case there is any error, the availability is 0, otherwise 100%. |
| **`http.metrics.throughput`**    | Long (bytes/second) | Throughput of test in bytes/second.                                                                                             |
| **`http.metrics.response.time`** | Long (milliseconds) | Time to first byte to execute the request.                                                                                      |

#### Agent-to-Server (Network)

| **Key**                   | **Data Type**       | **Description**                                                 |
| ------------------------- | ------------------- | --------------------------------------------------------------- |
| **`net.metrics.latency`** | Long (milliseconds) | The maximum round trip time for the packets sent to the target. |
| **`net.metrics.loss`**    | Float (percentage)  | Packet loss.                                                    |
| **`net.metrics.jitter`**  | Long (milliseconds) | Standard deviation for the round trip times.                    |

## Attributes

The OpenTelemtery pipeline supports the following OTel test data attributes:

### Common Resource Attributes

| **Key**                     | **Data Type** | **Description**                                                             |
| --------------------------- | ------------- | --------------------------------------------------------------------------- |
| `thousandeyes.stream.id`    | String (UUID) | ID of the integration used to route the data point to the external service. |
| `thousandeyes.data.version` | String        | Specifies the version of the data model. Possible values: `v1`, `v2`        |

### Common Metric Attributes

| **Key**                        | **Data Type**        | **Description**                                                                                                                                                                                                    |
| ------------------------------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `test.domain`                  | String               | Identifies the origin of the test data. Possible values: `cea` (Network & App Synthetics), `endpoint` (Endpoint Experience).                                                                                       |
| `test.type`                    | String               | Identifies the type of test. Possible values: `"agent-to-agent", "agent-to-server", "dns-dnssec", "dns-server", "dns-trace", "ftp-server", "http-server", "page-load", "voice" , "sip-server, "web-transactions".` |
| `test.name`                    | String               | The name of the ThousandEyes test.                                                                                                                                                                                 |
| `agent.id`\*                   | Int64                | Identifies the ThousandEyes agent that ran the test.                                                                                                                                                               |
| `agent.location`\*             | String               | Agent location.                                                                                                                                                                                                    |
| `agent.geoname.id`\*           | Int64                | The GeoNames ID of the ThousandEyes agent that ran the test. For more information, see \[GeoNames]\(<https://www.geonames.org/about.html>).                                                                        |
| `agent.geo.region.iso_code`\*  | String               | ISO code for the region where the agent is located.                                                                                                                                                                |
| `agent.geo.country.iso_code`\* | String               | ISO code for the country where the agent is located.                                                                                                                                                               |
| `agent.name`\*                 | String               | Agent name.                                                                                                                                                                                                        |
| `datapoint.created`            | Int64 (milliseconds) | Time in milliseconds when the `DataPoint` was created by the agent.                                                                                                                                                |
| `datapoint.id`                 | String               | Unique ID for each data point.                                                                                                                                                                                     |
| `datapoint.received`           | Int64 (milliseconds) | Time in milliseconds when the `DataPoint` was received from Kafka by the collectors.                                                                                                                               |
| `integration.id`               | String (UUID)        | ID of the integration used to route the data point to the external service.                                                                                                                                        |
| `account.id`                   | String               | The ID of the account that the telemetry data is associated with.                                                                                                                                                  |
| `permalink`                    | String (URL)         | URL for the network test instance that generated the data.                                                                                                                                                         |
| `round.id`                     | Int64                | Identifies the network test instance that generated the data.                                                                                                                                                      |
| `test.id`                      | String               | Identifies the ThousandEyes network test.                                                                                                                                                                          |

### Tags as Attributes

Any [*tag*](https://developer.cisco.com/docs/thousandeyes/list-tags/) associated with streamed tests is converted into an attribute of the `DataPoint`.

Additionally, any *tag* associated with Cloud and Enterprise Agents used by tests associated with streams is converted into a `DataPoint` attribute.

Each tag is defined by a `key` and a `value`.

When a tag is converted to an attribute, its `value` is an array containing the `string` elements that are the values associated with the tag's `key`.

If tests and Cloud and Enterprise Agents are assigned to the same *tag*, the unique set of values are provided as attribute values.

{% hint style="warning" %}
Attributes generated from ThousandEyes tags are dropped if the tags include characters that are not allowed by the [OpenTelemetry naming recommendations for attributes](https://opentelemetry.io/docs/specs/semconv/general/naming/#recommendations-for-application-developers).
{% endhint %}

Consider the following scenario:

* A stream is configured with test `1234` and the following tags:
  * `branch:sfo`
  * `branch:nyc`
  * `team:netops`
* The following tags are associated with test `1234`:
  * `branch:sfo`
  * `branch:nyc`
  * `team:netops`
  * `cluster:analytics`
* The following tags are associated with the source agent used by test `1234`:
  * `branch:sfo`
  * `location:us`

The resulting attributes would be structured as follows:

```
scope_metrics {
  metrics {
    gauge {
      attributes {
        key: "branch"
        value {
          array_value: {
            values: [
              {
                string_value: "sfo"
              },
              {
                string_value: "nyc"
              }
            ]
          }
        }
      }
      attributes {
        key: "team"
        value {
          array_value: {
            values: [
              {
                string_value: "netops"
              }
            ]
          }
        }
      }
      attributes {
        key: "cluster"
        value {
          array_value: {
            values: [
              {
                string_value: "analytics"
              }
            ]
          }
        }
      }
      attributes {
        key: "location"
        value {
          array_value: {
            values: [
              {
                string_value: "us"
              }
            ]
          }
        }
      }
    }
  }
}
```

**Notes**:

* The `cluster:analytics` tag is not converted into an attribute because it is not configured in the stream, even though it is associated with the streamed test.
* The `branch:sfo` tag is not added twice to the `DataPoint` because the key-value pair already exists in the attributes.

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Note that not all observability platforms accommodate the use of string arrays for attribute values. For instance, New Relic and Splunk Observability Cloud does not support this format. If your backend does not support string arrays for attributes, the tag attribute is excluded from the metric or the whole datapoint is excluded.</p></div>

### Network & App Synthetics Test Attributes

#### Agent-to-Agent (One Way)

| **Key**                             | **Data Type** | **Description**                                                                                                                                    |
| ----------------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `direction`                         | Enum          | `SOURCE_TO_TARGET` or `TARGET_TO_SOURCE.`                                                                                                          |
| `source.agent.id`                   | Int64         | Identifies the ThousandEyes agent that ran the test.                                                                                               |
| `source.agent.location`             | String        | Source agent location.                                                                                                                             |
| `source.agent.geoname.id`           | Int64         | The GeoNames ID of the ThousandEyes source agent that ran the test. For more information, see \[GeoNames]\(<https://www.geonames.org/about.html>). |
| `source.agent.geo.region.iso_code`  | String        | ISO code for the region where the source agent is located.                                                                                         |
| `source.agent.geo.country.iso_code` | String        | ISO code for the country where the source agent is located.                                                                                        |
| `source.agent.name`                 | String        | Source agent name.                                                                                                                                 |
| `target.agent.id`                   | Int64         | Identifies the ThousandEyes agent that was the target of the network test.                                                                         |
| `target.agent.location`             | String        | Target agent location.                                                                                                                             |
| `target.agent.geoname.id`           | Int64         | The GeoNames ID of the ThousandEyes target agent that ran the test. For more information, see \[GeoNames]\(<https://www.geonames.org/about.html>). |
| `target.agent.geo.region.iso_code`  | String        | ISO code for the region where the target agent is located.                                                                                         |
| `target.agent.geo.country.iso_code` | String        | ISO code for the country where the target agent is located.                                                                                        |
| `target.agent.name`                 | String        | Target agent name.                                                                                                                                 |

#### Agent-to-Agent (Two Way)

| **Key**     | **Data Type** | **Description** |
| ----------- | ------------- | --------------- |
| `direction` | String        | `BIDIRECTIONAL` |

#### BGP

| **Key**            | **Data Type** | **Description**                                                                                                                                                                                                                             |
| ------------------ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `prefix`           | String        | A BGP prefix includes the IP address and the subnet mask. It is assigned to a particular network.                                                                                                                                           |
| `monitor.id`       | String        | The BGP monitor ID. The monitor collects BGP data from different Autonomous Systems (AS) around the world to understand how routes are being propagated.                                                                                    |
| `monitor.name`     | Int64         | The name of the BGP monitor.                                                                                                                                                                                                                |
| `monitor.location` | Int64         | The location of the BGP monitor.                                                                                                                                                                                                            |
| `network.as.path`  | String        | The AS path of the network route. A space-separated list of autonomous system numbers (ASNs) that represents the network route. The path starts with the BGP monitor (leftmost) and ends with the origin network of the prefix (rightmost). |

#### Web Transaction

| **Key**         | **Data Type** | **Description**                                                                                                           |
| --------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `error.type`    | String        | The type of error which occurred during the execution of the transaction. This attribute only exists if there are errors. |
| `error.details` | String        | Details of errors during the execution of the transaction. This attribute only exists if there are errors.                |

#### DNS Server

| **Key**         | **Data Type** | **Description**                                                                          |
| --------------- | ------------- | ---------------------------------------------------------------------------------------- |
| `error.details` | String        | Details of errors during test execution. This attribute only exists if there are errors. |
| `server.id`     | String        | ID of the server targeted by the test.                                                   |
| `server.name`   | String        | Test target server host name.                                                            |

#### DNSSEC

| **Key**         | **Data Type** | **Description**                                                                          |
| --------------- | ------------- | ---------------------------------------------------------------------------------------- |
| `error.details` | String        | Details of errors during test execution. This attribute only exists if there are errors. |

#### DNS Trace

| **Key**              | **Data Type** | **Description**                                                                          |
| -------------------- | ------------- | ---------------------------------------------------------------------------------------- |
| `error.details`      | String        | Details of errors during test execution. This attribute only exists if there are errors. |
| `query.count`        | Int64         | Number of required queries to get to the requested result.                               |
| `query.failed_count` | Int64         | Number of failed queries while getting the requested result.                             |
| `finalserver`        | String        | DNS server that provided the final result.                                               |

#### Page load

| **Key**               | **Data Type** | **Description**                                                                          |
| --------------------- | ------------- | ---------------------------------------------------------------------------------------- |
| `error.details`       | String        | Details of errors during test execution. This attribute only exists if there are errors. |
| `error.num`           | Int64         | Number of objects which encountered errors during download.                              |
| `response.time.first` | float64       | Time to first byte.                                                                      |
| `response.time.dom`   | float64       | Time to interaction.                                                                     |
| `object.size`         | Int64         | Sum of wire size of all objects on page.                                                 |
| `object.num`          | Int64         | Number of objects found on the page.                                                     |

#### FTP Server

| **Key**      | **Data Type** | **Description**                                             |
| ------------ | ------------- | ----------------------------------------------------------- |
| `server.ip`  | String        | IP of the server targeted by the FTP test.                  |
| `error.type` | String        | The error type for the test (not set if there is no error). |

#### SIP Server

| **Key**         | **Data Type** | **Description**                                                                                              |
| --------------- | ------------- | ------------------------------------------------------------------------------------------------------------ |
| `server.ip`     | String        | IP of the server targeted by the SIP test (or SIP proxy, if proxy is configured).                            |
| `error.type`    | String        | The error type for the test (not set if there is no error).                                                  |
| `error.details` | String        | Details about the error which occurred during the execution. This attribute only exists if there are errors. |

#### API

| **Key**         | **Data Type** | **Description**                                                                                                              |
| --------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `error.type`    | String        | The type of error which occurred during the execution of the API test. This attribute only exists if there are errors.       |
| `error.details` | String        | Details about the error which occurred during the execution of the API test. This attribute only exists if there are errors. |

#### API Step

| **Key**               | **Data Type** | **Description**            |
| --------------------- | ------------- | -------------------------- |
| `step`                | Int           | The step ID.               |
| `url.full`            | String        | HTTP request absolute URL. |
| `http.request.method` | String        | HTTP request method.       |

### Endpoint Experience Test Attributes

#### HTTP Server

| **Key**         | **Data Type** | **Description**                                                    |
| --------------- | ------------- | ------------------------------------------------------------------ |
| `url`           | String        | The final URL after redirects.                                     |
| `server.ip`     | String        | IP of the server targeted by the network test.                     |
| `response.code` | Int64         | HTTP response status code (only set if there was a HTTP response). |
| `error.type`    | String        | The error type for the test (not set if there is no error).        |

#### Agent-to-Server (Network)

| **Key**       | **Data Type** | **Description**                                |
| ------------- | ------------- | ---------------------------------------------- |
| `server.name` | String        | The final URL after redirects.                 |
| `server.ip`   | String        | IP of the server targeted by the network test. |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.thousandeyes.com/product-documentation/integration-guides/opentelemetry/data-model/data-model-v1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
