UNPKG

performance-monitor-logger

Version:

## Instalação

186 lines (142 loc) 5.27 kB
# 📊 Performance Monitor Logger - Complete Guide ## Instalação ```bash npm i performance-monitor-logger --save-dev ``` ## Exemplo de Uso ### tela.service.ts ```typescript import { Injectable } from "@angular/core"; import { PerformanceMonitor } from "performance-monitor-logger"; //<-- @Injectable({ providedIn: "root" }) export class ExemploService { constructor() {} @PerformanceMonitor() //<-- async buscarUsuarios() { try { const usuarios = await this.http.get("/api/usuarios").toPromise(); return usuarios; } catch (error) { throw error; } } @PerformanceMonitor() //<-- async salvarUsuario(usuario: any) { try { const resultado = await this.http.post("/api/usuarios", usuario).toPromise(); return resultado; } catch (error) { throw error; } } } ``` ### tela.component.ts ```typescript import { Injectable } from "@angular/core"; import { GlobalPerformanceLogger } from "performance-monitor-logger"; //<-- constructor() { GlobalPerformanceLogger.injectMonitorButton(); //<-- } ``` ### app.module.ts ```typescript import { PerformanceMonitorInterceptor } from "performance-monitor-logger"; //<-- @NgModule({ providers: [ ...{ provide: HTTP_INTERCEPTORS, //<-- useClass: PerformanceMonitorInterceptor, //<-- multi: true, //<-- }, ], }) export class AppModule {} ``` ## Modo Auto‑Instrumentação (sem decorators) – monitorar `setService(...)` Em cenários onde serviços são registrados via `setService(this)` (ex.: packs como `packTela`, `packDescricoes`, etc.), você pode habilitar o monitoramento automaticamente, sem usar `@PerformanceMonitor()` em cada método. O logger disponibiliza três utilitários: - `GlobalPerformanceLogger.hookSetService(target, label?, options?)` - `GlobalPerformanceLogger.hookSetServiceBulk(targetsMap, options?)` - `GlobalPerformanceLogger.hookSetServiceNamespace(root, options?)` Esses hooks substituem a função `setService` do alvo e instrumentam a instância passada, envolvendo todos os métodos públicos para coleta de métricas com segurança e alto desempenho. ### Opções principais - `exclude`: filtros de métodos a ignorar (padrão exclui `constructor`). - `nameTransform`: função para nomear operações (ex.: `packTela.metodo`). - `include`/`exclude` (InstrumentOptions): filtros por nome do método. - `includeObjects`/`excludeObjects` (Namespace): filtros por caminho do objeto em varredura. - `maxWalkDepth`: profundidade máxima ao varrer namespaces. ### Exemplo 1 — Hook em vários packs com uma chamada | SUGESTÃO | ```typescript import { GlobalPerformanceLogger } from "performance-monitor-logger"; // Agrupe os packs em um objeto literal const packs = { packTela, packDescricoes, packCalculo, packFormulas, packPrecograoInterno, packProcedimentos, gravaFixacao, gravaProgfixacao, gravaDevolucao, packFornecedor, packTransgenicoInterna, packMaxeditorTela, packClifor, packParametros, packVetor, packQualidade, packRecexpgrao, packImpostotela, packFuncoes, packMestra, packPropostanegocio, packFavorecidos, functionService: this.functionService, modelLov: this.modelLov, packArquivoutils: this.packArquivoutils, }; // Aplica o hook de forma bulk GlobalPerformanceLogger.hookSetServiceBulk(packs, { exclude: ["constructor"], nameTransform: (name, path) => `${path?.[0] || "service"}.${name}`, }); // As chamadas existentes a setService(...) continuam funcionando normalmente, // mas agora cada serviço passado será instrumentado automaticamente. ``` ### Exemplo 2 — Varredura de namespace ```typescript import { GlobalPerformanceLogger } from "performance-monitor-logger"; const packs = { /* mesmo objeto do exemplo anterior */ }; GlobalPerformanceLogger.hookSetServiceNamespace(packs, { includeObjects: [/./], maxWalkDepth: 0, exclude: ["constructor"], labelFromPath: (p) => p[0], nameTransform: (name, path) => `${path?.[0] || "service"}.${name}`, }); ``` ### Exemplo 3 — Por objeto individual ```typescript import { GlobalPerformanceLogger } from "performance-monitor-logger"; GlobalPerformanceLogger.hookSetService(packTela, "packTela"); GlobalPerformanceLogger.hookSetService(packDescricoes, "packDescricoes"); // ... e assim por diante ``` ### Como os nomes das operações são formados - Por padrão, cada método instrumentado recebe o nome `label.metodo`. - O `label` vem do argumento passado ou do caminho calculado no namespace. - Personalize com `nameTransform`, por exemplo: `name => 'srv:' + name`. ### Interoperabilidade com o modo decorator - Você pode misturar os dois modos. Métodos anotados com `@PerformanceMonitor()` continuam medidos. - O hook evita duplicação e preserva `toString()` para compatibilidade com regex. - O `constructor` é sempre ignorado por segurança. ## Resultado esperado: ### No console você verá: ![Logs](./projects/performance-monitor-logger/src/lib/img/1.png) ![análise detalhada](./projects/performance-monitor-logger/src/lib/img/2.png) ![relatório de performance](./projects/performance-monitor-logger/src/lib/img/3.png) ![relatório de requisição](./projects/performance-monitor-logger/src/lib/img/4.png)