mirror of
https://github.com/coder/coder.git
synced 2026-06-03 13:08:25 +00:00
cfcb81fb0f
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.
313 lines
9.2 KiB
Markdown
Generated
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).
|