@oneuptime/common 10.0.54 → 10.0.56

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 (132) hide show
  1. package/Models/DatabaseModels/DockerHost.ts +662 -0
  2. package/Models/DatabaseModels/GlobalConfig.ts +112 -0
  3. package/Models/DatabaseModels/Index.ts +2 -0
  4. package/Server/API/TelemetryAPI.ts +352 -16
  5. package/Server/Infrastructure/ClickhouseConfig.ts +9 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/1774000000002-MigrationName.ts +76 -0
  7. package/Server/Infrastructure/Postgres/SchemaMigrations/1775766676723-MigrationName.ts +133 -0
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/1775900000000-AddGlobalSmtpOAuth.ts +51 -0
  9. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  10. package/Server/Services/DockerHostService.ts +173 -0
  11. package/Server/Services/ExceptionAggregationService.ts +335 -0
  12. package/Server/Services/Index.ts +2 -0
  13. package/Server/Services/LogAggregationService.ts +17 -0
  14. package/Server/Services/MonitorProbeService.ts +42 -21
  15. package/Server/Services/MonitorService.ts +21 -21
  16. package/Server/Services/TraceAggregationService.ts +514 -0
  17. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +73 -1
  18. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  19. package/Tests/__mocks__/mermaid.js +18 -0
  20. package/Tests/__mocks__/react-markdown.js +17 -0
  21. package/Tests/__mocks__/react-syntax-highlighter.js +19 -0
  22. package/Tests/__mocks__/remark-gfm.js +8 -0
  23. package/Types/Icon/IconProp.ts +1 -0
  24. package/Types/Monitor/DockerAlertTemplates.ts +507 -0
  25. package/Types/Monitor/DockerMetricCatalog.ts +226 -0
  26. package/Types/Monitor/MonitorStep.ts +33 -0
  27. package/Types/Monitor/MonitorStepDockerMonitor.ts +38 -0
  28. package/Types/Monitor/MonitorType.ts +15 -1
  29. package/Types/Permission.ts +38 -0
  30. package/UI/Components/Icon/Icon.tsx +87 -0
  31. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +7 -132
  32. package/UI/Components/ModelDetail/CardModelDetail.tsx +11 -1
  33. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +285 -0
  34. package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +85 -0
  35. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +156 -0
  36. package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +160 -0
  37. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +85 -0
  38. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +102 -0
  39. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +280 -0
  40. package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +125 -0
  41. package/UI/Components/TelemetryViewer/components/TelemetryPagination.tsx +114 -0
  42. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +378 -0
  43. package/UI/Components/TelemetryViewer/components/TelemetrySearchHelp.tsx +78 -0
  44. package/UI/Components/TelemetryViewer/components/TelemetrySearchSuggestions.tsx +64 -0
  45. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +193 -0
  46. package/UI/Components/TelemetryViewer/types.ts +67 -0
  47. package/build/dist/Models/DatabaseModels/DockerHost.js +686 -0
  48. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -0
  49. package/build/dist/Models/DatabaseModels/GlobalConfig.js +117 -0
  50. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  51. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  52. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  53. package/build/dist/Server/API/TelemetryAPI.js +237 -16
  54. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  55. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +9 -0
  56. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  57. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1774000000002-MigrationName.js +35 -0
  58. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1774000000002-MigrationName.js.map +1 -0
  59. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1775766676723-MigrationName.js +52 -0
  60. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1775766676723-MigrationName.js.map +1 -0
  61. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1775900000000-AddGlobalSmtpOAuth.js +26 -0
  62. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1775900000000-AddGlobalSmtpOAuth.js.map +1 -0
  63. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  64. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  65. package/build/dist/Server/Services/DockerHostService.js +162 -0
  66. package/build/dist/Server/Services/DockerHostService.js.map +1 -0
  67. package/build/dist/Server/Services/ExceptionAggregationService.js +224 -0
  68. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -0
  69. package/build/dist/Server/Services/Index.js +2 -0
  70. package/build/dist/Server/Services/Index.js.map +1 -1
  71. package/build/dist/Server/Services/LogAggregationService.js +11 -0
  72. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  73. package/build/dist/Server/Services/MonitorProbeService.js +28 -14
  74. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  75. package/build/dist/Server/Services/MonitorService.js +19 -17
  76. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  77. package/build/dist/Server/Services/TraceAggregationService.js +364 -0
  78. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -0
  79. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +46 -1
  80. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  81. package/build/dist/Tests/Server/Services/LogAggregationService.test.js +2 -2
  82. package/build/dist/Tests/Server/Services/LogAggregationService.test.js.map +1 -1
  83. package/build/dist/Types/Icon/IconProp.js +1 -0
  84. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  85. package/build/dist/Types/Monitor/DockerAlertTemplates.js +410 -0
  86. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -0
  87. package/build/dist/Types/Monitor/DockerMetricCatalog.js +192 -0
  88. package/build/dist/Types/Monitor/DockerMetricCatalog.js.map +1 -0
  89. package/build/dist/Types/Monitor/MonitorStep.js +23 -0
  90. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  91. package/build/dist/Types/Monitor/MonitorStepDockerMonitor.js +21 -0
  92. package/build/dist/Types/Monitor/MonitorStepDockerMonitor.js.map +1 -0
  93. package/build/dist/Types/Monitor/MonitorType.js +14 -1
  94. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  95. package/build/dist/Types/Permission.js +36 -0
  96. package/build/dist/Types/Permission.js.map +1 -1
  97. package/build/dist/UI/Components/Icon/Icon.js +13 -0
  98. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  99. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +7 -75
  100. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  101. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +8 -1
  102. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  103. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +71 -0
  104. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -0
  105. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +39 -0
  106. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -0
  107. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +61 -0
  108. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -0
  109. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +66 -0
  110. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -0
  111. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +41 -0
  112. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -0
  113. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +35 -0
  114. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -0
  115. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +132 -0
  116. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -0
  117. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +65 -0
  118. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -0
  119. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryPagination.js +52 -0
  120. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryPagination.js.map +1 -0
  121. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +224 -0
  122. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -0
  123. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchHelp.js +35 -0
  124. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchHelp.js.map +1 -0
  125. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchSuggestions.js +27 -0
  126. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchSuggestions.js.map +1 -0
  127. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +97 -0
  128. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -0
  129. package/build/dist/UI/Components/TelemetryViewer/types.js +6 -0
  130. package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -0
  131. package/jest.config.json +6 -1
  132. package/package.json +1 -1
