API REST de NetWorker: Se agota el tiempo de espera de las solicitudes HTTP GET de forma intermitente
Summary: La interfaz de programación de aplicaciones (API) de transferencia de estado representacional (REST) de NetWorker se utiliza para solicitar información (HTTP GET) desde un NetWorker Server en el ambiente. Se agota el tiempo de espera de las consultas de la API REST de forma intermitente y el restapi.log muestra un mensaje de error interno del servidor debido a un tiempo de espera agotado del conector. ...
Symptoms
La interfaz de programación de aplicaciones (API) de NetWorker Representational State Transfer (REST) se utiliza para solicitar información (HTTP GET) desde un NetWorker Server en el ambiente. Se agota el tiempo de espera de las consultas de la API REST de forma intermitente y el restapi.log muestra un mensaje de error interno del servidor debido a un tiempo de espera agotado del conector.
YYYY-MM-DD HH:MM:SS INFO [https-jsse-nio-9090-exec-26] c.e.n.w.WebApiResponse - Response status Method: 'GET', URI:'v3/global/backups', Status '200'
YYYY-MM-DD HH:MM:SS INFO [https-jsse-nio-9090-exec-26] c.e.n.w.WebApiResponse - Response status Method: 'GET', URI:'v3/global/backups', Status '500'
...
YYYY-MM-DD HH:MM:SS ERROR [https-jsse-nio-9090-exec-11] c.e.n.w.WebApiExceptionMapper - Status 'Internal Server Error', msg: java.io.IOException: Broken pipe
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:333) ~[catalina.jar:9.0.10]
Un comando curl a la API REST de NetWorker Server muestra lo siguiente:
[root@NetworkerServer]# curl -X GET -H "Content-Type: application/json" "https://mynsr.mydomain.com:9090/nwrestapi/v3/global/backups" -u "administrator" -k -1
Enter host password for user 'administrator':
curl: (28) Operation timed out after 300406 milliseconds with 0 out of 0 bytes received
Cause
La API REST llama a "v3/global/backups", "v3/global/jobs", o "v3/global/volumes" por sí solas son consultas de uso intensivo de recursos y pueden hacer que se agote el tiempo de espera de la solicitud en entornos más grandes.
Los servicios de API REST de NetWorker se alojan en un contenedor de servlets Java Apache Tomcat que se ejecuta en una máquina virtual Java (JVM). La API REST utiliza la memoria de JVM para procesar cada solicitud y se ha demostrado que no toda la memoria se libera después de una consulta con uso intensivo de recursos. El aumento en la utilización de la memoria de JVM puede llegar a provocar que se agote el tiempo de espera de otras solicitudes de API REST con uso intensivo de recursos.
Resolution
Evite el uso de solicitudes con uso intensivo de recursos para recuperar información de NetWorker Server. Por ejemplo, la opción "v3/global/backups" o "v3/global/clients/CLIENT_NUMBER/backups" con un rango de tiempo definido se puede usar en lugar de usar el " globalv3/global/backups" para recuperar todos los respaldos.
Por ejemplo, restrinja los resultados de saveTime entre cualquier rango de tiempo especificado. Un ejemplo de una consulta de trabajos que se completaron en las últimas 24 horas:
../global/backups ejemplo:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/backups?q=saveTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/backups?q=saveTime:["2024-07-24T00:00:01" TO "2024-07-24T23:59:59"]
../global/clients/client_resourceId_number/backups
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/clients/client_resourceID_number/backups?q=saveTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/clients/87.0.90.20.0.0.0.0.196.80.99.102.192.168.9.150/backups?q=saveTime:["2024-07-24T00:00:01" TO "2024-07-24T23:59:59"]
../global/jobs:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/jobs?q=endTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/jobs?q=endTime:["2024-07-29T00:00:01" TO "2024-07-29T23:59:59"]
../global/volumes ejemplo:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes?q=type:"MEDIA_TYPE"&fl=location,name,mode,pool,written
https://nsr.amer.lan:9090/nwrestapi/v3/global/volumes?q=type:"Data Domain"&fl=location,name,mode,pool,written
Additional Information
Consulte la Guía para desarrolladores de API REST con respecto a las llamadas a la API de NetWorker, "query list filter" (q) y "filtro de lista de campos" (fl) ajustes.
La depuración de la API REST se define en: NetWorker: Cómo habilitar la depuración de la API REST
Como alternativa, se pueden realizar las siguientes pruebas:
Utilice las siguientes opciones en el comando de la API REST:
| Opción | Propósito: |
--max-time 3600 |
Establece un límite máximo de 3600 segundos (1 hora) para toda la transferencia (DNS, conexión, TLS, solicitud y cuerpo de respuesta). Si no finaliza toda la operación en un plazo de 1 hora, curl se detiene con un error de tiempo de espera agotado. |
--connect-timeout 60 |
Limita el tiempo permitido para establecer la conexión TCP/TLS a 60 segundos. Si curl no se puede conectar en un plazo de 60 segundos, falla ese intento. Con --retry habilitado, puede volver a intentarlo (sujeto a las siguientes reglas de reintento). Este valor se puede cambiar según su criterio. |
--retry 3 |
Indica a curl que reintente hasta tres veces en fallas transitorias. Este valor se puede cambiar según su criterio. Desencadenadores de reintento típicos:
|
--retry-delay 5 |
Establece una espera fija de 5 segundos entre los reintentos. Después de una falla transitoria, curl espera 5 segundos antes del siguiente intento. Este valor se puede cambiar según su criterio. |
-H "X-NW-AUTHC-BASE-URL:REMOTE_AUTHC_SERVER_ADDRESS:9090" |
(Opcional). Esto solo es necesario si el host de NetWorker que se utiliza para procesar las solicitudes de inicio de sesión es independiente del servidor de NetWorker en el terminal de la API REST. Consulte: API REST de NetWorker: Cómo usar un servidor AUTHC remoto cuando se procesan solicitudes de API REST |
Windows Powershell:
curl.exe -k -v --compressed ` --max-time 3600 ` --connect-timeout 60 ` --retry 3 ` --retry-delay 5 ` -u NETWORKER_USERNAME:'PASSWORD' ` -H "Accept: application/json" ` "https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes/ENDPOINT" ` | ConvertFrom-Json ` | ConvertTo-Json -Depth 20 ` | Out-File -Encoding UTF8 OUTPUT_FILE_NAME
-Depth 20 es un parámetro para la propiedad ConvertTo-Json . Controla cuántos niveles de objetos anidados y matrices se incluyen cuando PowerShell serializa los datos en JSON. La cantidad de objetos anidados (si los hay) puede variar según el terminal de la API REST utilizado y cualquier posible "filtro de lista de consultas" (q) o "filtro de lista de campos" (fl) parámetros utilizados. 20 debe ser más que suficiente para las llamadas a la API REST de NetWorker.
En el ejemplo anterior, se creó el archivo
volumes.json archivo en el directorio desde el cual se procede curl.exe se ejecutó. El contenido del archivo incluye la carga útil de la API REST:
Linux:
curl -k -v --compressed \ --max-time 3600 \ --connect-timeout 60 \ --retry 3 \ --retry-all-errors \ --retry-delay 5 \ -u NETWORKER_USERNAME:'PASSWORD' \ -H "Accept: application/json" \ "https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes/ENDPOINT" \ -o volumes.json
Ejemplo (sin -v En aras de la brevedad):
[root@nsr ~]# curl -k --compressed \
--max-time 3600 \
--connect-timeout 60 \
--retry 3 \
--retry-all-errors \
--retry-delay 5 \
-u Administrator:'!Password1' \
-H "Accept: application/json" \
"https://nsr.amer.lan:9090/nwrestapi/v3/global/volumes?q=type%3A%22Data%20Domain%22&fl=location,name,mode,pool,written" \
-o volumes.json
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 908 0 908 0 0 22700 0 --:--:-- --:--:-- --:--:-- 22146
En este ejemplo, el archivo "volumes.json" se creó en el mismo directorio desde el que se ejecutó el comando.
Se pueden utilizar diferentes herramientas para analizar correctamente el formato json. Las herramientas utilizadas pueden variar según el sistema operativo y el software instalado.
[root@nsr ~]# cat volumes.json | python -m json.tool
{
"count": 6,
"volumes": [
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan.dddefault.001",
"pool": "Data Domain Default",
"written": {
"unit": "KB",
"value": 429
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan.dddefault.002",
"pool": "Data Domain Default",
"written": {
"unit": "KB",
"value": 25917027
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "VMBackupPool.001",
"pool": "VMBackupPool",
"written": {
"unit": "KB",
"value": 209818962
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "VMBackupPool.002",
"pool": "VMBackupPool",
"written": {
"unit": "KB",
"value": 2308309500
}
},
{
"location": "ddve02.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan_c.dddefault.001",
"pool": "Data Domain Default Clone",
"written": {
"unit": "KB",
"value": 36752
}
},
{
"location": "ddve02.amer.lan",
"mode": "Appendable",
"name": "VMClonePool.001",
"pool": "VMClonePool",
"written": {
"unit": "KB",
"value": 0
}
}
]
}