Поделиться через


Пакетные запросы

API Log Analytics в Azure Monitor поддерживает объединение запросов в пакеты. Пакетные запросы в настоящее время требуют проверки подлинности Microsoft Entra.

Формат запроса

Для пакетных запросов используйте конечную точку API, добавив $batch в конце URL-адреса: https://api.loganalytics.azure.com/v1/$batch.

Если метод не указан, пакетная обработка по умолчанию применяется к методу GET. В запросах GET API игнорирует параметр body объекта request.

Пакетный запрос содержит обычные заголовки для других операций:

Content-Type: application/json
Authorization: Bearer <user token>

Тело запроса — это массив объектов, содержащий следующие свойства:

  • id
  • headers
  • body
  • method
  • path
  • workspace

Пример:

POST https://api.loganalytics.azure.com/v1/$batch
Content-Type: application/json
Authorization: Bearer <user token>
Cache-Control: no-cache
{
    "requests": 
    [
        {
            "id": "1",
            "headers": {
                "Content-Type": "application/json"
            },
            "body": {
                "query": "AzureActivity | summarize count()",
                "timespan": "PT1H"
            },
            "method": "POST",
            "path": "/query",
            "workspace": "workspace-1"
        },
        {
            "id": "2",
            "headers": {
                "Content-Type": "application/json"
            },
            "body": {
                "query": "ApplicationInsights | limit 10",
                "timespan": "PT1H"
            },
            "method": "POST",
            "path": "/fakePath",
            "workspace": "workspace-2"
        }
    ]
}

Формат ответа

Формат ответа представляет собой аналогичный массив объектов. Каждый объект содержит следующие элементы:

  • Идентификатор
  • Код состояния HTTP конкретного запроса.
  • Текст ответа, возвращаемого для этого запроса.

Если запрос не возвращается, текст ответа содержит сообщения об ошибках. Сообщения об ошибках относятся только к отдельным запросам в пакете; сам пакет возвращает код состояния, не зависящий от значений, возвращаемых его элементами. Пакетная обработка выполняется успешно, если пакет:

  • Задан в правильной форме и формате
  • Проверка подлинности выполнена
  • Авторизован

Пакет успешно возвращается, даже если результаты запросов членов могут быть сочетанием успешных и неудачных попыток.

Пример:

{
    "responses":
    [
        {
            "id": "2",
            "status": 404,
            "body": {
                "error": {
                    "message": "The requested path does not exist",
                    "code": "PathNotFoundError"
                }
            }
        },
        {
            "id": "1",
            "status": 200,
            "body": {
                "tables": [
                    {
                        "name": "PrimaryResult",
                        "columns": [
                            {
                                "name": "Count",
                                "type": "long"
                            }
                        ],
                        "rows": [
                            [
                                7240
                            ]
                        ]
                    }
                ]
            }
        }
    ]
}

Поведение и ошибки

Порядок ответов в возвращенном объекте не связан с порядком элементов в запросе. Время, затраченное на выполнение каждого отдельного запроса. Для сопоставления объектов ответов с исходными запросами используются идентификаторы. Не следует рассчитывать, что ответы будут следовать в том же порядке, что и запросы.

Весь пакетный запрос завершается ошибкой только в следующих случаях:

  • Формат JSON внешних полезных данных недопустим.
  • Проверка подлинности завершилась сбоем: пользователь не предоставил маркер проверки подлинности или этот маркер недействителен.
  • Отдельные объекты запроса в пакете не имеют необходимых свойств или имеют повторяющиеся идентификаторы.

В этих условиях форма отклика отличается от обычного контейнера. Объекты, содержащиеся в пакетном объекте, могут завершиться сбоем или успешным независимо, см. в следующем примере ошибок.

Примеры ошибок

Этот список представляет собой неисчерпаемый список примеров возможных ошибок и их значений.

  • 400 — неправильно оформленный запрос. Внешний объект запроса не был допустимым JSON.

    {
        "error": {
            "message": "The request had some invalid properties",
            "code": "BadArgumentError",
            "innererror": {
                "code": "QueryValidationError",
                "message": "Failed parsing the query",
                "details": [
                    {
                        "code": "InvalidJsonBody",
                        "message": "Unexpected end of JSON input",
                        "target": null
                    }
                ]
            }
        }
    }
    
  • 403 — запрет. Предоставленный маркер не имеет доступа к ресурсу, к который вы пытаетесь получить доступ. Убедитесь, что ваш запрос токена имеет правильный ресурс, и вы предоставили разрешения для приложения Microsoft Entra.

    {
        "error": {
            "message": "The provided authentication is not valid for this resource",
            "code": "InvalidTokenError",
            "innererror": {
                "code": "SignatureVerificationFailed",
                "message": "Could not validate the request"
            }
        }
    }
    
  • 204 — не размещено. У вас нет данных, которые вызов API должен разместить в резервном хранилище. Как ошибка 2xx, это технически успешный запрос. Однако в рамках пакета такие ответы следует обрабатывать как ошибки.

    {
        "responses": [
            {
                "id": "2",
                "status": 204,
                "body": {
                    "error": {
                        "code": "WorkspaceNotPlacedError"
                    }
                }
            }
        ]
    }
    
  • 404 — не найдено. Путь запроса не существует. Эта ошибка также может возникать в пакете, если в отдельном запросе указан недопустимый метод HTTP.

    {
        "responses": [
            {
                "id": "1",
                "status": 404,
                "body": {
                    "error": {
                        "message": "The requested path does not exist",
                        "code": "PathNotFoundError"
                    }
                }
            }
        ]
    }
    
  • 400 — не удается разрешить ресурс Неверное значение GUID, представляющее рабочую область.

    {
        "responses": [
            {
                "id": "1",
                "status": 400,
                "body": {
                    "error": {
                        "code": "FailedToResolveResource",
                        "message": "Resource identity could not be resovled"
                    }
                }
            }
        ]
    }