mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
- Implemented MonitorUtil for managing monitor secrets and populating them in monitor steps and tests. - Created StackTraceParser to parse and structure stack traces from various programming languages. - Developed SyslogParser to handle and parse syslog messages in both RFC 5424 and RFC 3164 formats.
164 lines
4.2 KiB
TypeScript
164 lines
4.2 KiB
TypeScript
import TelemetryIngest from "Common/Server/Middleware/TelemetryIngest";
|
|
import Express, {
|
|
ExpressRequest,
|
|
ExpressResponse,
|
|
ExpressRouter,
|
|
NextFunction,
|
|
} from "Common/Server/Utils/Express";
|
|
import Response from "Common/Server/Utils/Response";
|
|
import OpenTelemetryRequestMiddleware from "../Middleware/OtelRequestMiddleware";
|
|
import OtelTracesIngestService from "../Services/OtelTracesIngestService";
|
|
import OtelMetricsIngestService from "../Services/OtelMetricsIngestService";
|
|
import OtelLogsIngestService from "../Services/OtelLogsIngestService";
|
|
import OtelProfilesIngestService from "../Services/OtelProfilesIngestService";
|
|
import TelemetryQueueService from "../Services/Queue/TelemetryQueueService";
|
|
import ClusterKeyAuthorization from "Common/Server/Middleware/ClusterKeyAuthorization";
|
|
import { JSONObject } from "Common/Types/JSON";
|
|
|
|
const router: ExpressRouter = Express.getRouter();
|
|
|
|
/**
|
|
*
|
|
* Otel Middleware
|
|
*
|
|
*/
|
|
|
|
router.post(
|
|
"/otlp/v1/traces",
|
|
OpenTelemetryRequestMiddleware.getProductType,
|
|
TelemetryIngest.isAuthorizedServiceMiddleware,
|
|
async (
|
|
req: ExpressRequest,
|
|
res: ExpressResponse,
|
|
next: NextFunction,
|
|
): Promise<void> => {
|
|
return OtelTracesIngestService.ingestTraces(req, res, next);
|
|
},
|
|
);
|
|
|
|
router.post(
|
|
"/otlp/v1/metrics",
|
|
OpenTelemetryRequestMiddleware.getProductType,
|
|
TelemetryIngest.isAuthorizedServiceMiddleware,
|
|
async (
|
|
req: ExpressRequest,
|
|
res: ExpressResponse,
|
|
next: NextFunction,
|
|
): Promise<void> => {
|
|
return OtelMetricsIngestService.ingestMetrics(req, res, next);
|
|
},
|
|
);
|
|
|
|
router.post(
|
|
"/otlp/v1/logs",
|
|
OpenTelemetryRequestMiddleware.getProductType,
|
|
TelemetryIngest.isAuthorizedServiceMiddleware,
|
|
async (
|
|
req: ExpressRequest,
|
|
res: ExpressResponse,
|
|
next: NextFunction,
|
|
): Promise<void> => {
|
|
return OtelLogsIngestService.ingestLogs(req, res, next);
|
|
},
|
|
);
|
|
|
|
router.post(
|
|
"/otlp/v1/profiles",
|
|
OpenTelemetryRequestMiddleware.getProductType,
|
|
TelemetryIngest.isAuthorizedServiceMiddleware,
|
|
async (
|
|
req: ExpressRequest,
|
|
res: ExpressResponse,
|
|
next: NextFunction,
|
|
): Promise<void> => {
|
|
return OtelProfilesIngestService.ingestProfiles(req, res, next);
|
|
},
|
|
);
|
|
|
|
// Queue stats endpoint
|
|
router.get(
|
|
"/otlp/queue/stats",
|
|
ClusterKeyAuthorization.isAuthorizedServiceMiddleware,
|
|
async (
|
|
req: ExpressRequest,
|
|
res: ExpressResponse,
|
|
next: NextFunction,
|
|
): Promise<void> => {
|
|
try {
|
|
const stats: {
|
|
waiting: number;
|
|
active: number;
|
|
completed: number;
|
|
failed: number;
|
|
delayed: number;
|
|
total: number;
|
|
} = await TelemetryQueueService.getQueueStats();
|
|
return Response.sendJsonObjectResponse(req, res, stats);
|
|
} catch (err) {
|
|
return next(err);
|
|
}
|
|
},
|
|
);
|
|
|
|
// Queue size endpoint
|
|
router.get(
|
|
"/otlp/queue/size",
|
|
ClusterKeyAuthorization.isAuthorizedServiceMiddleware,
|
|
async (
|
|
req: ExpressRequest,
|
|
res: ExpressResponse,
|
|
next: NextFunction,
|
|
): Promise<void> => {
|
|
try {
|
|
const size: number = await TelemetryQueueService.getQueueSize();
|
|
return Response.sendJsonObjectResponse(req, res, { size });
|
|
} catch (err) {
|
|
return next(err);
|
|
}
|
|
},
|
|
);
|
|
|
|
// Queue failed jobs endpoint
|
|
router.get(
|
|
"/otlp/queue/failed",
|
|
ClusterKeyAuthorization.isAuthorizedServiceMiddleware,
|
|
async (
|
|
req: ExpressRequest,
|
|
res: ExpressResponse,
|
|
next: NextFunction,
|
|
): Promise<void> => {
|
|
try {
|
|
// Parse pagination parameters from query string
|
|
const start: number = parseInt(req.query["start"] as string) || 0;
|
|
const end: number = parseInt(req.query["end"] as string) || 100;
|
|
|
|
const failedJobs: Array<{
|
|
id: string;
|
|
name: string;
|
|
data: JSONObject;
|
|
failedReason: string;
|
|
stackTrace?: string;
|
|
processedOn: Date | null;
|
|
finishedOn: Date | null;
|
|
attemptsMade: number;
|
|
}> = await TelemetryQueueService.getFailedJobs({
|
|
start,
|
|
end,
|
|
});
|
|
|
|
return Response.sendJsonObjectResponse(req, res, {
|
|
failedJobs,
|
|
pagination: {
|
|
start,
|
|
end,
|
|
count: failedJobs.length,
|
|
},
|
|
});
|
|
} catch (err) {
|
|
return next(err);
|
|
}
|
|
},
|
|
);
|
|
|
|
export default router;
|