O Pulsar mostra cada log no navegador assim que ele é gravado, agrupa os erros sozinho e desenha cada requisição como uma cascata entre os seus serviços. Uma linha no seu app Node.js, Next.js, pino ou .NET e é só ver os logs chegando.
Use a nossa nuvem ou rode você mesmo: um processo Node.js e um arquivo SQLite.
WARN14:31:55Card declined for order ord_aecaacf2: insufficient_fundsb001cebepayments-worker
SDKs para
Node.js
Next.js
pino
.NET
ou qualquer cliente HTTP
Produto
Tudo o que a produção está dizendo, numa aba só.
Logs, grupos de erro, traces, dashboards e alertas usam o mesmo modelo de dados, então uma tela leva à outra: o alerta abre o log, o log abre o trace e o trace mostra onde falhou.
Live tail
Um live tail que acompanha o ritmo.
Os logs novos chegam a todo dashboard aberto via Server-Sent Events assim que são gravados, intercalados com os seus deploys. Filtre por nível, serviço e texto, pause, volte no tempo ou escolha um intervalo.
Feito para o teclado: / busca, j e k navegam, Enter abre
Cada log abre com a requisição, o stack trace, os metadados e as linhas ao redor
Marcadores de deploy vindos do CI alinham um pico de erros com a release que o causou
pulsar /stream
Agrupamento de erros
Cem stack traces, um grupo de erro.
Os erros são agrupados por serviço e mensagem normalizada, sem números nem UUIDs, e mostram a contagem, a primeira e a última ocorrência, o stack trace mais recente e as ocorrências recentes. Resolva ou ignore um grupo para fazer a triagem.
Os frames do seu código ganham destaque; os de bibliotecas e do Node.js ficam recolhidos
Crie alertas para um grupo ou para qualquer texto de erro, como ECONNREFUSED
pulsar /errors
Traces distribuídos
Siga uma requisição por todos os serviços.
Cada trace tem a sua própria página: o caminho entre serviços, onde falhou, para onde foi o tempo e uma cascata de spans de servidor, de cliente, internos e de fila. Os SDKs continuam o header W3C traceparent, então um checkout que passa por cinco serviços vira um trace só.
pulsar /trace/a3f9c2e1…
Onde falhou
O primeiro erro, o serviço e o instante, a um clique da entrada.
Para onde foi o tempo
O span mais lento e quanto ele pesa no trace. Longos períodos ociosos são comprimidos para o trabalho continuar legível.
Feito para compartilhar
Um link /trace/<id>, busca dentro do trace, filtro só de erros e download em JSON.
Dashboards
Gráficos a partir dos seus próprios campos.
Widgets de número, série temporal e ranking, cada um com o seu filtro: nível, serviço, texto ou qualquer campo dos metadados.
pulsar /dashboards
Alertas
Alertas que levam direto ao log.
Slack, Discord, ntfy ou qualquer webhook, quando os logs batem um nível, passam de uma contagem numa janela de tempo ou pertencem a um grupo de erro. As regras têm throttle, podem ser testadas pela interface e cada envio fica registrado.
pulsar /settings
Também vem junto
Saúde por serviço: volume, taxa de erro, p95 e p99
Paleta de comandos: Ctrl K, ou ⌘K no macOS
Temas claro e escuro
Telas que funcionam até num celular de 375 px
Instalação
Pronto em três passos.
Sem agente, sem sidecar, sem coletor para manter. Os SDKs agrupam os envios, tentam de novo e nunca travam o seu app.
1
Instale o SDK
Um pacote do npm, NuGet no .NET, ou nada, se for de curl.
2
Adicione uma linha
Aponte para o Pulsar com a sua API key. Você recebe uma ao criar a conta.
3
Veja os logs ao vivo
Abra o Live Stream e veja os logs chegando, cada requisição com o seu trace ID.
O transport roda na worker thread do pino, então o seu logger nunca espera pela rede.
1Instalar
shell
dotnet add package FabBahiense.Pulsar.AspNetCore
2Configurar
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddPulsar(o => o.ServiceName = "checkout-api");
var app = builder.Build();
app.UsePulsarRequestLogging(); // one entry per request, with its trace ID
app.MapGet("/api/orders", (ILogger<Program> log) =>
{
log.LogInformation("Listing orders");
return Results.Ok(Array.Empty<object>());
});
app.Run();
Provider de ILogger e middleware para ASP.NET Core no .NET 8; o client e o provider de ILogger também rodam em netstandard2.0. Os pacotes ainda não estão no nuget.org: fale com a gente.
Quem tem uma chave de ingestão controla o que um log diz, então o Pulsar trata os dados de log como não confiáveis do SDK até a tela.
Webhooks protegidos contra SSRF
Os destinos de alerta precisam ser endereços públicos. Isso é checado ao salvar a regra e de novo na própria conexão, depois da resolução de DNS e a cada redirect, então DNS rebinding não alcança a sua rede.
Dados sensíveis mascarados
Senhas, tokens, API keys, cookies e headers Authorization são mascarados nos headers e corpos capturados, em qualquer profundidade, por todos os middlewares dos SDKs. Acrescente as suas chaves com redactKeys.
Isolamento entre workspaces
Toda consulta é restrita ao workspace da API key ou da sessão, e IDs de outro workspace respondem 404. As API keys são guardadas como hash SHA-256 e exibidas uma única vez.
Retries sem perda
Os SDKs tentam de novo em 429, 5xx e timeouts, com backoff, respeitam o Retry-After e reenviam exatamente o mesmo lote, até 10 vezes por padrão. O servidor deduplica pelo ID de cada entrada, então um retry nunca grava o log duas vezes. Os buffers são limitados e, se algo acabar descartado, isso é contado e avisado, nunca em silêncio.
Dúvidas
Perguntas frequentes.
O que conta no limite diário de logs?
Cada entrada gravada conta uma vez: uma chamada do logger, uma linha de console, uma entrada de requisição ou um objeto JSON. Um lote com 200 entradas são 200 logs. Duplicatas de retry e entradas rejeitadas não contam, e o contador zera às 00:00 UTC.
O que acontece quando o limite do plano Free acaba?
A ingestão responde 429 até o contador zerar, às 00:00 UTC. Os SDKs tentam de novo e depois descartam e avisam o que não conseguiram entregar. O que já foi gravado continua lá.
Preciso mudar o meu código de log?
Normalmente não. Apps Node.js podem continuar usando console.log, o pino ganha um transport, o .NET entra pelo ILogger e qualquer outra coisa pode fazer POST de JSON. O Pulsar entende pino, pino-http e os nomes de campo da maioria dos loggers estruturados.
É OpenTelemetry?
Não. Os SDKs do Pulsar propagam o W3C traceparent, então os traces atravessam os seus serviços e a decisão de amostragem de quem veio antes é repassada intacta, mas o Pulsar não recebe dados OTLP.
Onde ficam os meus dados, e por quanto tempo?
No Pulsar Cloud, nos nossos servidores, pelo tempo de retenção do seu plano (até 5 dias no Free, 30 dias no Pro); depois disso, um job diário apaga. No self-hosted, num arquivo SQLite no seu próprio servidor.
Como funciona a cobrança?
O plano Free não pede cartão. Para o Pro, fale com a gente. A cobrança em reais via Pix chega em breve.
Os SDKs são open source?
Sim, com licença MIT. Os SDKs de JavaScript estão no npm; os pacotes .NET são compilados e testados no CI, mas ainda não estão no nuget.org. O servidor do Pulsar é proprietário.
Posso rodar o Pulsar no meu servidor?
Pode: Node.js 20 ou mais novo, um arquivo SQLite e um proxy reverso com HTTPS, sem mais nenhuma infraestrutura. O self-hosting tem licença à parte; fale com a gente.
Seu próximo incidente, já rastreado.
Crie um workspace, copie a API key e mande o primeiro log. Leva uns dois minutos.