Skip to content
This repository was archived by the owner on Jan 28, 2026. It is now read-only.

Commit 8db4691

Browse files
committed
feat: Integrate Prometheus metrics support with configuration options in environment variables
1 parent 214aa7e commit 8db4691

6 files changed

Lines changed: 145 additions & 1 deletion

File tree

DEPLOY.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ S3_REGION=us-east-1
5555
# S3_ENDPOINT=https://s3.ru1.storage.beget.cloud
5656
# S3_PUBLIC_URL_TEMPLATE=https://{bucket}.s3.{region}.amazonaws.com/{key}
5757
# S3_FORCE_PATH_STYLE=true
58+
59+
# Prometheus метрики (опционально)
60+
# PROMETHEUS_ENABLED=true
61+
# PROMETHEUS_PATH=/metrics
62+
# PROMETHEUS_DEFAULT_METRICS=true
63+
# PROMETHEUS_DEFAULT_LABELS={"app":"atom-dbro","env":"production"}
5864
```
5965

6066
**⚠️ ВАЖНО**:
@@ -418,6 +424,12 @@ S3_ACCESS_KEY_ID=your-access-key-id
418424
S3_SECRET_ACCESS_KEY=your-secret-access-key
419425
S3_REGION=us-east-1
420426
427+
# Prometheus метрики (опционально)
428+
# PROMETHEUS_ENABLED=true
429+
# PROMETHEUS_PATH=/metrics
430+
# PROMETHEUS_DEFAULT_METRICS=true
431+
# PROMETHEUS_DEFAULT_LABELS={"app":"atom-dbro","env":"production"}
432+
421433
# Docker Image (для docker-compose.yml)
422434
# Переменная DOCKER_IMAGE будет установлена автоматически при деплое
423435
# Не нужно указывать в .env файле

README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,36 @@ CORS_ORIGINS=http://localhost:5173,https://yourdomain.com,https://app.yourdomain
4949

5050
**Примечание:** В development режиме (`NODE_ENV !== 'production'`) автоматически разрешаются все локальные адреса (`localhost:*` и `127.0.0.1:*`).
5151

52+
### Prometheus метрики
53+
54+
Приложение поддерживает экспорт метрик Prometheus для мониторинга.
55+
56+
**Конфигурация через переменные окружения:**
57+
```env
58+
# Включить/выключить Prometheus (по умолчанию: true)
59+
PROMETHEUS_ENABLED=true
60+
61+
# Путь для endpoint метрик (по умолчанию: /metrics)
62+
PROMETHEUS_PATH=/metrics
63+
64+
# Включить стандартные метрики Node.js (по умолчанию: true)
65+
PROMETHEUS_DEFAULT_METRICS=true
66+
67+
# Дополнительные метки для всех метрик (JSON формат, опционально)
68+
PROMETHEUS_DEFAULT_LABELS={"app":"atom-dbro","env":"production"}
69+
```
70+
71+
**Доступ к метрикам:**
72+
После запуска приложения метрики доступны по адресу (с учетом глобального префикса `admin/api`):
73+
```
74+
http://localhost:3000/admin/api/metrics
75+
```
76+
77+
**Примечание:**
78+
- Если `PROMETHEUS_ENABLED=false`, endpoint не будет создан
79+
- Путь `PROMETHEUS_PATH` указывается относительно корня приложения, но с учетом глобального префикса `admin/api`
80+
- Для доступа к метрикам без префикса установите `PROMETHEUS_PATH=/metrics` и используйте `http://localhost:3000/metrics`
81+
5282
## Запуск
5383

5484
```bash

package-lock.json

Lines changed: 60 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"@nestjs/platform-express": "^10.0.0",
3737
"@nestjs/swagger": "^7.0.0",
3838
"@types/uuid": "^10.0.0",
39+
"@willsoto/nestjs-prometheus": "^6.0.2",
3940
"bcrypt": "5.1.1",
4041
"class-transformer": "^0.5.1",
4142
"class-validator": "^0.14.0",
@@ -47,6 +48,7 @@
4748
"passport": "^0.6.0",
4849
"passport-jwt": "^4.0.1",
4950
"pg": "^8.11.0",
51+
"prom-client": "^15.1.3",
5052
"reflect-metadata": "^0.1.13",
5153
"rxjs": "^7.8.0",
5254
"swagger-ui-express": "^5.0.0",

src/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { CategoryModule } from './category/category.module';
1616
import { QuestUpdateModule } from './quest-update/quest-update.module';
1717
import { OrganizationUpdateModule } from './organization-update/organization-update.module';
1818
import { AppController } from './app.controller';
19+
import { PrometheusModule } from './prometheus/prometheus.module';
1920

2021
@Module({
2122
imports: [
@@ -39,6 +40,7 @@ import { AppController } from './app.controller';
3940
CategoryModule,
4041
QuestUpdateModule,
4142
OrganizationUpdateModule,
43+
PrometheusModule,
4244
],
4345
controllers: [AppController],
4446
})
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Module } from '@nestjs/common';
2+
import { ConfigModule, ConfigService } from '@nestjs/config';
3+
import { PrometheusModule as PrometheusModuleLib } from '@willsoto/nestjs-prometheus';
4+
5+
@Module({
6+
imports: [
7+
PrometheusModuleLib.forRootAsync({
8+
imports: [ConfigModule],
9+
useFactory: (configService: ConfigService) => {
10+
const enabled = configService.get<string>('PROMETHEUS_ENABLED', 'true') === 'true';
11+
const path = configService.get<string>('PROMETHEUS_PATH', '/metrics');
12+
const defaultMetrics = configService.get<string>('PROMETHEUS_DEFAULT_METRICS', 'true') === 'true';
13+
const defaultLabels = configService.get<string>('PROMETHEUS_DEFAULT_LABELS', '{}');
14+
15+
let parsedLabels = {};
16+
try {
17+
if (defaultLabels && defaultLabels !== '{}') {
18+
parsedLabels = JSON.parse(defaultLabels);
19+
}
20+
} catch (e) {
21+
// Если не удалось распарсить, используем пустой объект
22+
}
23+
24+
return {
25+
defaultMetrics: {
26+
enabled: defaultMetrics && enabled,
27+
},
28+
defaultLabels: parsedLabels,
29+
// Если Prometheus отключен, не создаем endpoint
30+
path: enabled ? path : undefined,
31+
};
32+
},
33+
inject: [ConfigService],
34+
}),
35+
],
36+
exports: [PrometheusModuleLib],
37+
})
38+
export class PrometheusModule {}
39+

0 commit comments

Comments
 (0)