From 3c8aa13a5ed12a2907df05d756a1be054cb71d8d Mon Sep 17 00:00:00 2001 From: Luiz Silva Date: Fri, 21 Feb 2025 14:37:06 -0300 Subject: [PATCH] =?UTF-8?q?adicionado=20integra=C3=A7=C3=A3o=20com=20loki?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/index.d.ts | 1 + dist/index.js | 1 + dist/index.js.map | 2 +- dist/logger.d.ts | 15 ++++++++++ dist/logger.js | 51 +++++++++++++++++++++++++++++++++ dist/logger.js.map | 1 + dist/teste.d.ts | 1 + dist/teste.js | 5 ++++ dist/teste.js.map | 1 + package.json | 3 +- pnpm-lock.yaml | 53 ++++++++++++++++++++++++++++++---- src/index.ts | 1 + src/logger.ts | 71 ++++++++++++++++++++++++++++++++++++++++++++++ src/teste.ts | 3 ++ 14 files changed, 202 insertions(+), 7 deletions(-) create mode 100644 dist/logger.d.ts create mode 100644 dist/logger.js create mode 100644 dist/logger.js.map create mode 100644 dist/teste.d.ts create mode 100644 dist/teste.js create mode 100644 dist/teste.js.map create mode 100644 src/logger.ts create mode 100644 src/teste.ts diff --git a/dist/index.d.ts b/dist/index.d.ts index df34183..a769ea5 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -8,3 +8,4 @@ export * from "./ecosistema"; export * from "./variaveisComuns"; export * from "./tipagemRotas"; export * from "./extensoes"; +export * from "./logger"; diff --git a/dist/index.js b/dist/index.js index 9b5bc03..423a81d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -24,4 +24,5 @@ __exportStar(require("./ecosistema"), exports); __exportStar(require("./variaveisComuns"), exports); __exportStar(require("./tipagemRotas"), exports); __exportStar(require("./extensoes"), exports); +__exportStar(require("./logger"), exports); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index c452059..a1b2649 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,6CAA0B;AAC1B,8CAA2B;AAC3B,gDAA6B;AAC7B,oDAAiC;AACjC,yCAAsB;AACtB,+CAA4B;AAC5B,oDAAiC;AACjC,iDAA8B;AAC9B,8CAA2B"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,6CAA0B;AAC1B,8CAA2B;AAC3B,gDAA6B;AAC7B,oDAAiC;AACjC,yCAAsB;AACtB,+CAA4B;AAC5B,oDAAiC;AACjC,iDAA8B;AAC9B,8CAA2B;AAC3B,2CAAwB"} \ No newline at end of file diff --git a/dist/logger.d.ts b/dist/logger.d.ts new file mode 100644 index 0000000..4f2e380 --- /dev/null +++ b/dist/logger.d.ts @@ -0,0 +1,15 @@ +interface LogOptions { + app?: string; + conta?: string; + usuario?: string; + detalhes?: unknown[]; +} +export declare const logger: { + /** 🟢 Informação geral */ + info: (message: string, options?: LogOptions) => Promise; + /** 🟡 Aviso/atenção necessária */ + warn: (message: string, options?: LogOptions) => Promise; + /** 🔴 Erro crítico na execução */ + error: (message: string, options?: LogOptions) => Promise; +}; +export {}; diff --git a/dist/logger.js b/dist/logger.js new file mode 100644 index 0000000..7c80ace --- /dev/null +++ b/dist/logger.js @@ -0,0 +1,51 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logger = void 0; +const cross_fetch_1 = __importDefault(require("cross-fetch")); +const LOKI_BASE_URL = "https://log.idz.one"; +const LOKI_ENDPOINT = "/loki/api/v1/push"; +const createLogger = (level) => { + const sendToLoki = async (message, options = {}) => { + const { app, conta, usuario, detalhes = [] } = options; + const timestamp = `${Date.now()}000000`; + try { + // Formata a linha de log principal + const mainLog = detalhes.length > 0 + ? `${message} | ${detalhes.map((d) => JSON.stringify(d)).join(" ")}` + : message; + const payload = { + stream: { app, conta, usuario, level }, + values: [ + [ + timestamp, + mainLog, // Linha de log direta + ], + ], + }; + const response = await (0, cross_fetch_1.default)(`${LOKI_BASE_URL}${LOKI_ENDPOINT}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ streams: [payload] }), + }); + if (!response.ok) { + throw new Error(`Erro ${response.status}: ${await response.text()}`); + } + } + catch (error) { + console.error("[Logger] Falha no envio:", error); + } + }; + return sendToLoki; +}; +exports.logger = { + /** 🟢 Informação geral */ + info: createLogger("info"), + /** 🟡 Aviso/atenção necessária */ + warn: createLogger("warn"), + /** 🔴 Erro crítico na execução */ + error: createLogger("error"), +}; +//# sourceMappingURL=logger.js.map \ No newline at end of file diff --git a/dist/logger.js.map b/dist/logger.js.map new file mode 100644 index 0000000..de04e87 --- /dev/null +++ b/dist/logger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAoC;AAEpC,MAAM,aAAa,GAAG,qBAAqB,CAAA;AAC3C,MAAM,aAAa,GAAG,mBAAmB,CAAA;AAqBzC,MAAM,YAAY,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,MAAM,UAAU,GAAG,KAAK,EAAE,OAAe,EAAE,UAAsB,EAAE,EAAE,EAAE;QACrE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,OAAO,CAAA;QACtD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAA;QAEvC,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,OAAO,GACX,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACjB,CAAC,CAAC,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACpE,CAAC,CAAC,OAAO,CAAA;YAEb,MAAM,OAAO,GAAe;gBAC1B,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;gBACtC,MAAM,EAAE;oBACN;wBACE,SAAS;wBACT,OAAO,EAAE,sBAAsB;qBAChC;iBACF;aACF,CAAA;YAED,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAU,EAAC,GAAG,aAAa,GAAG,aAAa,EAAE,EAAE;gBACpE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;aAC7C,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YACtE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAClD,CAAC;IACH,CAAC,CAAA;IAED,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,0BAA0B;IAC1B,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;IAC1B,kCAAkC;IAClC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;IAC1B,kCAAkC;IAClC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;CAC7B,CAAA"} \ No newline at end of file diff --git a/dist/teste.d.ts b/dist/teste.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/dist/teste.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/dist/teste.js b/dist/teste.js new file mode 100644 index 0000000..ddcaafe --- /dev/null +++ b/dist/teste.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = require("./logger"); +logger_1.logger.error("Esse é um erro", { app: "teste" }); +//# sourceMappingURL=teste.js.map \ No newline at end of file diff --git a/dist/teste.js.map b/dist/teste.js.map new file mode 100644 index 0000000..629572e --- /dev/null +++ b/dist/teste.js.map @@ -0,0 +1 @@ +{"version":3,"file":"teste.js","sourceRoot":"","sources":["../src/teste.ts"],"names":[],"mappings":";;AAAA,qCAAiC;AAEjC,eAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA"} \ No newline at end of file diff --git a/package.json b/package.json index 2d59874..b0a749e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p-comuns", - "version": "0.70.0", + "version": "0.72.0", "description": "", "main": "dist/index.js", "scripts": { @@ -15,6 +15,7 @@ }, "license": "ISC", "dependencies": { + "cross-fetch": "^4.1.0", "zod": "3.24.1" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 917106d..677017c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,12 @@ importers: .: dependencies: + cross-fetch: + specifier: ^4.1.0 + version: 4.1.0 zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: 3.24.1 + version: 3.24.1 devDependencies: '@biomejs/biome': specifier: ^1.9.4 @@ -80,6 +83,21 @@ packages: '@types/node@20.16.10': resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -88,8 +106,14 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} snapshots: @@ -132,8 +156,27 @@ snapshots: dependencies: undici-types: 6.19.8 + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + tr46@0.0.3: {} + typescript@5.7.2: {} undici-types@6.19.8: {} - zod@3.23.8: {} + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + zod@3.24.1: {} diff --git a/src/index.ts b/src/index.ts index fe1c614..743bb1d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,3 +8,4 @@ export * from "./ecosistema" export * from "./variaveisComuns" export * from "./tipagemRotas" export * from "./extensoes" +export * from "./logger" diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..02c2db8 --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,71 @@ +import crossFetch from "cross-fetch" + +const LOKI_BASE_URL = "https://log.idz.one" +const LOKI_ENDPOINT = "/loki/api/v1/push" + +type LogLevel = "info" | "warn" | "error" + +interface LogOptions { + app?: string + conta?: string + usuario?: string + detalhes?: unknown[] +} + +interface LokiStream { + stream: { + app?: string + conta?: string + usuario?: string + level: LogLevel + } + values: Array<[string, string]> +} + +const createLogger = (level: LogLevel) => { + const sendToLoki = async (message: string, options: LogOptions = {}) => { + const { app, conta, usuario, detalhes = [] } = options + const timestamp = `${Date.now()}000000` + + try { + // Formata a linha de log principal + const mainLog = + detalhes.length > 0 + ? `${message} | ${detalhes.map((d) => JSON.stringify(d)).join(" ")}` + : message + + const payload: LokiStream = { + stream: { app, conta, usuario, level }, + values: [ + [ + timestamp, + mainLog, // Linha de log direta + ], + ], + } + + const response = await crossFetch(`${LOKI_BASE_URL}${LOKI_ENDPOINT}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ streams: [payload] }), + }) + + if (!response.ok) { + throw new Error(`Erro ${response.status}: ${await response.text()}`) + } + } catch (error) { + console.error("[Logger] Falha no envio:", error) + } + } + + return sendToLoki +} + +export const logger = { + /** 🟢 Informação geral */ + info: createLogger("info"), + /** 🟡 Aviso/atenção necessária */ + warn: createLogger("warn"), + /** 🔴 Erro crítico na execução */ + error: createLogger("error"), +} diff --git a/src/teste.ts b/src/teste.ts new file mode 100644 index 0000000..7bb4100 --- /dev/null +++ b/src/teste.ts @@ -0,0 +1,3 @@ +import { logger } from "./logger" + +logger.error("Esse é um erro", { app: "teste" })