From a00341ea5803eec7e9e280a8652ed336ae9fc28c Mon Sep 17 00:00:00 2001 From: mahyargdz Date: Wed, 23 Apr 2025 16:30:28 +0330 Subject: [PATCH] chore: add prometheos metirc module --- docker-compose.yaml | 67 +++++++++++++++++++++++------ package.json | 2 + pnpm-lock.yaml | 44 +++++++++++++++++++ prometheus/prometheus.yml | 14 ++++++ src/app.module.ts | 2 + src/monitoring/monitoring.module.ts | 17 ++++++++ 6 files changed, 134 insertions(+), 12 deletions(-) create mode 100644 prometheus/prometheus.yml create mode 100644 src/monitoring/monitoring.module.ts diff --git a/docker-compose.yaml b/docker-compose.yaml index f027090..c95313f 100755 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -16,21 +16,64 @@ services: POSTGRES_USER: ${DB_USER} POSTGRES_DB: ${DB_NAME} + nestjs: + build: . + ports: + - "3000:3000" + depends_on: + - pg_db + environment: + - NODE_ENV=development + volumes: + - ./src:/app/src + - ./dist:/app/dist - # pgadmin: - # image: dpage/pgadmin4 - # restart: always - # container_name: pgadmin - # ports: - # - 5050:80 - # environment: - # PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} - # PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} - # depends_on: - # - pg_db + prometheus: + image: prom/prometheus:latest + container_name: prometheus + ports: + - "9090:9090" + volumes: + - ./prometheus:/etc/prometheus + - prometheus_data:/prometheus + command: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + - "--web.console.libraries=/usr/share/prometheus/console_libraries" + - "--web.console.templates=/usr/share/prometheus/consoles" + restart: always + + grafana: + image: grafana/grafana:latest + container_name: grafana + ports: + - "3001:3000" + volumes: + - grafana_data:/var/lib/grafana + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + depends_on: + - prometheus + restart: always + +# pgadmin: +# image: dpage/pgadmin4 +# restart: always +# container_name: pgadmin +# ports: +# - 5050:80 +# environment: +# PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} +# PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} +# depends_on: +# - pg_db volumes: postgres_data: + prometheus_data: + grafana_data: # networks: # app_network: -# driver: bridge \ No newline at end of file +# driver: bridge diff --git a/package.json b/package.json index e476d97..92c6452 100755 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@nestjs/throttler": "^6.4.0", "@nestjs/typeorm": "^11.0.0", "@types/bcrypt": "^5.0.2", + "@willsoto/nestjs-prometheus": "^6.0.2", "aws-sdk": "^2.1692.0", "axios": "^1.8.4", "bcrypt": "^5.1.1", @@ -65,6 +66,7 @@ "nodemailer": "^6.10.1", "passport-jwt": "^4.0.1", "pg": "^8.14.1", + "prom-client": "^15.1.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2", "slugify": "^1.6.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6182e4..32393a8 100755 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: '@types/bcrypt': specifier: ^5.0.2 version: 5.0.2 + '@willsoto/nestjs-prometheus': + specifier: ^6.0.2 + version: 6.0.2(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(prom-client@15.1.3) aws-sdk: specifier: ^2.1692.0 version: 2.1692.0 @@ -113,6 +116,9 @@ importers: pg: specifier: ^8.14.1 version: 8.14.1 + prom-client: + specifier: ^15.1.3 + version: 15.1.3 reflect-metadata: specifier: ^0.2.2 version: 0.2.2 @@ -1318,6 +1324,10 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} @@ -1926,6 +1936,12 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@willsoto/nestjs-prometheus@6.0.2': + resolution: {integrity: sha512-ePyLZYdIrOOdlOWovzzMisIgviXqhPVzFpSMKNNhn6xajhRHeBsjAzSdpxZTc6pnjR9hw1lNAHyKnKl7lAPaVg==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + prom-client: ^15.0.0 + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -2180,6 +2196,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -4700,6 +4719,10 @@ packages: process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + prom-client@15.1.3: + resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} + engines: {node: ^16 || ^18 || >=20} + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -5216,6 +5239,9 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + telegraf@4.16.3: resolution: {integrity: sha512-yjEu2NwkHlXu0OARWoNhJlIjX09dRktiMQFsM678BAH/PEPVwctzL67+tvXqLCRQQvm3SDtki2saGO9hLlz68w==} engines: {node: ^12.20.0 || >=14.13.1} @@ -7348,6 +7374,8 @@ snapshots: '@one-ini/wasm@0.1.1': optional: true + '@opentelemetry/api@1.9.0': {} + '@paralleldrive/cuid2@2.2.2': dependencies: '@noble/hashes': 1.8.0 @@ -8142,6 +8170,11 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@willsoto/nestjs-prometheus@6.0.2(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(prom-client@15.1.3)': + dependencies: + '@nestjs/common': 11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + prom-client: 15.1.3 + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -8436,6 +8469,8 @@ snapshots: binary-extensions@2.3.0: optional: true + bintrees@1.0.2: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -11613,6 +11648,11 @@ snapshots: process-warning@5.0.0: {} + prom-client@15.1.3: + dependencies: + '@opentelemetry/api': 1.9.0 + tdigest: 0.1.2 + promise@7.3.1: dependencies: asap: 2.0.6 @@ -12195,6 +12235,10 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tdigest@0.1.2: + dependencies: + bintrees: 1.0.2 + telegraf@4.16.3: dependencies: '@telegraf/types': 7.1.0 diff --git a/prometheus/prometheus.yml b/prometheus/prometheus.yml new file mode 100644 index 0000000..1c783bd --- /dev/null +++ b/prometheus/prometheus.yml @@ -0,0 +1,14 @@ +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: "nestjs" + static_configs: + - targets: ["localhost:3000"] + metrics_path: "/metrics" + scrape_interval: 5s + + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] diff --git a/src/app.module.ts b/src/app.module.ts index fb209bb..40d7251 100755 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -39,6 +39,7 @@ import { TicketsModule } from "./modules/tickets/tickets.module"; import { UploaderModule } from "./modules/uploader/uploader.module"; import { UsersModule } from "./modules/users/users.module"; import { WalletsModule } from "./modules/wallets/wallets.module"; +import { MonitoringModule } from "./monitoring/monitoring.module"; @Module({ imports: [ @@ -59,6 +60,7 @@ import { WalletsModule } from "./modules/wallets/wallets.module"; parts: 10, }, }), + MonitoringModule, AuthModule, UsersModule, TicketsModule, diff --git a/src/monitoring/monitoring.module.ts b/src/monitoring/monitoring.module.ts new file mode 100644 index 0000000..e966d41 --- /dev/null +++ b/src/monitoring/monitoring.module.ts @@ -0,0 +1,17 @@ +import { Module } from "@nestjs/common"; +import { PrometheusModule } from "@willsoto/nestjs-prometheus"; + +@Module({ + imports: [ + PrometheusModule.register({ + defaultMetrics: { + enabled: true, + }, + path: "/metrics", + defaultLabels: { + application: "danak_dsc_api", + }, + }), + ], +}) +export class MonitoringModule {}