API REST do NetWorker: As solicitações HTTP GET estão com tempo de espera excedido intermitente
Résumé: A interface de programa de aplicativo (API) do NetWorker Representational State Transfer (REST) é usada para solicitar informações (HTTP GET) de um servidor NetWorker no ambiente. As consultas da API REST têm tempo de espera excedido intermitentemente, e o restapi.log mostra uma mensagem de erro interna do servidor devido a um tempo de espera excedido do soquete. ...
Symptômes
A interface do programa de aplicativo (API) do NetWorker Representational State Transfer (REST) é usada para solicitar informações (HTTP GET) de um servidor NetWorker no ambiente. As consultas da API REST têm tempo de espera excedido intermitentemente, e o restapi.log mostra uma mensagem de erro interna do servidor devido a um tempo de espera excedido do soquete.
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]
Um comando curl para a API REST do servidor NetWorker mostra:
[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
A API REST chama "v3/global/backups", "v3/global/jobs", ou "v3/global/volumes" sozinhas são consultas que consomem muitos recursos e podem fazer com que a solicitação atinja o tempo de espera excedido em ambientes maiores.
Os serviços da API REST do NetWorker são hospedados em um contêiner de servlet Java Apache Tomcat que é executado em uma JVM (Java Virtual Machine). A API REST usa memória JVM para processar cada solicitação, e foi demonstrado que nem toda a memória é liberada após uma consulta com uso intenso de recursos. O aumento na utilização da memória da JVM pode, eventualmente, levar a outras solicitações da API REST com menos uso de recursos ao tempo de espera excedido.
Résolution
Evite usar as solicitações com uso intenso de recursos para recuperar informações do servidor NetWorker. Por exemplo, o "v3/global/backups" ou "v3/global/clients/CLIENT_NUMBER/backups" com um intervalo de tempo definido pode ser usado em vez de usar o global "v3/global/backups" para recuperar todos os backups.
Por exemplo, restrinja os resultados de saveTime entre qualquer intervalo de tempo especificado. Um exemplo de uma consulta para trabalhos que foram concluídos nas últimas 24 horas:
../global/backups exemplo:
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 exemplo:
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
Informations supplémentaires
Consulte o Guia do desenvolvedor da API REST em relação às chamadas de API do NetWorker, "query list filter" (q) e "filtro da lista de campos" (fl) configurações.
A depuração da API REST é definida em: NetWorker: Como habilitar a depuração
da API RESTComo alternativa, os seguintes testes podem ser usados:
Use as seguintes opções no comando da API REST:
| Opção | Objetivo |
--max-time 3600 |
Define um limite rígido de 3.600 segundos (1 hora) para toda a transferência (DNS, conexão, TLS, solicitação e corpo de resposta). Se a operação inteira não for concluída dentro de 1 hora, o curl será interrompido com um erro de tempo de espera excedido. |
--connect-timeout 60 |
Limita o tempo permitido para estabelecer a conexão TCP/TLS a 60 segundos. Se o curl não conseguir se conectar dentro de 60 segundos, ele falhará nessa tentativa. Com --retry ativado, ele pode tentar novamente (sujeito às regras de repetição abaixo). Esse valor pode ser alterado a seu critério. |
--retry 3 |
Instrui o curl a repetir até três vezes em falhas transitórias. Esse valor pode ser alterado a seu critério. Ativadores de repetição típicos:
|
--retry-delay 5 |
Define uma espera fixa de 5 segundos entre as tentativas de repetição. Após uma falha transitória, o curl aguarda 5 segundos antes da próxima tentativa. Esse valor pode ser alterado a seu critério. |
-H "X-NW-AUTHC-BASE-URL:REMOTE_AUTHC_SERVER_ADDRESS:9090" |
(Opcional.) Isso só será necessário se o host do NetWorker usado para processar solicitações de log-in for separado do servidor do NetWorker no endpoint da API REST. Consulte: API REST do NetWorker: Como usar um servidor AUTHC remoto ao processar solicitações RESTAPI |
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 é um parâmetro para o PowerShell ConvertTo-Json cmdlet. Ele controla quantos níveis de objetos e matrizes aninhados são incluídos quando o PowerShell serializa seus dados para JSON. O número de objetos aninhados (se houver) pode variar dependendo do endpoint da API REST usado e de qualquer possível "filtro de lista de consulta" (q) ou "filtro de lista de campos" (fl) parâmetros utilizados. 20 deve ser mais do que suficiente para chamadas API REST do NetWorker.
O exemplo acima criou o
volumes.json no diretório a partir do qual curl.exe foi executado. O conteúdo do arquivo inclui o payload da 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
Exemplo (sem -v por brevidade):
[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
Neste exemplo, o arquivo "volumes.json" foi criado no mesmo diretório a partir do qual o comando foi executado.
Diferentes ferramentas podem ser usadas para analisar a formatação json corretamente, as ferramentas usadas podem variar dependendo do sistema operacional e do 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
}
}
]
}