3 Commits

Author SHA1 Message Date
Первов Артем
5260b8a9c5 Merge branch 'dev' of https://git.greact.ru/APervov/cloud-v3 into dev 2026-07-03 17:35:13 +03:00
Первов Артем
30bd7a0d28 добавлен лог для входящих запросов 2026-07-03 17:34:32 +03:00
c22d1b5b8c Merge pull request 'CORS problem solution' (#2) from cors into dev
Reviewed-on: #2
2026-07-03 07:58:02 +00:00
2 changed files with 56 additions and 5 deletions

View File

@@ -8,6 +8,7 @@ services:
PORT: ${PORT}
DATABASE_URL: ${DATABASE_URL}
INGEST_API_KEY: ${INGEST_API_KEY}
INGEST_DEBUG_LOG: ${INGEST_DEBUG_LOG:-}
CURRENT_EVENTS_POLL_MS: ${CURRENT_EVENTS_POLL_MS}
expose:
- "3101"

View File

@@ -1,4 +1,5 @@
import { Body, Controller, Param, Post, UseGuards } from '@nestjs/common';
import { Body, Controller, Logger, Param, Post, Req, UseGuards } from '@nestjs/common';
import type { Request } from 'express';
import { IngestApiKeyGuard } from '../common/ingest-api-key.guard';
import { IngestEdgeValuesDto } from './dto/ingest-edge-values.dto';
import { IngestPointDto } from './dto/ingest-point.dto';
@@ -7,17 +8,37 @@ import { IngestService } from './ingest.service';
@Controller('ingest')
@UseGuards(IngestApiKeyGuard)
export class IngestController {
private readonly logger = new Logger(IngestController.name);
constructor(private readonly ingest: IngestService) {}
/** Принимает одну сырую точку и сохраняет ее как запись истории/current. */
@Post()
ingestPoint(@Body() point: IngestPointDto) {
ingestPoint(@Body() point: IngestPointDto, @Req() request: Request) {
this.logIngestRequest(request, {
kind: 'point',
edge: point.edge,
tag: point.tag,
timestamp: point.timestamp,
});
return this.ingest.ingestPoint(point);
}
/** Принимает компактное тело запроса по edge и сохраняет каждое значение построчно. */
@Post(':edge')
ingestEdgeValues(@Param('edge') edge: string, @Body() body: IngestEdgeValuesDto) {
ingestEdgeValues(
@Param('edge') edge: string,
@Body() body: IngestEdgeValuesDto,
@Req() request: Request,
) {
const tags = Object.keys(body.values);
this.logIngestRequest(request, {
kind: 'edge-values',
edge,
tagCount: tags.length,
firstTags: tags.slice(0, 5),
timestamp: body.timestamp,
});
const points = Object.entries(body.values).map(([tag, value]) => ({
edge,
tag,
@@ -27,4 +48,33 @@ export class IngestController {
return this.ingest.ingestPoints(points);
}
private logIngestRequest(
request: Request,
payload: Record<string, unknown>,
): void {
if (!this.isDebugLogEnabled()) {
return;
}
this.logger.log({
event: 'ingest.received',
method: request.method,
url: request.originalUrl,
host: request.get('host'),
ip: request.ip,
remoteAddress: request.socket.remoteAddress,
forwardedFor: request.get('x-forwarded-for'),
realIp: request.get('x-real-ip'),
userAgent: request.get('user-agent'),
contentLength: request.get('content-length'),
...payload,
});
}
private isDebugLogEnabled(): boolean {
return ['1', 'true', 'yes', 'on'].includes(
(process.env.INGEST_DEBUG_LOG ?? '').toLowerCase(),
);
}
}