Files
coder/docs/reference/api/insights.md
T
Sas Swart cfcb81fb0f fix: user status change chart accommodates DST (#22191)
closes https://github.com/coder/internal/issues/464

# Summary

This PR resolves a flaky test that was sensitive to DST transitions in
various time zones. The root of the flake was:
* a bug; the query and its tests assume 24 hours per day
* the tests used local system time, which resulted in failures for dates
proximal to DST transitions

# Changes

Query:

The original query assumed 24 hour intervals between each day, which is
not a valid assumption. It now increments `1 day` at a time.

Database tests:

Database level tests for the query all assumed 24 hour days. They now
increment in DST-aware days instead. Instead of using time.Now() as a
base for testing, the test uses a series of dates over the course of an
entire year, to ensure that DST transition dates are present in every
test run.

# API Endpoint

The endpoint that delivers the user status chart now accepts an IANA
timezone name as a parameter and passes it, keeping the existing offset
as a fallback, to the database query.

API level tests were added to ensure the correct response form and error
behaviour. Correctness of content is tested at the database level.
2026-03-04 12:54:39 +02:00

313 lines
9.2 KiB
Markdown
Generated

# Insights
## Get deployment DAUs
### Code samples
```shell
# Example request using curl
curl -X GET http://coder-server:8080/api/v2/insights/daus?tz_offset=0 \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
```
`GET /insights/daus`
### Parameters
| Name | In | Type | Required | Description |
|-------------|-------|---------|----------|----------------------------|
| `tz_offset` | query | integer | true | Time-zone offset (e.g. -2) |
### Example responses
> 200 Response
```json
{
"entries": [
{
"amount": 0,
"date": "string"
}
],
"tz_hour_offset": 0
}
```
### Responses
| Status | Meaning | Description | Schema |
|--------|---------------------------------------------------------|-------------|----------------------------------------------------------|
| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | [codersdk.DAUsResponse](schemas.md#codersdkdausresponse) |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
## Get insights about templates
### Code samples
```shell
# Example request using curl
curl -X GET http://coder-server:8080/api/v2/insights/templates?start_time=2019-08-24T14%3A15%3A22Z&end_time=2019-08-24T14%3A15%3A22Z&interval=week \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
```
`GET /insights/templates`
### Parameters
| Name | In | Type | Required | Description |
|----------------|-------|-------------------|----------|--------------|
| `start_time` | query | string(date-time) | true | Start time |
| `end_time` | query | string(date-time) | true | End time |
| `interval` | query | string | true | Interval |
| `template_ids` | query | array[string] | false | Template IDs |
#### Enumerated Values
| Parameter | Value(s) |
|------------|---------------|
| `interval` | `day`, `week` |
### Example responses
> 200 Response
```json
{
"interval_reports": [
{
"active_users": 14,
"end_time": "2019-08-24T14:15:22Z",
"interval": "week",
"start_time": "2019-08-24T14:15:22Z",
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
],
"report": {
"active_users": 22,
"apps_usage": [
{
"display_name": "Visual Studio Code",
"icon": "string",
"seconds": 80500,
"slug": "vscode",
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"times_used": 2,
"type": "builtin"
}
],
"end_time": "2019-08-24T14:15:22Z",
"parameters_usage": [
{
"description": "string",
"display_name": "string",
"name": "string",
"options": [
{
"description": "string",
"icon": "string",
"name": "string",
"value": "string"
}
],
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"type": "string",
"values": [
{
"count": 0,
"value": "string"
}
]
}
],
"start_time": "2019-08-24T14:15:22Z",
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
}
```
### Responses
| Status | Meaning | Description | Schema |
|--------|---------------------------------------------------------|-------------|----------------------------------------------------------------------------------|
| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | [codersdk.TemplateInsightsResponse](schemas.md#codersdktemplateinsightsresponse) |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
## Get insights about user activity
### Code samples
```shell
# Example request using curl
curl -X GET http://coder-server:8080/api/v2/insights/user-activity?start_time=2019-08-24T14%3A15%3A22Z&end_time=2019-08-24T14%3A15%3A22Z \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
```
`GET /insights/user-activity`
### Parameters
| Name | In | Type | Required | Description |
|----------------|-------|-------------------|----------|--------------|
| `start_time` | query | string(date-time) | true | Start time |
| `end_time` | query | string(date-time) | true | End time |
| `template_ids` | query | array[string] | false | Template IDs |
### Example responses
> 200 Response
```json
{
"report": {
"end_time": "2019-08-24T14:15:22Z",
"start_time": "2019-08-24T14:15:22Z",
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"users": [
{
"avatar_url": "http://example.com",
"seconds": 80500,
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
"username": "string"
}
]
}
}
```
### Responses
| Status | Meaning | Description | Schema |
|--------|---------------------------------------------------------|-------------|------------------------------------------------------------------------------------------|
| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | [codersdk.UserActivityInsightsResponse](schemas.md#codersdkuseractivityinsightsresponse) |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
## Get insights about user latency
### Code samples
```shell
# Example request using curl
curl -X GET http://coder-server:8080/api/v2/insights/user-latency?start_time=2019-08-24T14%3A15%3A22Z&end_time=2019-08-24T14%3A15%3A22Z \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
```
`GET /insights/user-latency`
### Parameters
| Name | In | Type | Required | Description |
|----------------|-------|-------------------|----------|--------------|
| `start_time` | query | string(date-time) | true | Start time |
| `end_time` | query | string(date-time) | true | End time |
| `template_ids` | query | array[string] | false | Template IDs |
### Example responses
> 200 Response
```json
{
"report": {
"end_time": "2019-08-24T14:15:22Z",
"start_time": "2019-08-24T14:15:22Z",
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"users": [
{
"avatar_url": "http://example.com",
"latency_ms": {
"p50": 31.312,
"p95": 119.832
},
"template_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
"username": "string"
}
]
}
}
```
### Responses
| Status | Meaning | Description | Schema |
|--------|---------------------------------------------------------|-------------|----------------------------------------------------------------------------------------|
| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | [codersdk.UserLatencyInsightsResponse](schemas.md#codersdkuserlatencyinsightsresponse) |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
## Get insights about user status counts
### Code samples
```shell
# Example request using curl
curl -X GET http://coder-server:8080/api/v2/insights/user-status-counts \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
```
`GET /insights/user-status-counts`
### Parameters
| Name | In | Type | Required | Description |
|-------------|-------|---------|----------|---------------------------------------------------------------|
| `timezone` | query | string | false | IANA timezone name (e.g. America/St_Johns) |
| `tz_offset` | query | integer | false | Deprecated: Time-zone offset (e.g. -2). Use timezone instead. |
### Example responses
> 200 Response
```json
{
"status_counts": {
"property1": [
{
"count": 10,
"date": "2019-08-24T14:15:22Z"
}
],
"property2": [
{
"count": 10,
"date": "2019-08-24T14:15:22Z"
}
]
}
}
```
### Responses
| Status | Meaning | Description | Schema |
|--------|---------------------------------------------------------|-------------|----------------------------------------------------------------------------------------|
| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | [codersdk.GetUserStatusCountsResponse](schemas.md#codersdkgetuserstatuscountsresponse) |
To perform this operation, you must be authenticated. [Learn more](authentication.md).