mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-01-16 23:00:51 +00:00
- Add Telemetry service entrypoint - Telemetry/Index.ts: app bootstrap, routes mounting, infrastructure init and Telemetry SDK init. - Unified queue + worker - Telemetry/Jobs/TelemetryIngest/ProcessTelemetry.ts: single worker that dispatches queued jobs to specific processors (logs, traces, metrics, syslog, fluent logs). - Telemetry/Services/Queue/TelemetryQueueService.ts: central queue API and job payload types. - Per-type Queue wrappers (LogsQueueService, MetricsQueueService, TracesQueueService, FluentLogsQueueService, SyslogQueueService). - OpenTelemetry ingestion middleware and proto support - Telemetry/Middleware/OtelRequestMiddleware.ts: detect OTLP endpoint (logs/traces/metrics), decode protobuf bodies using protobufjs and set product type. - Telemetry/ProtoFiles/OTel/v1/*.proto: include common.proto, logs.proto, metrics.proto, resource.proto, traces.proto for OTLP v1 messages. - Ingest services - Telemetry/Services/OtelLogsIngestService.ts: parse incoming OTLP logs, map attributes, convert timestamps, batch insert logs. - Telemetry/Services/OtelTracesIngestService.ts: parse OTLP traces, build span rows, extract exceptions, batch insert spans and exceptions, save telemetry exception summary. - Telemetry/Services/OtelMetricsIngestService.ts: parse OTLP metrics, normalize datapoints, batch insert metrics and index metric name -> service map. - Telemetry/Services/SyslogIngestService.ts: syslog ingestion endpoints, parser integration, map syslog fields to attributes and logs. - Telemetry/Services/FluentLogsIngestService.ts: ingest Fluentd style logs, normalize entries and insert into log backend. - Telemetry/Services/OtelIngestBaseService.ts: helpers to resolve service name from attributes/headers. - Syslog parser and utilities - Telemetry/Utils/SyslogParser.ts: robust RFC5424 and RFC3164 parser, structured data extraction and sanitization. - Telemetry/Tests/Utils/SyslogParser.test.ts: unit tests for parser behavior. - Telemetry exception utilities - Telemetry/Utils/Exception.ts: generate exception fingerprint and upsert telemetry exception status (saveOrUpdateTelemetryException). - Queue & job integration - New integration with Common/Server/Infrastructure/Queue and QueueWorker, job id generation and telemetry job types. - Telemetry services add ingestion jobs instead of processing synchronously. - Config, build and dev tooling - Add Telemetry/package.json, package-lock.json, tsconfig.json, nodemon.json, jest config. - New script configs and dependencies (protobufjs, ts-node, jest, nodemon, etc). - Docker / environment updates - docker-compose.base.yml, docker-compose.dev.yml, docker-compose.yml: rename service from open-telemetry-ingest -> telemetry and wire TELEMETRY_* envs. - config.example.env: rename and consolidate environment variables (OPEN_TELEMETRY_* -> TELEMETRY_*, update hostnames and ports). - Tests/Scripts/status-check.sh: update ready-check target to telemetry/status/ready. - Other - Telemetry/Services/Queue/*: export helpers and legacy-compatible job interface shims. - Memory cleanup and batching safeguards across ingest services. - Logging and capture spans added to key code paths. BREAKING CHANGES / MIGRATION NOTES: - Environment variables and docker service names changed: - Replace OPEN_TELEMETRY_... vars with TELEMETRY_... (PORT, HOSTNAME, CONCURRENCY, DISABLE_TELEMETRY, etc). - docker-compose entries moved from "open-telemetry-ingest" to "telemetry" and image name changed to oneuptime/telemetry. - Update any deployment automation and monitoring checks referencing the old service name or endpoints. - Consumers: OTLP endpoints and behavior remain supported, but ingestion is now queued and processed asynchronously. Testing / Running: - Install deps in Telemetry/ (npm install) after syncing Common workspace. - Run dev: npx nodemon (nodemon.json) or build & start using provided scripts. - Run tests with jest (Telemetry test suite includes SyslogParser unit tests). Files added/modified (high level): - Added many files under Telemetry/: Index, Jobs, Middleware, ProtoFiles, Services, Utils, Tests, package and config artifacts. - Modified docker-compose.* and config.example.env and status check script to use new TELEMETRY service/vars.
121 lines
3.3 KiB
TypeScript
121 lines
3.3 KiB
TypeScript
import { TelemetryRequest } from "Common/Server/Middleware/TelemetryIngest";
|
|
import Queue, { QueueName } from "Common/Server/Infrastructure/Queue";
|
|
import { JSONObject } from "Common/Types/JSON";
|
|
import OneUptimeDate from "Common/Types/Date";
|
|
import logger from "Common/Server/Utils/Logger";
|
|
|
|
export enum TelemetryType {
|
|
Logs = "logs",
|
|
Traces = "traces",
|
|
Metrics = "metrics",
|
|
Syslog = "syslog",
|
|
FluentLogs = "fluentlogs",
|
|
}
|
|
|
|
export interface TelemetryIngestJobData {
|
|
type: TelemetryType;
|
|
projectId: string;
|
|
requestBody: JSONObject;
|
|
requestHeaders: Record<string, string>;
|
|
ingestionTimestamp: Date;
|
|
}
|
|
|
|
// Legacy interfaces for backward compatibility
|
|
export interface LogsIngestJobData extends TelemetryIngestJobData {
|
|
type: TelemetryType.Logs;
|
|
}
|
|
|
|
export interface TracesIngestJobData extends TelemetryIngestJobData {
|
|
type: TelemetryType.Traces;
|
|
}
|
|
|
|
export interface MetricsIngestJobData extends TelemetryIngestJobData {
|
|
type: TelemetryType.Metrics;
|
|
}
|
|
|
|
export interface SyslogIngestJobData extends TelemetryIngestJobData {
|
|
type: TelemetryType.Syslog;
|
|
}
|
|
|
|
export default class TelemetryQueueService {
|
|
public static async addTelemetryIngestJob(
|
|
req: TelemetryRequest,
|
|
type: TelemetryType,
|
|
): Promise<void> {
|
|
try {
|
|
const jobData: TelemetryIngestJobData = {
|
|
type,
|
|
projectId: req.projectId.toString(),
|
|
requestBody: req.body,
|
|
requestHeaders: req.headers as Record<string, string>,
|
|
ingestionTimestamp: OneUptimeDate.getCurrentDate(),
|
|
};
|
|
|
|
const jobId: string = `${type}-${req.projectId?.toString()}-${OneUptimeDate.getCurrentDateAsUnixNano()}`;
|
|
|
|
await Queue.addJob(
|
|
QueueName.Telemetry,
|
|
jobId,
|
|
"ProcessTelemetry",
|
|
jobData as unknown as JSONObject,
|
|
);
|
|
|
|
logger.debug(`Added ${type} ingestion job: ${jobId}`);
|
|
} catch (error) {
|
|
logger.error(`Error adding ${type} ingestion job:`);
|
|
logger.error(error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
public static async addLogIngestJob(req: TelemetryRequest): Promise<void> {
|
|
return this.addTelemetryIngestJob(req, TelemetryType.Logs);
|
|
}
|
|
|
|
public static async addTraceIngestJob(req: TelemetryRequest): Promise<void> {
|
|
return this.addTelemetryIngestJob(req, TelemetryType.Traces);
|
|
}
|
|
|
|
public static async addMetricIngestJob(req: TelemetryRequest): Promise<void> {
|
|
return this.addTelemetryIngestJob(req, TelemetryType.Metrics);
|
|
}
|
|
|
|
public static async addFluentLogIngestJob(
|
|
req: TelemetryRequest,
|
|
): Promise<void> {
|
|
return this.addTelemetryIngestJob(req, TelemetryType.FluentLogs);
|
|
}
|
|
|
|
public static async getQueueSize(): Promise<number> {
|
|
return Queue.getQueueSize(QueueName.Telemetry);
|
|
}
|
|
|
|
public static async getQueueStats(): Promise<{
|
|
waiting: number;
|
|
active: number;
|
|
completed: number;
|
|
failed: number;
|
|
delayed: number;
|
|
total: number;
|
|
}> {
|
|
return Queue.getQueueStats(QueueName.Telemetry);
|
|
}
|
|
|
|
public static getFailedJobs(options?: {
|
|
start?: number;
|
|
end?: number;
|
|
}): Promise<
|
|
Array<{
|
|
id: string;
|
|
name: string;
|
|
data: JSONObject;
|
|
failedReason: string;
|
|
stackTrace?: string;
|
|
processedOn: Date | null;
|
|
finishedOn: Date | null;
|
|
attemptsMade: number;
|
|
}>
|
|
> {
|
|
return Queue.getFailedJobs(QueueName.Telemetry, options);
|
|
}
|
|
}
|