NetWorker. Руководство по поиску и устранению неисправностей REST API
Сводка: В этой статье базы знаний представлен обзор основных способов поиска и устранения неисправностей, связанных с RESTAPI.
Инструкции
Смотреть на YouTube
Дополнительная информация
Начало работы
Программный интерфейс (API) Representational State Transfer (REST) обеспечивает программный доступ к службе защиты данных NetWorker. Используя REST API, пользователи NetWorker могут создавать клиентские приложения для автоматизации операций NetWorker. REST API NetWorker устанавливается в рамках установки сервера NetWorker в том же контейнере Apache tomcat, что и службы аутентификации NetWorker. Аутентификация выполняется с использованием тех же учетных данных, что и в NetWorker Management Console.
REST API обеспечивает взаимодействие с ресурсами, определяемыми по адресам универсального кода ресурса (URI). Он использует команды HTTP (HEAD, GET, PUT, POST, DELETE) для взаимодействия с универсальным кодом ресурса (URI) без сохранения состояния. Сервер не содержит клиентского состояния, каждое сообщение является само описательным.
В этом документе описывается взаимодействие с ресурсами NetWorker с помощью записанных пользователем вызовов API REST. Не следует путать с вызовами REST API, которые используются серверными операциями NetWorker.
Подключение к NetWorker:
Существует несколько различных клиентских технологий REST API, которые можно использовать для выполнения команд для подключения к NetWorker; Включая curl (Linux), PowerShell curl.exe (Windows) и расширений браузера клиента REST API.
Для подключения необходимы три разъема:
- Тип содержимого:
application/json - Принять:
application/json - Авторизация: Базовый с именем пользователя и паролем в кодировке Base 64
В средах, где несколько зон данных NetWorker аутентифицируются с помощью одного сервера AUTHC NetWorker, требуется дополнительный заголовок:
X-NW-AUTHC-BASE-URL:AUTHC_HOSTNAME_OR_IP:AUTHC_PORT
API-интерфейс REST NetWorker доступен в следующем базовом URI:
https://[nw-server-hostname]:9090/nwrestapi/v3
Существуют различные версии API. С момента внедрения REST API были внедрены улучшения. Изменения в этих конечных точках подробно описаны в статье https://developer.dell.com/apis/2378/versions/v3/docs/GettingStarted.md
Полная схема json доступна по адресу:
https://[nw-server-hostname]:9090/nwrestapi/v3/schemas/swagger.json
| Код успешного выполнения | Применяется к методу HTTP | Содержание текста ответа | Описание |
| 200 | ПОЛУЧИТЬ | Представление ресурсов | ОК. Операции, приводящие к этому состоянию HTTP, переносят представление ресурса в полезные данные. |
| 201 | ПОМЕСТИТЬ | Пустой ответ | Создан. Это состояние указывает, что создан новый ресурс или предполагаемое задание и связанный с ним URL-адрес доступен из заголовка расположения в ответе. |
| 202 | ПОМЕСТИТЬ | Подробные сведения в ответ | Принято. Это означает, что запрос API принят. Полезные данные указывают, что URL-адрес экземпляра ресурса отслеживания доступен из заголовка location в ответе. |
| 204 | PUT или DELETE | Пустой ответ | Нет контента. Состояние указывает, что выполненная операция выполнена успешно. Однако никаких дополнительных подробностей предоставить не будет. |
| Код ошибки | Описание |
| 400 | Недопустимый запрос |
| 401 | Недопустимые учетные данные |
| 403 | Недостаточно прав |
| 404 | Ресурс не найден |
| 405 | Метод запрещен |
| 406 | Указана недопустимая локаль. |
| 500 | Ошибка внутреннего сервера |
Функции API-интерфейса REST
| HTTP-метод | Действие | Описание |
| ПОЛУЧИТЬ | Чтение | Получает представление ресурса. |
| ПОМЕСТИТЬ | Создание | Создает новый ресурс. |
| ПОЛОЖИТЬ | Обновление | Обновление существующего ресурса. |
| DELETE | Удалить | Удаляет существующий ресурс. |
Несколько примеров:
GET:
Выводит список всех клиентов.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients
Только один клиент, отображающий только три поля (имя хоста, наборы сохранений и группы защиты)
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients?fl=hostname,saveSets,protectionGroups&q=hostname:nwserver121
Выведите список групп защиты, в которых состоит один клиент.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients?fl=protectionGroups&q=hostname:nwserver121
Отображение текущих оповещений.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/alerts
Отображение недавних сбойных заданий.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/jobs?q=completionStatus:"Failed"&fl=clientHostname,startTime,name,message
Выводит список рабочих процессов в одной политике (в данном примере с именем WinFS ).
https://[nw-server-hostname]:9090/nwrestapi/v3/global/protectionpolicies/WinFS/workflows
Выводит список свойств только одного экземпляра набора сохранений (в соответствии с именем хоста клиента и набором данных).
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients?q=hostname:vm-lego-231 and saveSets:"/etc"
ПОМЕСТИТЬ:
Запуск действия рабочего процесса.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/protectionpolicies/Angela/workflows/WinFS/op/backup
JSON Body:
{
}
Создайте новый экземпляр клиента (со значениями по умолчанию для всех свойств, кроме четырех перечисленных).
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients
JSON Body
{
"hostname": "vm-lego-231",
"backupType": "Filesystem",
"saveSets": [ "/etc" ],
"protectionGroups" : [ "LinuxFS" ]
Примеры командной строки:
Linux:
Для систем, в которых python :
curl -k -u Administrator:'ADMINISTRATOR_PASSWORD' https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/ENDPOINT | python -m json.tool
jq :
curl -k -u Administrator:'ADMINISTRATOR_PASSWORD' https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/ENDPOINT | jq
[root@nsr ~]# curl -k -u Administrator https://nsr.amer.lan:9090/nwrestapi/v3/global/devices/ddve01.amer.lan_VMBackupDevice01 | jq
Enter host password for user 'Administrator':
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2820 0 2820 0 0 72307 0 --:--:-- --:--:-- --:--:-- 72307
{
"accessWeight": 1,
"accesses": "66",
"activeSessions": [],
"autoMediaManagement": false,
"autoRecoverDtf": "None",
"cdi": "NotUsed",
"cleaningRequired": false,
"consecutiveErrors": "0",
"currentNSRMMDCount": "1",
"dataDomainFibreChannel": false,
"dataDomainRetentionLockMode": "None",
"deviceAccessInfo": "ddve01.amer.lan:/nsr/VMBackupDevice01",
"deviceBlockSize": "HandlerDefault",
"dltWormCapable": false,
"idleDeviceTimeout": 0,
"jukeboxDevice": "No",
"links": [
{
"href": "https://nsr.amer.lan:9090/nwrestapi/v3/global/devices/ddve01.amer.lan_VMBackupDevice01/opstatus",
"title": "Volume operation status"
},
{
"href": "https://nsr.amer.lan:9090/nwrestapi/v3/global/devices/ddve01.amer.lan_VMBackupDevice01/op/label",
"title": "Label volume"
},
{
"href": "https://nsr.amer.lan:9090/nwrestapi/v3/global/devices/ddve01.amer.lan_VMBackupDevice01/op/mount",
"title": "Mount volume"
},
{
"href": "https://nsr.amer.lan:9090/nwrestapi/v3/global/devices/ddve01.amer.lan_VMBackupDevice01/op/unmount",
"title": "Unmount volume"
},
{
"href": "https://nsr.amer.lan:9090/nwrestapi/v3/global/devices/ddve01.amer.lan_VMBackupDevice01/op/verifylabel",
"title": "Verify volume label"
},
{
"href": "https://nsr.amer.lan:9090/nwrestapi/v3/global/devices/ddve01.amer.lan_VMBackupDevice01/op/erase",
"title": "Erase the device"
},
{
"href": "https://nsr.amer.lan:9090/nwrestapi/v3/global/volumes/4267924096",
"title": "Volume"
}
],
"longVolumeId": "703cdc60-00000005-fe635a80-66635a80-00045000-592bbe56",
"maxConsecutiveErrors": 20,
"maxNsrmmdCount": 4,
"maxSession": 60,
"mediaFamily": "Disk",
"mediaType": "Data Domain",
"message": "mounted Data Domain disk VMBackupPool.001",
"mountedVolume": "VMBackupPool.001",
"name": "ddve01.amer.lan_VMBackupDevice01",
"ndmp": false,
"operationParameters": [],
"password": "*******",
"pathId": "53f9269d-00000010-e2f994bd-66635a7e-00035000-592bbe56",
"readOnly": false,
"remoteUser": "ddboost",
"reserveRelease": "None",
"resourceId": {
"id": "178.0.90.20.0.0.0.0.196.80.99.102.192.168.9.150",
"sequence": 256
},
"saveLockout": 0,
"saveMountTimeout": 30,
"secureMultiTenancy": false,
"sharedDevices": "Done",
"statistics": [
"elapsed = 17310",
"errors = 0",
"last rate = 0",
"max clients = 0",
"file marks = 0",
"rewinds = 0",
"files skipped = 0",
"records skipped = 0",
"current file = 0",
"current record = 0",
"seek files = 0",
"seek records = 0",
"estimated kb = 0",
"amount kb = 0",
"file amount kb = 0",
"sessions = 0"
],
"status": "Enabled",
"suspectedDevice": false,
"tapeAlertsCritical": [],
"tapeAlertsInformation": [],
"tapeAlertsWarning": [],
"targetSession": 20,
"unlabeledVolumeLoaded": false,
"verifyLabelOnEject": false,
"volumeBlockSize": "256 KB",
"volumeCurrentCapacity": "0 KB",
"volumeErrorNumber": "0",
"volumeExpiration": "Sun Jun 7 15:07:44 2026",
"volumeId": "4267924096",
"volumeLabel": "VMBackupPool.001",
"volumePool": "VMBackupPool",
"warnOnSuspectVolumesInPercent": 80,
"wormCapable": false,
"wormCartridgePresent": false,
"writeEnabled": true
}
[root@nsr ~]#
Windows (PowerShell):
curl.exe -k -u Administrator:'ADMISTRATOR_PASSWORD' "https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/ENDPOINT" | ConvertFrom-Json | ConvertTo-Json -Depth 50
Пример:
PS C:\Users\Administrator.NETWORKER> curl.exe -k -u Administrator:'!Password1' "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/devices/dd3300-ff28_Backup" | ConvertFrom-Json | ConvertTo-Json -Depth 50
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2824 0 2824 0 0 20311 0 --:--:-- --:--:-- --:--:-- 21074
{
"accessWeight": 1,
"accesses": "45",
"activeSessions": [
],
"autoMediaManagement": false,
"autoRecoverDtf": "None",
"cdi": "NotUsed",
"cleaningRequired": false,
"consecutiveErrors": "0",
"currentNSRMMDCount": "1",
"dataDomainFibreChannel": false,
"dataDomainRetentionLockMode": "None",
"deviceAccessInfo": "dd3300-ff28:/win-srvr02/Backup",
"deviceBlockSize": "HandlerDefault",
"dltWormCapable": false,
"idleDeviceTimeout": 0,
"jukeboxDevice": "No",
"links": [
{
"href": "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/devices/dd3300-ff28_Backup/opstatus",
"title": "Volume operation status"
},
{
"href": "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/devices/dd3300-ff28_Backup/op/label",
"title": "Label volume"
},
{
"href": "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/devices/dd3300-ff28_Backup/op/mount",
"title": "Mount volume"
},
{
"href": "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/devices/dd3300-ff28_Backup/op/unmount",
"title": "Unmount volume"
},
{
"href": "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/devices/dd3300-ff28_Backup/op/verifylabel",
"title": "Verify volume label"
},
{
"href": "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/devices/dd3300-ff28_Backup/op/erase",
"title": "Erase the device"
},
{
"href": "https://win-srvr02.networker.lan:9090/nwrestapi/v3/global/volumes/3963713",
"title": "Volume"
}
],
"longVolumeId": "0aea479c-00000005-003c7b41-693c7b41-00025000-e6b5bb56",
"maxConsecutiveErrors": 20,
"maxNsrmmdCount": 4,
"maxSession": 60,
"mediaFamily": "Disk",
"mediaType": "Data Domain",
"message": "writing, done",
"mountedVolume": "win_srvr02.networker.lan.dddefault.001",
"name": "dd3300-ff28_Backup",
"ndmp": false,
"operationParameters": [
],
"password": "*******",
"pathId": "a30a7858-00000010-5ded760e-693c7b41-00015000-e6b5bb56",
"readOnly": false,
"remoteUser": "loudekboost",
"reserveRelease": "None",
"resourceId": {
"id": "176.0.164.7.0.0.0.0.69.121.60.105.192.168.0.22",
"sequence": 100
},
"saveLockout": 0,
"saveMountTimeout": 30,
"secureMultiTenancy": false,
"sharedDevices": "Done",
"statistics": [
"elapsed = 228514",
"errors = 0",
"last rate = 0",
"max clients = 0",
"file marks = 0",
"rewinds = 0",
"files skipped = 0",
"records skipped = 0",
"current file = 0",
"current record = 0",
"seek files = 0",
"seek records = 0",
"estimated kb = 0",
"amount kb = 0",
"file amount kb = 52206",
"sessions = 0"
],
"status": "Enabled",
"suspectedDevice": false,
"tapeAlertsCritical": [
],
"tapeAlertsInformation": [
],
"tapeAlertsWarning": [
],
"targetSession": 20,
"unlabeledVolumeLoaded": false,
"verifyLabelOnEject": false,
"volumeBlockSize": "256 KB",
"volumeCurrentCapacity": "0 KB",
"volumeErrorNumber": "0",
"volumeExpiration": "Sun Dec 12 15:29:53 2027",
"volumeId": "3963713",
"volumeLabel": "win_srvr02.networker.lan.dddefault.001",
"volumePool": "Data Domain Default",
"warnOnSuspectVolumesInPercent": 80,
"wormCapable": false,
"wormCartridgePresent": false,
"writeEnabled": true
}
Необходимая информация для поддержки
Инфраструктура.
- Имя сервера NetWorker
- Версия и номер сборки NetWorker
- Тип и версия операционной системы хоста сервера NetWorker
hostname
strings /usr/sbin/nsrd | grep -i "(#)"
cat /etc/*release
uname -a
Windows:
nsrwatch
Сведения о проблеме.
- Объясните, какая операция REST API ВЫПОЛНЯЕТСЯ (GET, POST, PUT, DELETE), какой URI используется, содержимое текста JSON (если применимо).
- Код ответа API-интерфейса REST и любое сообщение об ошибке.
- Было ли выполнено начальное подключение и авторизация между клиентом REST API и NetWorker?
Сбор журналов/
- Отображается daemon.raw файл журнала с сервера NetWorker:
- Linux:
/nsr/logs/daemon.raw - Windows:
C:\Program Files\EMC NetWorker\nsr\logs\daemon.raw - NetWorker. Как использовать nsr_render_log
- Linux:
- Журналы API-интерфейса REST с сервера NetWorker:
/nsr/logs/restapi(Linux) илиEMC NetWorker\nsr\logs\restapi(Windows) - Сведения о проблемах с проверкой подлинности см. в статье Стандартный вход в систему проверки подлинности NetWorker
/nsr/authc/logs(Linux) или..\EMC NetWorker\nsr\authc-server\tomcat\logs(Windows)
Отладки:
Производительности:
Перед оценкой проблем, связанных с производительностью интерфейса REST API, важно определить, наблюдается ли данная проблема во всех функциях интерфейса REST API или в конкретных функциях. Например, запросы GET к глобальным конечным точкам, таким как клиенты, задания, тома и т. д., могут извлекать большой объем данных. Такие типы запросов могут привести к высокой загрузке системных ресурсов и истечению времени ожидания.
Видеть: REST API NetWorker: Время ожидания HTTP-запросов GET периодически истекает
При обнаружении проблем с производительностью на крупных глобальных конечных точках рекомендуется использовать "фильтр списка запросов" (q) или "фильтр списка полей" (fl), чтобы свести возвращаемые данные к конкретной необходимой информации. Эти параметры подробно описаны в приведенной выше статье базы знаний, а дополнительную информацию можно найти в Руководстве разработчика по REST API. Разработчик Dell Technologies
Если проблема связана с производительностью API REST, можно использовать следующие параметры для отслеживания потребления ресурсов процессом nsrtomc+, используемым вызовами API.
Linux:
top -b | awk '/nsrtomc+/ {print strftime("%Y-%m-%d-%H:%M:%S", systime()), $0}'
В этом выводе отображается стандартный верхний вывод, но с метками времени, доступными для чтения. Его можно использовать для просмотра потребления процессора и памяти процессом и того, как долго он оставался в определенном состоянии при выполнении вызова REST. Эти данные можно сравнить с журналами restapi.log и AUTHC, чтобы узнать, какие вызовы выполнялись и как часто.
Windows:
Для Windows Server необходимо установить что-то вроде «Монитор производительности:
- Откройте системный монитор от имени администратора.
- На левой панели разверните раздел Средства мониторинга и выберите Монитор производительности.
- Щелкните правой кнопкой мыши внутри правой панели и выберите Удалить все счетчики.
- Нажмите правой кнопкой мыши на правой панели и выберите Добавить счетчики.
- В разделе Доступные счетчики разверните раздел Память, выберите % Выделенные байты и нажмите кнопку Добавить.
- В разделе Память выберите Доступные байты и нажмите Добавить.
- В разделе «Доступные счетчики» разверните «Процесс» и выберите «% загруженности процессора», а в разделе «Экземпляры выбранного объекта» выберите первую запись Java и нажмите «Добавить».
- В разделе Доступные счетчики разверните раздел Сведения о процессоре, выберите % Утилита процессора и нажмите кнопку Добавить.
- Счетчики добавленных на правой панели должны отображать:

- Нажмите ОК. Щелкните правой кнопкой мыши Монитор производительности и выберите Создать набор> сборщика данных.
- Укажите имя, например:
RESTAPI_MON. - На экране местоположения нажмите кнопку Далее, если не выбрано указание альтернативного выходного местоположения.
- Выберите Сохранить и закрыть и нажмите Готово.
- На левой панели в разделе «Наборы сборщика данных-Определено> пользователем» откройте
RESTAPI_MONproperties и выберите Comma Separated для формата журнала, нажмите Ok.

- На левой панели в разделе Наборы сборщиков данных-Определенные> пользователем выберите RESTAPI_MON набор сборщиков данных и нажмите кнопку Пуск (кнопка Play)
- Если использовалось расположение вывода по умолчанию, файл .csv отображается в разделе
C:\PerfLogs\Admin\RESTAPI_MON. - После того как проблема обнаружена и зарегистрирована в выходном файле, вы можете прекратить мониторинг, нажав Stop в разделе Data Collector Sets-User Defined.