@oneuptime/common 10.4.10 → 10.4.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +47 -1
  2. package/Models/AnalyticsModels/Log.ts +47 -1
  3. package/Models/AnalyticsModels/Metric.ts +1 -7
  4. package/Models/AnalyticsModels/Profile.ts +47 -1
  5. package/Models/AnalyticsModels/ProfileSample.ts +47 -1
  6. package/Models/AnalyticsModels/Span.ts +47 -1
  7. package/Models/DatabaseModels/DockerHost.ts +83 -0
  8. package/Models/DatabaseModels/Host.ts +83 -0
  9. package/Models/DatabaseModels/Index.ts +0 -2
  10. package/Models/DatabaseModels/KubernetesCluster.ts +83 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1779199346010-AddTelemetryRetentionConfig.ts +1 -1
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.ts +44 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.ts +50 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  15. package/Server/Services/AlertService.ts +2 -4
  16. package/Server/Services/IncidentService.ts +2 -4
  17. package/Server/Services/Index.ts +0 -2
  18. package/Server/Services/LogAggregationService.ts +54 -6
  19. package/Server/Services/OpenTelemetryIngestService.ts +132 -0
  20. package/Server/Services/TraceAggregationService.ts +83 -8
  21. package/Server/Utils/Monitor/MonitorMetricUtil.ts +2 -4
  22. package/Server/Utils/Telemetry/Telemetry.ts +38 -0
  23. package/Tests/Server/Middleware/UserAuthorization.test.ts +5 -0
  24. package/Types/Permission.ts +0 -46
  25. package/Types/Telemetry/ServiceType.ts +19 -0
  26. package/UI/Components/Forms/Validation.ts +2 -2
  27. package/UI/Components/LogsViewer/LogsViewer.tsx +135 -17
  28. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +84 -1
  29. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -1
  30. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +41 -1
  31. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  32. package/build/dist/Models/AnalyticsModels/Log.js +41 -1
  33. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  34. package/build/dist/Models/AnalyticsModels/Metric.js +0 -7
  35. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  36. package/build/dist/Models/AnalyticsModels/Profile.js +41 -1
  37. package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
  38. package/build/dist/Models/AnalyticsModels/ProfileSample.js +41 -1
  39. package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
  40. package/build/dist/Models/AnalyticsModels/Span.js +41 -1
  41. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  42. package/build/dist/Models/DatabaseModels/DockerHost.js +84 -0
  43. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  44. package/build/dist/Models/DatabaseModels/Host.js +84 -0
  45. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  46. package/build/dist/Models/DatabaseModels/Index.js +0 -2
  47. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  48. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +84 -0
  49. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  50. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779199346010-AddTelemetryRetentionConfig.js.map +1 -1
  51. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.js +42 -0
  52. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.js.map +1 -0
  53. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.js +22 -0
  54. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.js.map +1 -0
  55. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  56. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  57. package/build/dist/Server/Services/AlertService.js +2 -1
  58. package/build/dist/Server/Services/AlertService.js.map +1 -1
  59. package/build/dist/Server/Services/IncidentService.js +2 -1
  60. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  61. package/build/dist/Server/Services/Index.js +0 -2
  62. package/build/dist/Server/Services/Index.js.map +1 -1
  63. package/build/dist/Server/Services/LogAggregationService.js +46 -4
  64. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  65. package/build/dist/Server/Services/OpenTelemetryIngestService.js +103 -0
  66. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  67. package/build/dist/Server/Services/TraceAggregationService.js +66 -6
  68. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  69. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +2 -1
  70. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  71. package/build/dist/Server/Utils/Telemetry/Telemetry.js +26 -0
  72. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  73. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +3 -0
  74. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
  75. package/build/dist/Types/Permission.js +0 -40
  76. package/build/dist/Types/Permission.js.map +1 -1
  77. package/build/dist/Types/Telemetry/ServiceType.js +20 -0
  78. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -0
  79. package/build/dist/UI/Components/Forms/Validation.js +2 -2
  80. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  81. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +106 -16
  82. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  83. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +67 -1
  84. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  85. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
  86. package/package.json +1 -1
  87. package/Models/DatabaseModels/ServiceDependency.ts +0 -529
  88. package/Server/Services/ServiceDependencyService.ts +0 -48
  89. package/UI/Components/Graphs/ServiceDependencyGraph.tsx +0 -286
  90. package/build/dist/Models/DatabaseModels/ServiceDependency.js +0 -545
  91. package/build/dist/Models/DatabaseModels/ServiceDependency.js.map +0 -1
  92. package/build/dist/Server/Services/ServiceDependencyService.js +0 -47
  93. package/build/dist/Server/Services/ServiceDependencyService.js.map +0 -1
  94. package/build/dist/UI/Components/Graphs/ServiceDependencyGraph.js +0 -206
  95. package/build/dist/UI/Components/Graphs/ServiceDependencyGraph.js.map +0 -1
