Sidekiq: hacks de UI pro painel quando ele tem 100 mil itens
Série Sidekiq — parte 4 de 4
- Infra: iniciando, parando, matando
- Diagnóstico pelo console
- Manipulação em massa de jobs e processos
- Você está aqui — Hacks de UI no painel
A UI nativa do Sidekiq é ótima pra inspecionar dezenas ou centenas de jobs. Quando você tem 100 mil retries depois de um deploy ruim, ela vira inimiga: paginada em 25 itens, sem ordenação clicável, com <pre> esticando o layout pra fora da tela.
Esses três hacks transformam a tela em algo usável.
URL pra exibir mais jobs por página
1
http://localhost:3000/sidekiq/retries?count=100000
A UI padrão pagina em 25 — mas o controlador aceita ?count=N e respeita. Se você precisa selecionar tudo de uma classe específica, aumentar o count pra um número que englobe todos os retries é mais prático que iterar por páginas. Funciona também em /scheduled e /morgue (dead set).
Cuidado: 100 mil linhas faz a página renderizar lenta. Em casos extremos, é melhor usar o console (parte 3) em vez de carregar tudo no DOM.
Tornar a tabela legível e ordenável
Cole isso no console do DevTools com a página de retries aberta:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$('.container').css({
'max-width': '100%',
'width': 'auto'
});
$('.table td').css({
'overflow': 'auto'
});
$('.table td pre').css({
'overflow': 'auto',
'border': '1px solid black',
'margin': '10px 0'
});
$('.table th').eq(1).width('');
$('.table th').eq(2).width('');
$.getScript("//cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.13.3/jquery.tablesorter.min.js")
.done(function (script, textStatus) {
$('table').tablesorter();
});
O que cada bloco faz:
.container— destrava omax-widthpadrão pra usar a tela inteira..table tde.table td pre— colocaoverflow: autonas células e nos blocos de erro, então linhas grandes ganham scroll horizontal próprio em vez de quebrar o layout..table th— reseta a largura fixa das colunas que normalmente comem espaço.- tablesorter via CDN — adiciona ordenação clicável em qualquer coluna, sem precisar de extensão.
Selecionar jobs por critério de texto
Depois que a tabela está ordenável, marcar em massa fica trivial:
1
2
3
4
5
// Por nome da fila
$("td:contains('funnels_test_worker')").parent().find('td input').prop('checked', true);
// Por mensagem de erro
$("td:contains('ZeroDivisionError: divided by 0')").parent().find('td input').prop('checked', true);
O padrão é simples: td:contains('texto') acha as células que contêm aquele texto, sobe pro <tr> e marca o checkbox. Depois é só clicar em “Delete” ou “Retry” no topo da tabela.
Em incidentes, isso é literalmente 10× mais rápido que tentar filtrar via UI. Combinações úteis:
- Marcar tudo de uma classe falhando:
$("td:contains('Funnels::SyncWorker'))... - Marcar tudo com um mesmo erro:
$("td:contains('Net::OpenTimeout'))... - Marcar tudo de um período: ordenar pela coluna de data com tablesorter, depois selecionar manualmente.
Quando isso não basta
Se você está chegando em milhões de jobs ou os hacks de UI estão começando a travar o browser, é hora de voltar pro console e usar os snippets da parte 3. Browser não foi feito pra render esse volume — Ruby foi.
Final da série
Essa foi a parte 4 e última. Voltando ao começo: Infra: iniciando, parando, matando.