diff --git a/site/content/3.12/develop/http-api/monitoring/logs.md b/site/content/3.12/develop/http-api/monitoring/logs.md index f07f8a1109..b71947c05c 100644 --- a/site/content/3.12/develop/http-api/monitoring/logs.md +++ b/site/content/3.12/develop/http-api/monitoring/logs.md @@ -560,7 +560,7 @@ paths: Logs various information related to ArangoDB's use of the RocksDB storage engine, like the initialization and file operations. - + RocksDB's internal log messages are passed through using the `rocksdb` log topic. type: string @@ -848,12 +848,14 @@ paths: operationId: getRecentApiCalls description: | Get a list of the most recent requests with a timestamp and the endpoint. + In cluster deployments, the list contains only those requests that were + submitted to the Coordinator you call this endpoint on. This feature is for debugging purposes. You can control how much memory is used to record API calls with the `--server.api-recording-memory-limit` startup option. - You can disable this endpoint + You can disable this and the `/_admin/server/aql-queries` endpoint with the `--log.recording-api-enabled` startup option. Whether API calls are recorded is independently controlled by the @@ -867,7 +869,9 @@ paths: description: | The name of a database. Which database you use doesn't matter as long as the user account you authenticate with has at least read access - to this database. + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. schema: type: string responses: @@ -1067,3 +1071,239 @@ Content-Length: 257 } ``` {{< /expand >}} + +## Get recent AQL queries + +```openapi +paths: + /_db/{database-name}/_admin/server/aql-queries: + get: + operationId: getRecentAqlQueries + description: | + Get a list of the most recent AQL queries with a timestamp and + information about the submitted query. In cluster deployments, the list + contains only those queries that were submitted to the Coordinator you + call this endpoint on. This feature is for debugging purposes. + + You can control how much memory is used to record AQL queries with the + `--server.aql-recording-memory-limit` startup option. + + You can disable this and the `/_admin/server/api-calls` endpoint + with the `--log.recording-api-enabled` startup option. + + Whether AQL queries are recorded is independently controlled by the + `--server.aql-query-recording` startup option. + The endpoint returns an empty list of queries if turned off. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. + schema: + type: string + responses: + '200': + description: | + Returns the recorded AQL queries. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The request result. + type: object + required: + - queries + properties: + queries: + description: | + A list of the recent AQL queries. + Empty if AQL query recording is disabled. + type: array + items: + type: object + properties: + timeStamp: + description: | + The date and time of the request in ISO 8601 format. + type: string + format: date-time + query: + description: | + The AQL query. + type: string + bindVars: + description: | + Key/value pairs representing the bind variables. + type: object + database: + description: | + The database name. + type: string + '401': + description: | + The user account has insufficient permissions for the selected database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 401 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + The recording API has been disabled. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '501': + description: | + The method has not been called on a Coordinator or single server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 501 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Monitoring +``` + +{{< comment >}} +Example not generated because it changes on every run and there can be many internal queries. +{{< /comment >}} + +```bash +curl --header 'accept: application/json' --dump - http://localhost:8529/_admin/server/aql-queries +``` + +{{< expand title="Show output" >}} +```bash +HTTP/1.1 200 OK +X-Arango-Queue-Time-Seconds: 0.000000 +Strict-Transport-Security: max-age=31536000 ; includeSubDomains +Expires: 0 +Pragma: no-cache +Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0 +Content-Security-Policy: frame-ancestors 'self'; form-action 'self'; +X-Content-Type-Options: nosniff +Server: ArangoDB +Connection: Keep-Alive +Content-Type: application/json; charset=utf-8 +Content-Length: 353 + +{ + "error": false, + "code": 200, + "result": { + "queries": [ + { + "timeStamp": "2025-07-02T16:33:32Z", + "query": "FOR s in @@collection FILTER s.time < @start RETURN s._key", + "database": "_system", + "bindVars": { + "@collection": "_statistics", + "start": 1751470412.3836362 + } + }, + { + "timeStamp": "2025-07-02T16:26:01Z", + "query": "FOR doc IN coll RETURN doc", + "database": "_system", + "bindVars": {} + } + ] + } +} +``` +{{< /expand >}} diff --git a/site/content/3.12/release-notes/version-3.12/api-changes-in-3-12.md b/site/content/3.12/release-notes/version-3.12/api-changes-in-3-12.md index aad7f29cec..ada659b652 100644 --- a/site/content/3.12/release-notes/version-3.12/api-changes-in-3-12.md +++ b/site/content/3.12/release-notes/version-3.12/api-changes-in-3-12.md @@ -309,6 +309,17 @@ is for debugging purposes. See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +#### AQL query recording + +Introduced in: v3.12.6 + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted queries. This feature is for debugging purposes. + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + ### Endpoints augmented #### View API diff --git a/site/content/3.12/release-notes/version-3.12/whats-new-in-3-12.md b/site/content/3.12/release-notes/version-3.12/whats-new-in-3-12.md index e89f9790c8..9319b37d6f 100644 --- a/site/content/3.12/release-notes/version-3.12/whats-new-in-3-12.md +++ b/site/content/3.12/release-notes/version-3.12/whats-new-in-3-12.md @@ -2170,9 +2170,9 @@ is for debugging purposes. You can configure the memory limit for this feature with the following startup option: - `--server.api-recording-memory-limit`: - Size limit for the list of API call records (default: `25600000`). + Size limit for the list of API call records (default: `26214400`). -This means that 25 MB of memory is reserved by default. +This means that 25 MiB of memory is reserved by default. API call recording is enabled by default but you can disable it via the new `--server.api-call-recording` startup option. @@ -2191,6 +2191,41 @@ impact of this feature: See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +### AQL query recording + +Introduced in: v3.12.6 + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted query. This feature is for debugging purposes. + +You can configure the memory limit for this feature with the following startup option: + +- `--server.aql-recording-memory-limit`: + Size limit for the list of AQL query records (default: `26214400` bytes) + +This means that 25 MiB of memory is reserved by default. + +AQL query recording is enabled by default but you can disable it via the new +`--server.aql-query-recording` startup option. + +This and the `/_admin/server/api-calls` endpoint are referred to as the +recording API, which exposes the recorded API calls and AQL queries. It is +enabled by default. Users with administrative access to the `_system` database +can call the endpoints. You can further restrict the access to only the +superuser by setting `--log.recording-api-enabled` to `jwt`, or disable the +endpoints altogether by setting the option to `false`. + +A metric has been added for the time spent on AQL query recording to track the +impact of this feature: + +| Label | Description | +|:------|:------------| +| `arangodb_aql_recording_call_time` | Execution time histogram for AQL recording calls in nanoseconds. | + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + ## Client tools ### Protocol aliases for endpoints diff --git a/site/content/3.13/develop/http-api/monitoring/logs.md b/site/content/3.13/develop/http-api/monitoring/logs.md index f07f8a1109..b71947c05c 100644 --- a/site/content/3.13/develop/http-api/monitoring/logs.md +++ b/site/content/3.13/develop/http-api/monitoring/logs.md @@ -560,7 +560,7 @@ paths: Logs various information related to ArangoDB's use of the RocksDB storage engine, like the initialization and file operations. - + RocksDB's internal log messages are passed through using the `rocksdb` log topic. type: string @@ -848,12 +848,14 @@ paths: operationId: getRecentApiCalls description: | Get a list of the most recent requests with a timestamp and the endpoint. + In cluster deployments, the list contains only those requests that were + submitted to the Coordinator you call this endpoint on. This feature is for debugging purposes. You can control how much memory is used to record API calls with the `--server.api-recording-memory-limit` startup option. - You can disable this endpoint + You can disable this and the `/_admin/server/aql-queries` endpoint with the `--log.recording-api-enabled` startup option. Whether API calls are recorded is independently controlled by the @@ -867,7 +869,9 @@ paths: description: | The name of a database. Which database you use doesn't matter as long as the user account you authenticate with has at least read access - to this database. + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. schema: type: string responses: @@ -1067,3 +1071,239 @@ Content-Length: 257 } ``` {{< /expand >}} + +## Get recent AQL queries + +```openapi +paths: + /_db/{database-name}/_admin/server/aql-queries: + get: + operationId: getRecentAqlQueries + description: | + Get a list of the most recent AQL queries with a timestamp and + information about the submitted query. In cluster deployments, the list + contains only those queries that were submitted to the Coordinator you + call this endpoint on. This feature is for debugging purposes. + + You can control how much memory is used to record AQL queries with the + `--server.aql-recording-memory-limit` startup option. + + You can disable this and the `/_admin/server/api-calls` endpoint + with the `--log.recording-api-enabled` startup option. + + Whether AQL queries are recorded is independently controlled by the + `--server.aql-query-recording` startup option. + The endpoint returns an empty list of queries if turned off. + parameters: + - name: database-name + in: path + required: true + example: _system + description: | + The name of a database. Which database you use doesn't matter as long + as the user account you authenticate with has at least read access + to this database and administrate access to the `_system` database. + If `--log.recording-api-enabled` is set to `jwt`, you need to use + a superuser token to access the endpoint. + schema: + type: string + responses: + '200': + description: | + Returns the recorded AQL queries. + content: + application/json: + schema: + type: object + required: + - error + - code + - result + properties: + error: + description: | + A flag indicating that no error occurred. + type: boolean + example: false + code: + description: | + The HTTP response status code. + type: integer + example: 200 + result: + description: | + The request result. + type: object + required: + - queries + properties: + queries: + description: | + A list of the recent AQL queries. + Empty if AQL query recording is disabled. + type: array + items: + type: object + properties: + timeStamp: + description: | + The date and time of the request in ISO 8601 format. + type: string + format: date-time + query: + description: | + The AQL query. + type: string + bindVars: + description: | + Key/value pairs representing the bind variables. + type: object + database: + description: | + The database name. + type: string + '401': + description: | + The user account has insufficient permissions for the selected database. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 401 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '403': + description: | + The recording API has been disabled. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 403 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + '501': + description: | + The method has not been called on a Coordinator or single server. + content: + application/json: + schema: + type: object + required: + - error + - code + - errorNum + - errorMessage + properties: + error: + description: | + A flag indicating that an error occurred. + type: boolean + example: true + code: + description: | + The HTTP response status code. + type: integer + example: 501 + errorNum: + description: | + ArangoDB error number for the error that occurred. + type: integer + errorMessage: + description: | + A descriptive error message. + type: string + tags: + - Monitoring +``` + +{{< comment >}} +Example not generated because it changes on every run and there can be many internal queries. +{{< /comment >}} + +```bash +curl --header 'accept: application/json' --dump - http://localhost:8529/_admin/server/aql-queries +``` + +{{< expand title="Show output" >}} +```bash +HTTP/1.1 200 OK +X-Arango-Queue-Time-Seconds: 0.000000 +Strict-Transport-Security: max-age=31536000 ; includeSubDomains +Expires: 0 +Pragma: no-cache +Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0 +Content-Security-Policy: frame-ancestors 'self'; form-action 'self'; +X-Content-Type-Options: nosniff +Server: ArangoDB +Connection: Keep-Alive +Content-Type: application/json; charset=utf-8 +Content-Length: 353 + +{ + "error": false, + "code": 200, + "result": { + "queries": [ + { + "timeStamp": "2025-07-02T16:33:32Z", + "query": "FOR s in @@collection FILTER s.time < @start RETURN s._key", + "database": "_system", + "bindVars": { + "@collection": "_statistics", + "start": 1751470412.3836362 + } + }, + { + "timeStamp": "2025-07-02T16:26:01Z", + "query": "FOR doc IN coll RETURN doc", + "database": "_system", + "bindVars": {} + } + ] + } +} +``` +{{< /expand >}} diff --git a/site/content/3.13/release-notes/version-3.12/api-changes-in-3-12.md b/site/content/3.13/release-notes/version-3.12/api-changes-in-3-12.md index aad7f29cec..ada659b652 100644 --- a/site/content/3.13/release-notes/version-3.12/api-changes-in-3-12.md +++ b/site/content/3.13/release-notes/version-3.12/api-changes-in-3-12.md @@ -309,6 +309,17 @@ is for debugging purposes. See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +#### AQL query recording + +Introduced in: v3.12.6 + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted queries. This feature is for debugging purposes. + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + ### Endpoints augmented #### View API diff --git a/site/content/3.13/release-notes/version-3.12/whats-new-in-3-12.md b/site/content/3.13/release-notes/version-3.12/whats-new-in-3-12.md index e89f9790c8..9319b37d6f 100644 --- a/site/content/3.13/release-notes/version-3.12/whats-new-in-3-12.md +++ b/site/content/3.13/release-notes/version-3.12/whats-new-in-3-12.md @@ -2170,9 +2170,9 @@ is for debugging purposes. You can configure the memory limit for this feature with the following startup option: - `--server.api-recording-memory-limit`: - Size limit for the list of API call records (default: `25600000`). + Size limit for the list of API call records (default: `26214400`). -This means that 25 MB of memory is reserved by default. +This means that 25 MiB of memory is reserved by default. API call recording is enabled by default but you can disable it via the new `--server.api-call-recording` startup option. @@ -2191,6 +2191,41 @@ impact of this feature: See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-api-calls) for details. +### AQL query recording + +Introduced in: v3.12.6 + +A new `/_admin/server/aql-queries` endpoint has been added to let you retrieve a +list of the most recent AQL queries with a timestamp and information about the +submitted query. This feature is for debugging purposes. + +You can configure the memory limit for this feature with the following startup option: + +- `--server.aql-recording-memory-limit`: + Size limit for the list of AQL query records (default: `26214400` bytes) + +This means that 25 MiB of memory is reserved by default. + +AQL query recording is enabled by default but you can disable it via the new +`--server.aql-query-recording` startup option. + +This and the `/_admin/server/api-calls` endpoint are referred to as the +recording API, which exposes the recorded API calls and AQL queries. It is +enabled by default. Users with administrative access to the `_system` database +can call the endpoints. You can further restrict the access to only the +superuser by setting `--log.recording-api-enabled` to `jwt`, or disable the +endpoints altogether by setting the option to `false`. + +A metric has been added for the time spent on AQL query recording to track the +impact of this feature: + +| Label | Description | +|:------|:------------| +| `arangodb_aql_recording_call_time` | Execution time histogram for AQL recording calls in nanoseconds. | + +See [HTTP interface for server logs](../../develop/http-api/monitoring/logs.md#get-recent-aql-queries) +for details. + ## Client tools ### Protocol aliases for endpoints