NetWorker: Guía de triage y solución de problemas de la API REST
Resumen: En este artículo de la base de conocimientos, se proporciona una visión general de la solución de problemas básica para problemas relacionados con la API REST.
Instrucciones
Ver en YouTube
Información adicional
Introducción
La interfaz de programación de aplicaciones (API) de transferencia de estado representacional (REST) proporciona acceso programático al servicio de protección de datos de NetWorker. Mediante el uso de la API REST, los usuarios de NetWorker pueden crear aplicaciones cliente para automatizar las operaciones de NetWorker. La API REST de NetWorker se instala como parte de la instalación de NetWorker Server en el mismo contenedor Apache Tomcat que los servicios de autenticación de NetWorker. La autenticación se realiza con las mismas credenciales que se utilizan para NetWorker Management Console.
La API REST permite la interacción con los recursos identificados por las direcciones del identificador uniforme de recursos (URI). Utiliza verbos HTTP (HEAD, GET, PUT, POST, DELETE) para interactuar con el identificador uniforme de recursos (URI) sin estado. El servidor no contiene ningún estado de cliente y cada mensaje es autodescriptivo.
En este documento, se aborda la interacción con los recursos de NetWorker mediante llamadas de API REST escritas por el usuario. No debe confundirse con las llamadas de API REST que utilizan las operaciones de back-end de NetWorker.
Conexión a NetWorker:
Hay varias tecnologías de cliente de API REST diferentes que se pueden utilizar para ejecutar los comandos para conectarse a NetWorker; Incluido curl comandos (Linux), PowerShell curl.exe (Windows) y extensiones de navegador del cliente de API REST.
Se necesitan tres encabezados para la conexión:
- Tipo de contenido:
application/json - Acepta:
application/json - Autorización: Básico con nombre de usuario y contraseña codificados de base 64
En entornos donde hay varias zonas de datos de NetWorker autenticadas a través de un único servidor AUTHC de NetWorker, se requiere un encabezado adicional:
X-NW-AUTHC-BASE-URL:AUTHC_HOSTNAME_OR_IP:AUTHC_PORT
La API REST de NetWorker se expone en el siguiente URI base:
https://[nw-server-hostname]:9090/nwrestapi/v3
Existen diferentes versiones de las API. Las mejoras se han implementado desde que se implementó inicialmente la API REST. Los cambios en estos terminales se detallan en: https://developer.dell.com/apis/2378/versions/v3/docs/GettingStarted.md
El esquema JSON completo está disponible en:
https://[nw-server-hostname]:9090/nwrestapi/v3/schemas/swagger.json
| Código de éxito | Se aplica al método HTTP | Contenido del cuerpo de la respuesta | Descripción |
| 200 | OBTENER | Representación de recursos | Aceptar. Las operaciones que dan como resultado este estado HTTP llevan la representación de recursos en la carga útil. |
| 201 | EXPONER | Respuesta vacía | Creado. Este estado indica que se creó un nuevo recurso o un trabajo previsto y que se puede acceder a su dirección URL asociada desde el encabezado de ubicación en la respuesta. |
| 202 | EXPONER | Detalles en respuesta | Aceptado. Esto indica que se aceptó la solicitud de API. La carga útil indica que se puede acceder a la URL de la instancia del recurso de seguimiento desde el encabezado de ubicación en la respuesta. |
| 204 | PUT o DELETE | Respuesta vacía | Sin contenido. El estado indica que la operación realizada se realizó correctamente. Sin embargo, no se proporcionarán detalles adicionales. |
| Código de error | Descripción |
| 400 | Solicitud incorrecta |
| 401 | Credenciales no válidas |
| 403 | Privilegios insuficientes |
| 404 | No se encontró el recurso |
| 405 | Método no permitido |
| 406 | Se especificó una configuración regional no válida. |
| 500 | Error interno del servidor |
Funciones de API REST
| Método HTTP | Acción | Descripción |
| OBTENER | Lectura | Obtiene la representación del recurso. |
| EXPONER | Crear | Crea un nuevo recurso. |
| COLOCAR | Actualización | Actualiza un recurso existente. |
| BORRAR | Remove | Elimina un recurso existente. |
Algunos ejemplos:
GET:
Enumere todos los clientes.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients
Un solo cliente, que muestra solo tres campos (nombre de host, savesets y grupos de protección)
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients?fl=hostname,saveSets,protectionGroups&q=hostname:nwserver121
Enumere los grupos de protección en los que se encuentra un cliente.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients?fl=protectionGroups&q=hostname:nwserver121
Mostrar alertas actuales.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/alerts
Mostrar los trabajos fallidos recientes.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/jobs?q=completionStatus:"Failed"&fl=clientHostname,startTime,name,message
Enumere los flujos de trabajo en una política (denominada WinFS en este ejemplo).
https://[nw-server-hostname]:9090/nwrestapi/v3/global/protectionpolicies/WinFS/workflows
Muestra las propiedades de una instancia de saveset solamente (según lo definido por el nombre de host del cliente y el saveset).
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients?q=hostname:vm-lego-231 and saveSets:"/etc"
EXPONER:
Inicie una acción de flujo de trabajo.
https://[nw-server-hostname]:9090/nwrestapi/v3/global/protectionpolicies/Angela/workflows/WinFS/op/backup
JSON Body:
{
}
Cree una nueva instancia de cliente (con valores predeterminados para todas las propiedades, excepto las cuatro enumeradas).
https://[nw-server-hostname]:9090/nwrestapi/v3/global/clients
JSON Body
{
"hostname": "vm-lego-231",
"backupType": "Filesystem",
"saveSets": [ "/etc" ],
"protectionGroups" : [ "LinuxFS" ]
Ejemplos de línea de comandos:
Linux:
En el caso de los sistemas que tienen python instalado:
curl -k -u Administrator:'ADMINISTRATOR_PASSWORD' https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/ENDPOINT | python -m json.tool
jq instalado:
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
Ejemplo:
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
}
Información necesaria para el soporte
Entorno:
- Nombre del servidor de NetWorker
- Versión y número de compilación de NetWorker
- Tipo y versión del sistema operativo host de NetWorker Server
hostname
strings /usr/sbin/nsrd | grep -i "(#)"
cat /etc/*release
uname -a
Windows:
nsrwatch
Detalles del problema:
- Explique qué operación de la API REST se está realizando (GET, POST, PUT, DELETE), el URI utilizado y cualquier contenido del cuerpo JSON (cuando corresponda).
- El código de respuesta de la API REST y cualquier mensaje de error proporcionado.
- ¿La conexión y la autorización iniciales se realizaron correctamente entre el cliente de la API REST y NetWorker?
Recopilación de registros:
- Archivo de registro de daemon.raw generado desde NetWorker Server:
- Linux:
/nsr/logs/daemon.raw - Windows:
C:\Program Files\EMC NetWorker\nsr\logs\daemon.raw - NetWorker: Cómo utilizar nsr_render_log
- Linux:
- Registros de API REST desde NetWorker Server:
/nsr/logs/restapi(Linux) oEMC NetWorker\nsr\logs\restapi(Windows) - Para problemas de autenticación, consulte el registro de autenticación estándar de NetWorker en
/nsr/authc/logs(Linux) o..\EMC NetWorker\nsr\authc-server\tomcat\logs(Windows)
Depuración:
Rendimiento:
Antes de evaluar los problemas relacionados con el rendimiento de la API REST, es importante determinar si el problema se observa en todas las funciones o funciones específicas de la API REST. Por ejemplo, las solicitudes GET en terminales globales, como clientes, trabajos, volúmenes, etc., pueden extraer una gran cantidad de datos. Estos tipos de solicitudes pueden provocar una alta utilización de recursos del sistema y tiempos de espera agotados.
Véase: API REST de NetWorker: Se agota el tiempo de espera de las solicitudes HTTP GET de forma intermitente
Cuando se observan problemas de rendimiento en terminales globales de gran tamaño, se recomienda usar el "filtro de lista de consultas" (q) o "filtro de lista de campos" (fl) para reducir los datos devueltos a la información específica necesaria. En la base de conocimientos anterior, se detallan estos ajustes y hay información adicional disponible en la Guía para desarrolladores de la API REST: Desarrollador de
Dell TechnologiesSi el problema está relacionado con el rendimiento de la API REST, puede usar las siguientes opciones para rastrear el consumo de recursos del proceso nsrtomc+ utilizado por las llamadas a la API.
Linux:
top -b | awk '/nsrtomc+/ {print strftime("%Y-%m-%d-%H:%M:%S", systime()), $0}'
Esta salida muestra la salida superior estándar, pero con marcas de tiempo legibles por humanos. Esto se puede utilizar para revisar el consumo de CPU y memoria por parte del proceso y cuánto tiempo permanecía en un estado determinado cuando se realizaba una llamada REST. Esto se puede comparar con los registros de restapi.log y AUTHC para ver qué llamadas se realizaron y con qué frecuencia.
Windows:
En el caso de los servidores Windows, debe instalar algo como "Performance Monitor:
- Abra Performance Monitor como administrador.
- En el panel izquierdo, expanda Herramientas de monitoreo y seleccione Monitor de rendimiento.
- Haga clic con el botón secundario en el panel derecho y seleccione Eliminar todos los contadores.
- Haga clic con el botón secundario en el panel derecho y seleccione Add Counters.
- En Available Counters, expanda Memory, seleccione % Commit Bytes y haga clic en Add.
- En Memoria, seleccione Bytes disponibles y haga clic en Agregar.
- En Available Counters, expanda Process y seleccione % Processor Time y, en Instances of Selected Object, seleccione la primera entrada de Java y haga clic en Add.
- En Contadores disponibles, expanda Información del procesador, seleccione % Utilidad del procesador y haga clic en Agregar.
- Los contadores agregados en el panel derecho deben mostrar:

- Haga clic en Aceptar. Haga clic con el botón secundario en Monitor de rendimiento y, a continuación, haga clic en Conjunto de recopiladores de> datos nuevos.
- Proporcione un nombre, por ejemplo:
RESTAPI_MON. - En la pantalla de ubicación, haga clic en Siguiente, a menos que elija especificar una ubicación de salida alternativa.
- Seleccione Guardar y cerrar y haga clic en Finalizar.
- En el panel izquierdo, en Data Collector Sets-User Defined,> abra el archivo
RESTAPI_MONproperties y seleccione Separados por comas para el formato de registro y haga clic en Aceptar.

- En el panel izquierdo, en Data Collector Sets-User Defined,>seleccione el conjunto de Data Collector RESTAPI_MON y haga clic en Start (botón Play)
- Si se utilizó la ubicación de salida predeterminada, el archivo .csv aparece en
C:\PerfLogs\Admin\RESTAPI_MON. - Una vez que el problema se observa y se registra en el archivo de salida, puede detener el monitoreo haciendo clic en Stop en Data Collector Sets-User Defined.