@@ -1,286 +0,0 @@
1
- import React, {
2
- FunctionComponent,
3
- ReactElement,
4
- useEffect,
5
- useState,
6
- } from "react";
7
- import ReactFlow, {
8
- Background,
9
- Controls,
10
- Edge,
11
- MarkerType,
12
- MiniMap,
13
- Node,
14
- Position,
15
- } from "reactflow";
16
- import "reactflow/dist/style.css";
17
- import type { ElkExtendedEdge, ElkNode, LayoutOptions } from "elkjs";
18
- import ELK from "elkjs/lib/elk.bundled.js";
19
-
20
- // Minimal interface for the ELK layout engine we rely on.
21
- interface ElkLayoutEngine {
22
- layout: (graph: ElkNode) => Promise<ElkNode>;
23
- }
24
-
25
- export interface ServiceNodeData {
26
- id: string;
27
- name: string;
28
- color?: string;
29
- }
30
-
31
- export interface ServiceEdgeData {
32
- fromServiceId: string;
33
- toServiceId: string;
34
- }
35
-
36
- export interface ServiceDependencyGraphProps {
37
- services: Array<ServiceNodeData>;
38
- dependencies: Array<ServiceEdgeData>;
39
- }
40
-
41
- const ServiceDependencyGraph: FunctionComponent<ServiceDependencyGraphProps> = (
42
- props: ServiceDependencyGraphProps,
43
- ): ReactElement => {
44
- const computeLuminance: (r: number, g: number, b: number) => number = (
45
- r: number,
46
- g: number,
47
- b: number,
48
- ): number => {
49
- const transform: (v: number) => number = (v: number): number => {
50
- const c: number = v / 255;
51
- return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
52
- };
53
- const R: number = transform(r);
54
- const G: number = transform(g);
55
- const B: number = transform(b);
56
- return 0.2126 * R + 0.7152 * G + 0.0722 * B;
57
- };
58
-
59
- const getContrastText: (bg?: string) => string = (bg?: string): string => {
60
- if (!bg) {
61
- return "#111827"; // gray-900
62
- }
63
- // normalize to hex like #rrggbb
64
- let hex: string = bg.trim();
65
- if (hex.startsWith("rgb")) {
66
- // basic rgb(a) parser
67
- const m: RegExpMatchArray | null = hex
68
- .replace(/\s+/g, "")
69
- .match(/rgba?\((\d+),(\d+),(\d+)/i);
70
- if (m) {
71
- const r: number = parseInt(m[1] as string, 10);
72
- const g: number = parseInt(m[2] as string, 10);
73
- const b: number = parseInt(m[3] as string, 10);
74
- const luminance: number = computeLuminance(r, g, b);
75
- return luminance > 0.5 ? "#111827" : "#ffffff";
76
- }
77
- return "#111827";
78
- }
79
- if (hex[0] === "#") {
80
- hex = hex.slice(1);
81
- }
82
- if (hex.length === 3) {
83
- hex = hex
84
- .split("")
85
- .map((c: string): string => {
86
- return c + c;
87
- })
88
- .join("");
89
- }
90
- if (hex.length !== 6) {
91
- return "#111827";
92
- }
93
- const r: number = parseInt(hex.slice(0, 2), 16);
94
- const g: number = parseInt(hex.slice(2, 4), 16);
95
- const b: number = parseInt(hex.slice(4, 6), 16);
96
- const luminance: number = computeLuminance(r, g, b);
97
- return luminance > 0.5 ? "#111827" : "#ffffff";
98
- };
99
-
100
- const [rfNodes, setRfNodes] = useState<Node[]>([]);
101
- const [rfEdges, setRfEdges] = useState<Edge[]>([]);
102
-
103
- useEffect((): void => {
104
- const elk: ElkLayoutEngine = new ELK() as unknown as ElkLayoutEngine;
105
- // fixed node dimensions for layout (px)
106
- const NODE_WIDTH: number = 220;
107
- const NODE_HEIGHT: number = 56;
108
-
109
- const sortedServices: Array<ServiceNodeData> = [...props.services].sort(
110
- (a: ServiceNodeData, b: ServiceNodeData): number => {
111
- return a.name.localeCompare(b.name) || a.id.localeCompare(b.id);
112
- },
113
- );
114
- const sortedDeps: Array<ServiceEdgeData> = [...props.dependencies].sort(
115
- (a: ServiceEdgeData, b: ServiceEdgeData): number => {
116
- if (a.fromServiceId === b.fromServiceId) {
117
- return a.toServiceId.localeCompare(b.toServiceId);
118
- }
119
- return a.fromServiceId.localeCompare(b.fromServiceId);
120
- },
121
- );
122
-
123
- const elkGraph: ElkNode = {
124
- id: "root",
125
- layoutOptions: {
126
- algorithm: "layered",
127
- "elk.direction": "RIGHT",
128
- "elk.layered.spacing.nodeNodeBetweenLayers": "120",
129
- "elk.spacing.nodeNode": "60",
130
- "elk.edgeRouting": "POLYLINE",
131
- } as LayoutOptions,
132
- children: sortedServices.map((svc: ServiceNodeData): ElkNode => {
133
- return {
134
- id: svc.id,
135
- width: NODE_WIDTH,
136
- height: NODE_HEIGHT,
137
- } as ElkNode;
138
- }),
139
- edges: sortedDeps.map((dep: ServiceEdgeData): ElkExtendedEdge => {
140
- return {
141
- id: `e-${dep.fromServiceId}-${dep.toServiceId}`,
142
- sources: [dep.fromServiceId],
143
- targets: [dep.toServiceId],
144
- };
145
- }),
146
- };
147
-
148
- const layout: () => Promise<void> = async (): Promise<void> => {
149
- try {
150
- const res: ElkNode = (await elk.layout(elkGraph)) as ElkNode; // casting to bundled ElkNode shape
151
- const placedNodes: Node[] = (res.children || []).map(
152
- (child: ElkNode): Node => {
153
- const svc: ServiceNodeData | undefined = sortedServices.find(
154
- (s: ServiceNodeData): boolean => {
155
- return s.id === child.id;
156
- },
157
- );
158
- const background: string = svc?.color || "#ffffff";
159
- const textColor: string = getContrastText(background);
160
- return {
161
- id: child.id || "",
162
- data: { label: svc?.name || "" },
163
- position: { x: child.x || 0, y: child.y || 0 },
164
- sourcePosition: Position.Right,
165
- targetPosition: Position.Left,
166
- style: {
167
- borderRadius: 8,
168
- padding: 8,
169
- border: "1px solid rgba(0,0,0,0.08)",
170
- background,
171
- color: textColor,
172
- boxShadow: "0 1px 2px rgba(16,24,40,.05)",
173
- width: NODE_WIDTH,
174
- height: NODE_HEIGHT,
175
- },
176
- } as Node;
177
- },
178
- );
179
-
180
- const stroke: string = "#94a3b8"; // slate-400
181
- const placedEdges: Edge[] = sortedDeps.map(
182
- (dep: ServiceEdgeData): Edge => {
183
- return {
184
- id: `e-${dep.fromServiceId}-${dep.toServiceId}`,
185
- source: dep.fromServiceId,
186
- target: dep.toServiceId,
187
- animated: false,
188
- style: { stroke, strokeWidth: 2 },
189
- markerEnd: { type: MarkerType.Arrow, color: stroke },
190
- type: "smoothstep",
191
- };
192
- },
193
- );
194
-
195
- setRfNodes(placedNodes);
196
- setRfEdges(placedEdges);
197
- } catch {
198
- // Fallback: deterministic grid by name
199
- const sorted: Array<ServiceNodeData> = sortedServices;
200
- const COLS: number = 4;
201
- const GAP_X: number = 260;
202
- const GAP_Y: number = 120;
203
- const nodes: Node[] = sorted.map(
204
- (svc: ServiceNodeData, i: number): Node => {
205
- const col: number = i % COLS;
206
- const row: number = Math.floor(i / COLS);
207
- const x: number = col * GAP_X;
208
- const y: number = row * GAP_Y;
209
- const background: string = svc.color || "#ffffff";
210
- const textColor: string = getContrastText(background);
211
- return {
212
- id: svc.id,
213
- data: { label: svc.name },
214
- position: { x, y },
215
- sourcePosition: Position.Right,
216
- targetPosition: Position.Left,
217
- style: {
218
- borderRadius: 8,
219
- padding: 8,
220
- border: "1px solid rgba(0,0,0,0.08)",
221
- background,
222
- color: textColor,
223
- boxShadow: "0 1px 2px rgba(16,24,40,.05)",
224
- width: NODE_WIDTH,
225
- height: NODE_HEIGHT,
226
- },
227
- };
228
- },
229
- );
230
- const stroke: string = "#94a3b8";
231
- const edges: Edge[] = sortedDeps.map((dep: ServiceEdgeData): Edge => {
232
- return {
233
- id: `e-${dep.fromServiceId}-${dep.toServiceId}`,
234
- source: dep.fromServiceId,
235
- target: dep.toServiceId,
236
- animated: false,
237
- style: { stroke, strokeWidth: 2 },
238
- markerEnd: { type: MarkerType.Arrow, color: stroke },
239
- type: "smoothstep",
240
- };
241
- });
242
- setRfNodes(nodes);
243
- setRfEdges(edges);
244
- }
245
- };
246
-
247
- layout();
248
- }, [props.services, props.dependencies]);
249
-
250
- return (
251
- <div style={{ width: "100%", height: 600 }}>
252
- <style>{`
253
- /* Hide/transparentize connection handles (ports) for read-only view */
254
- .service-dependency-graph .react-flow__handle {
255
- background: transparent !important;
256
- border-color: transparent !important;
257
- }
258
- `}</style>
259
- <ReactFlow
260
- className="service-dependency-graph"
261
- nodes={rfNodes}
262
- edges={rfEdges}
263
- fitView
264
- nodesDraggable={false}
265
- nodesConnectable={false}
266
- elementsSelectable={false}
267
- edgesUpdatable={false}
268
- connectOnClick={false}
269
- >
270
- <MiniMap
271
- nodeColor={(n: Node): string => {
272
- return (
273
- (n.style as any)?.background ||
274
- (n.data as any)?.color ||
275
- "#ffffff"
276
- );
277
- }}
278
- />
279
- <Controls />
280
- <Background gap={12} size={1} />
281
- </ReactFlow>
282
- </div>
283
- );
284
- };
285
-
286
- export default ServiceDependencyGraph;