@@ -0,0 +1,193 @@
1
+ import React, {
2
+ FunctionComponent,
3
+ ReactElement,
4
+ useState,
5
+ useRef,
6
+ useEffect,
7
+ useCallback,
8
+ } from "react";
9
+ import Icon from "../../Icon/Icon";
10
+ import IconProp from "../../../../Types/Icon/IconProp";
11
+ import RangeStartAndEndDateTime from "../../../../Types/Time/RangeStartAndEndDateTime";
12
+ import TimeRange from "../../../../Types/Time/TimeRange";
13
+ import InBetween from "../../../../Types/BaseDatabase/InBetween";
14
+ import StartAndEndDate, {
15
+ StartAndEndDateType,
16
+ } from "../../Date/StartAndEndDate";
17
+
18
+ export interface TelemetryTimeRangePickerProps {
19
+ value: RangeStartAndEndDateTime;
20
+ onChange: (value: RangeStartAndEndDateTime) => void;
21
+ }
22
+
23
+ const PRESET_OPTIONS: Array<{ range: TimeRange; label: string }> = [
24
+ { range: TimeRange.PAST_THIRTY_MINS, label: "Past 30 Minutes" },
25
+ { range: TimeRange.PAST_ONE_HOUR, label: "Past 1 Hour" },
26
+ { range: TimeRange.PAST_TWO_HOURS, label: "Past 2 Hours" },
27
+ { range: TimeRange.PAST_THREE_HOURS, label: "Past 3 Hours" },
28
+ { range: TimeRange.PAST_ONE_DAY, label: "Past 1 Day" },
29
+ { range: TimeRange.PAST_TWO_DAYS, label: "Past 2 Days" },
30
+ { range: TimeRange.PAST_ONE_WEEK, label: "Past 1 Week" },
31
+ { range: TimeRange.PAST_TWO_WEEKS, label: "Past 2 Weeks" },
32
+ { range: TimeRange.PAST_ONE_MONTH, label: "Past 1 Month" },
33
+ { range: TimeRange.PAST_THREE_MONTHS, label: "Past 3 Months" },
34
+ ];
35
+
36
+ function formatDateShort(date: Date): string {
37
+ const month: string = date.toLocaleString("en-US", { month: "short" });
38
+ const day: number = date.getDate();
39
+ const hours: string = date.getHours().toString().padStart(2, "0");
40
+ const minutes: string = date.getMinutes().toString().padStart(2, "0");
41
+ return `${month} ${day}, ${hours}:${minutes}`;
42
+ }
43
+
44
+ function getButtonLabel(value: RangeStartAndEndDateTime): string {
45
+ if (value.range === TimeRange.CUSTOM && value.startAndEndDate) {
46
+ const start: string = formatDateShort(value.startAndEndDate.startValue);
47
+ const end: string = formatDateShort(value.startAndEndDate.endValue);
48
+ return `${start} – ${end}`;
49
+ }
50
+
51
+ const preset: { range: TimeRange; label: string } | undefined =
52
+ PRESET_OPTIONS.find((opt: { range: TimeRange; label: string }) => {
53
+ return opt.range === value.range;
54
+ });
55
+ return preset ? preset.label : value.range;
56
+ }
57
+
58
+ const TelemetryTimeRangePicker: FunctionComponent<
59
+ TelemetryTimeRangePickerProps
60
+ > = (props: TelemetryTimeRangePickerProps): ReactElement => {
61
+ const [isOpen, setIsOpen] = useState<boolean>(false);
62
+ const [showCustom, setShowCustom] = useState<boolean>(
63
+ props.value.range === TimeRange.CUSTOM,
64
+ );
65
+ const containerRef: React.RefObject<HTMLDivElement> = useRef<HTMLDivElement>(
66
+ null!,
67
+ );
68
+
69
+ useEffect(() => {
70
+ const handleClickOutside: (e: MouseEvent) => void = (
71
+ e: MouseEvent,
72
+ ): void => {
73
+ if (
74
+ containerRef.current &&
75
+ !containerRef.current.contains(e.target as Node)
76
+ ) {
77
+ setIsOpen(false);
78
+ }
79
+ };
80
+
81
+ document.addEventListener("mousedown", handleClickOutside);
82
+ return () => {
83
+ document.removeEventListener("mousedown", handleClickOutside);
84
+ };
85
+ }, []);
86
+
87
+ useEffect(() => {
88
+ setShowCustom(props.value.range === TimeRange.CUSTOM);
89
+ }, [props.value.range]);
90
+
91
+ const handlePresetSelect: (range: TimeRange) => void = useCallback(
92
+ (range: TimeRange): void => {
93
+ props.onChange({ range });
94
+ setShowCustom(false);
95
+ setIsOpen(false);
96
+ },
97
+ [props],
98
+ );
99
+
100
+ const handleCustomDateChange: (dateRange: InBetween<Date> | null) => void =
101
+ useCallback(
102
+ (dateRange: InBetween<Date> | null): void => {
103
+ if (dateRange) {
104
+ props.onChange({
105
+ range: TimeRange.CUSTOM,
106
+ startAndEndDate: dateRange,
107
+ });
108
+ }
109
+ },
110
+ [props],
111
+ );
112
+
113
+ const buttonLabel: string = getButtonLabel(props.value);
114
+
115
+ return (
116
+ <div ref={containerRef} className="relative">
117
+ <button
118
+ type="button"
119
+ className={`inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium shadow-sm transition-colors ${
120
+ isOpen
121
+ ? "border-indigo-300 bg-indigo-50 text-indigo-700"
122
+ : "border-gray-200 bg-white text-gray-700 hover:border-gray-300 hover:bg-gray-50"
123
+ }`}
124
+ onClick={() => {
125
+ setIsOpen(!isOpen);
126
+ }}
127
+ >
128
+ <Icon icon={IconProp.Clock} className="h-3.5 w-3.5" />
129
+ <span>{buttonLabel}</span>
130
+ <Icon
131
+ icon={IconProp.ChevronDown}
132
+ className={`h-3 w-3 transition-transform ${isOpen ? "rotate-180" : ""}`}
133
+ />
134
+ </button>
135
+
136
+ {isOpen && (
137
+ <div className="absolute right-0 top-full z-50 mt-1 w-72 rounded-lg border border-gray-200 bg-white shadow-lg">
138
+ <div className="max-h-64 overflow-y-auto py-1">
139
+ {PRESET_OPTIONS.map(
140
+ (option: { range: TimeRange; label: string }) => {
141
+ const isActive: boolean = props.value.range === option.range;
142
+
143
+ return (
144
+ <button
145
+ key={option.range}
146
+ type="button"
147
+ className={`flex w-full items-center px-3 py-1.5 text-left text-sm transition-colors ${
148
+ isActive
149
+ ? "bg-indigo-50 font-medium text-indigo-700"
150
+ : "text-gray-700 hover:bg-gray-50"
151
+ }`}
152
+ onClick={() => {
153
+ handlePresetSelect(option.range);
154
+ }}
155
+ >
156
+ {option.label}
157
+ </button>
158
+ );
159
+ },
160
+ )}
161
+
162
+ <button
163
+ type="button"
164
+ className={`flex w-full items-center px-3 py-1.5 text-left text-sm transition-colors ${
165
+ props.value.range === TimeRange.CUSTOM
166
+ ? "bg-indigo-50 font-medium text-indigo-700"
167
+ : "text-gray-700 hover:bg-gray-50"
168
+ }`}
169
+ onClick={() => {
170
+ setShowCustom(true);
171
+ }}
172
+ >
173
+ Custom Range...
174
+ </button>
175
+ </div>
176
+
177
+ {showCustom && (
178
+ <div className="border-t border-gray-100 p-3">
179
+ <StartAndEndDate
180
+ type={StartAndEndDateType.DateTime}
181
+ value={props.value.startAndEndDate}
182
+ hideTimeButtons={true}
183
+ onValueChanged={handleCustomDateChange}
184
+ />
185
+ </div>
186
+ )}
187
+ </div>
188
+ )}
189
+ </div>
190
+ );
191
+ };
192
+
193
+ export default TelemetryTimeRangePicker;
@@ -0,0 +1,67 @@
1
+ /*
2
+ * Generic types for the TelemetryViewer shell. Shared by logs, traces,
3
+ * metrics, and exceptions viewers.
4
+ */
5
+
6
+ export interface FacetValue {
7
+ value: string;
8
+ count: number;
9
+ }
10
+
11
+ export type FacetData = Record<string, Array<FacetValue>>;
12
+
13
+ export interface ActiveFilter {
14
+ facetKey: string;
15
+ value: string;
16
+ displayKey: string;
17
+ displayValue: string;
18
+ readOnly?: boolean | undefined;
19
+ }
20
+
21
+ export interface HistogramBucket {
22
+ time: string;
23
+ /*
24
+ * Series key used to color and stack the bucket (e.g. severity, statusCode,
25
+ * level). Each viewer decides what this means via histogramSeries config.
26
+ */
27
+ series: string;
28
+ count: number;
29
+ }
30
+
31
+ export interface HistogramSeriesOption {
32
+ key: string;
33
+ label: string;
34
+ // Hex fill color used for the bar segment and the legend swatch.
35
+ color: string;
36
+ }
37
+
38
+ export interface LiveOptions {
39
+ isLive: boolean;
40
+ onToggle: (next: boolean) => void;
41
+ isDisabled?: boolean;
42
+ }
43
+
44
+ export interface FacetConfig {
45
+ // Backing field key (e.g. "serviceId", "statusCode").
46
+ key: string;
47
+ // Human-readable section title.
48
+ title: string;
49
+ // Optional value → display name map (e.g. serviceId → service name).
50
+ valueDisplayMap?: Record<string, string> | undefined;
51
+ // Optional value → hex color map (e.g. severity colors).
52
+ valueColorMap?: Record<string, string> | undefined;
53
+ // Ordering priority: lower = shown first.
54
+ priority?: number | undefined;
55
+ }
56
+
57
+ export interface SearchHelpRow {
58
+ syntax: string;
59
+ description: string;
60
+ example: string;
61
+ }
62
+
63
+ export interface SavedViewOption {
64
+ id: string;
65
+ name: string;
66
+ isDefault?: boolean;
67
+ }