@oneuptime/common 10.0.65 → 10.0.66

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 (210) hide show
  1. package/Models/DatabaseModels/DockerHostOwnerTeam.ts +464 -0
  2. package/Models/DatabaseModels/DockerHostOwnerUser.ts +463 -0
  3. package/Models/DatabaseModels/Index.ts +24 -0
  4. package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +464 -0
  5. package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +463 -0
  6. package/Models/DatabaseModels/KubernetesResource.ts +548 -0
  7. package/Models/DatabaseModels/MetricPipelineRule.ts +804 -0
  8. package/Models/DatabaseModels/MetricRecordingRule.ts +470 -0
  9. package/Models/DatabaseModels/Monitor.ts +2 -0
  10. package/Models/DatabaseModels/Project.ts +53 -0
  11. package/Models/DatabaseModels/Service.ts +79 -0
  12. package/Models/DatabaseModels/TraceDropFilter.ts +508 -0
  13. package/Models/DatabaseModels/TracePipeline.ts +436 -0
  14. package/Models/DatabaseModels/TracePipelineProcessor.ts +454 -0
  15. package/Models/DatabaseModels/TraceRecordingRule.ts +470 -0
  16. package/Models/DatabaseModels/TraceScrubRule.ts +546 -0
  17. package/Server/API/KubernetesResourceAPI.ts +129 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1776504277320-MigrationName.ts +399 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1776505976155-AddTracePipelineTables.ts +205 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1776509413763-MigrationName.ts +335 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1776541018853-MigrationName.ts +29 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1776544084793-MigrationName.ts +53 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -1
  24. package/Server/Services/DockerHostOwnerTeamService.ts +10 -0
  25. package/Server/Services/DockerHostOwnerUserService.ts +10 -0
  26. package/Server/Services/KubernetesClusterOwnerTeamService.ts +10 -0
  27. package/Server/Services/KubernetesClusterOwnerUserService.ts +10 -0
  28. package/Server/Services/KubernetesResourceService.ts +351 -0
  29. package/Server/Services/MetricPipelineRuleService.ts +10 -0
  30. package/Server/Services/MetricRecordingRuleService.ts +10 -0
  31. package/Server/Services/TraceDropFilterService.ts +10 -0
  32. package/Server/Services/TracePipelineProcessorService.ts +10 -0
  33. package/Server/Services/TracePipelineService.ts +10 -0
  34. package/Server/Services/TraceRecordingRuleService.ts +10 -0
  35. package/Server/Services/TraceScrubRuleService.ts +10 -0
  36. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +71 -9
  37. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +483 -75
  38. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +379 -6
  39. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +502 -0
  40. package/Tests/Utils/MetricUnitUtil.test.ts +216 -0
  41. package/Tests/Utils/Metrics/MetricFormulaEvaluator.test.ts +269 -0
  42. package/Tests/Utils/Metrics/MetricResultUnitConverter.test.ts +231 -0
  43. package/Tests/Utils/RecordingRuleExpression.test.ts +177 -0
  44. package/Types/Kubernetes/KubernetesInventoryExtractor.ts +327 -0
  45. package/Types/Kubernetes/KubernetesObjectParser.ts +1949 -0
  46. package/Types/Metrics/MetricDownsamplingRetentionDays.ts +49 -0
  47. package/Types/Metrics/MetricFormulaConfigData.ts +4 -0
  48. package/Types/Metrics/MetricPipelineRuleFilterCondition.ts +136 -0
  49. package/Types/Metrics/MetricPipelineRuleType.ts +27 -0
  50. package/Types/Metrics/RecordingRuleDefinition.ts +180 -0
  51. package/Types/Monitor/CriteriaFilter.ts +43 -0
  52. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +70 -0
  53. package/Types/Permission.ts +520 -0
  54. package/Types/Trace/TraceAggregationType.ts +17 -0
  55. package/Types/Trace/TraceDropFilterAction.ts +6 -0
  56. package/Types/Trace/TracePipelineProcessorType.ts +56 -0
  57. package/Types/Trace/TraceRecordingRuleDefinition.ts +218 -0
  58. package/Types/Trace/TraceScrubAction.ts +7 -0
  59. package/Types/Trace/TraceScrubField.ts +8 -0
  60. package/Types/Trace/TraceScrubPatternType.ts +10 -0
  61. package/UI/Components/CardSelect/CardSelect.tsx +9 -1
  62. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +6 -10
  63. package/UI/Components/Forms/Fields/FormField.tsx +1 -0
  64. package/UI/Components/Forms/Types/Field.ts +1 -0
  65. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +57 -0
  66. package/UI/Components/Page/Page.tsx +6 -0
  67. package/Utils/MetricUnitUtil.ts +289 -0
  68. package/Utils/Metrics/MetricFormulaEvaluator.ts +610 -0
  69. package/Utils/Metrics/MetricResultUnitConverter.ts +91 -0
  70. package/Utils/Metrics/RecordingRuleExpression.ts +359 -0
  71. package/Utils/ValueFormatter.ts +137 -13
  72. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +480 -0
  73. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -0
  74. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +479 -0
  75. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -0
  76. package/build/dist/Models/DatabaseModels/Index.js +24 -0
  77. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  78. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +480 -0
  79. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -0
  80. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +479 -0
  81. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -0
  82. package/build/dist/Models/DatabaseModels/KubernetesResource.js +590 -0
  83. package/build/dist/Models/DatabaseModels/KubernetesResource.js.map +1 -0
  84. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +836 -0
  85. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -0
  86. package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +497 -0
  87. package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -0
  88. package/build/dist/Models/DatabaseModels/Monitor.js +2 -0
  89. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  90. package/build/dist/Models/DatabaseModels/Project.js +53 -0
  91. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  92. package/build/dist/Models/DatabaseModels/Service.js +79 -0
  93. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  94. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +536 -0
  95. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -0
  96. package/build/dist/Models/DatabaseModels/TracePipeline.js +462 -0
  97. package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -0
  98. package/build/dist/Models/DatabaseModels/TracePipelineProcessor.js +476 -0
  99. package/build/dist/Models/DatabaseModels/TracePipelineProcessor.js.map +1 -0
  100. package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +497 -0
  101. package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -0
  102. package/build/dist/Models/DatabaseModels/TraceScrubRule.js +575 -0
  103. package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -0
  104. package/build/dist/Server/API/KubernetesResourceAPI.js +98 -0
  105. package/build/dist/Server/API/KubernetesResourceAPI.js.map +1 -0
  106. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776504277320-MigrationName.js +144 -0
  107. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776504277320-MigrationName.js.map +1 -0
  108. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776505976155-AddTracePipelineTables.js +82 -0
  109. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776505976155-AddTracePipelineTables.js.map +1 -0
  110. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776509413763-MigrationName.js +118 -0
  111. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776509413763-MigrationName.js.map +1 -0
  112. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776541018853-MigrationName.js +16 -0
  113. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776541018853-MigrationName.js.map +1 -0
  114. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776544084793-MigrationName.js +24 -0
  115. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776544084793-MigrationName.js.map +1 -0
  116. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  117. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  118. package/build/dist/Server/Services/DockerHostOwnerTeamService.js +9 -0
  119. package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -0
  120. package/build/dist/Server/Services/DockerHostOwnerUserService.js +9 -0
  121. package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -0
  122. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +9 -0
  123. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -0
  124. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +9 -0
  125. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -0
  126. package/build/dist/Server/Services/KubernetesResourceService.js +237 -0
  127. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -0
  128. package/build/dist/Server/Services/MetricPipelineRuleService.js +9 -0
  129. package/build/dist/Server/Services/MetricPipelineRuleService.js.map +1 -0
  130. package/build/dist/Server/Services/MetricRecordingRuleService.js +9 -0
  131. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -0
  132. package/build/dist/Server/Services/TraceDropFilterService.js +9 -0
  133. package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -0
  134. package/build/dist/Server/Services/TracePipelineProcessorService.js +9 -0
  135. package/build/dist/Server/Services/TracePipelineProcessorService.js.map +1 -0
  136. package/build/dist/Server/Services/TracePipelineService.js +9 -0
  137. package/build/dist/Server/Services/TracePipelineService.js.map +1 -0
  138. package/build/dist/Server/Services/TraceRecordingRuleService.js +9 -0
  139. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -0
  140. package/build/dist/Server/Services/TraceScrubRuleService.js +9 -0
  141. package/build/dist/Server/Services/TraceScrubRuleService.js.map +1 -0
  142. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +56 -9
  143. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  144. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +335 -53
  145. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  146. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +277 -5
  147. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  148. package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js +407 -0
  149. package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js.map +1 -0
  150. package/build/dist/Tests/Utils/MetricUnitUtil.test.js +159 -0
  151. package/build/dist/Tests/Utils/MetricUnitUtil.test.js.map +1 -0
  152. package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js +224 -0
  153. package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js.map +1 -0
  154. package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js +180 -0
  155. package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js.map +1 -0
  156. package/build/dist/Tests/Utils/RecordingRuleExpression.test.js +142 -0
  157. package/build/dist/Tests/Utils/RecordingRuleExpression.test.js.map +1 -0
  158. package/build/dist/Types/Kubernetes/KubernetesInventoryExtractor.js +200 -0
  159. package/build/dist/Types/Kubernetes/KubernetesInventoryExtractor.js.map +1 -0
  160. package/build/dist/Types/Kubernetes/KubernetesObjectParser.js +1205 -0
  161. package/build/dist/Types/Kubernetes/KubernetesObjectParser.js.map +1 -0
  162. package/build/dist/Types/Metrics/MetricDownsamplingRetentionDays.js +32 -0
  163. package/build/dist/Types/Metrics/MetricDownsamplingRetentionDays.js.map +1 -0
  164. package/build/dist/Types/Metrics/MetricPipelineRuleFilterCondition.js +103 -0
  165. package/build/dist/Types/Metrics/MetricPipelineRuleFilterCondition.js.map +1 -0
  166. package/build/dist/Types/Metrics/MetricPipelineRuleType.js +27 -0
  167. package/build/dist/Types/Metrics/MetricPipelineRuleType.js.map +1 -0
  168. package/build/dist/Types/Metrics/RecordingRuleDefinition.js +110 -0
  169. package/build/dist/Types/Metrics/RecordingRuleDefinition.js.map +1 -0
  170. package/build/dist/Types/Monitor/CriteriaFilter.js +22 -0
  171. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  172. package/build/dist/Types/Monitor/MetricMonitor/MetricCriteriaContext.js +2 -0
  173. package/build/dist/Types/Monitor/MetricMonitor/MetricCriteriaContext.js.map +1 -0
  174. package/build/dist/Types/Permission.js +454 -0
  175. package/build/dist/Types/Permission.js.map +1 -1
  176. package/build/dist/Types/Trace/TraceAggregationType.js +18 -0
  177. package/build/dist/Types/Trace/TraceAggregationType.js.map +1 -0
  178. package/build/dist/Types/Trace/TraceDropFilterAction.js +7 -0
  179. package/build/dist/Types/Trace/TraceDropFilterAction.js.map +1 -0
  180. package/build/dist/Types/Trace/TracePipelineProcessorType.js +10 -0
  181. package/build/dist/Types/Trace/TracePipelineProcessorType.js.map +1 -0
  182. package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js +145 -0
  183. package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js.map +1 -0
  184. package/build/dist/Types/Trace/TraceScrubAction.js +8 -0
  185. package/build/dist/Types/Trace/TraceScrubAction.js.map +1 -0
  186. package/build/dist/Types/Trace/TraceScrubField.js +9 -0
  187. package/build/dist/Types/Trace/TraceScrubField.js.map +1 -0
  188. package/build/dist/Types/Trace/TraceScrubPatternType.js +11 -0
  189. package/build/dist/Types/Trace/TraceScrubPatternType.js.map +1 -0
  190. package/build/dist/UI/Components/CardSelect/CardSelect.js +3 -1
  191. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  192. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -9
  193. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  194. package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
  195. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  196. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +30 -0
  197. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  198. package/build/dist/UI/Components/Page/Page.js +1 -0
  199. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  200. package/build/dist/Utils/MetricUnitUtil.js +232 -0
  201. package/build/dist/Utils/MetricUnitUtil.js.map +1 -0
  202. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js +453 -0
  203. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js.map +1 -0
  204. package/build/dist/Utils/Metrics/MetricResultUnitConverter.js +61 -0
  205. package/build/dist/Utils/Metrics/MetricResultUnitConverter.js.map +1 -0
  206. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +298 -0
  207. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -0
  208. package/build/dist/Utils/ValueFormatter.js +123 -13
  209. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  210. package/package.json +1 -1
@@ -0,0 +1,327 @@
1
+ import { JSONObject } from "../JSON";
2
+ import {
3
+ KubernetesPodObject,
4
+ KubernetesNodeObject,
5
+ KubernetesDeploymentObject,
6
+ KubernetesStatefulSetObject,
7
+ KubernetesDaemonSetObject,
8
+ KubernetesJobObject,
9
+ KubernetesCronJobObject,
10
+ KubernetesNamespaceObject,
11
+ KubernetesPVCObject,
12
+ KubernetesPVObject,
13
+ KubernetesHPAObject,
14
+ KubernetesVPAObject,
15
+ KubernetesObjectMetadata,
16
+ KubernetesCondition,
17
+ parsePodObject,
18
+ parseNodeObject,
19
+ parseDeploymentObject,
20
+ parseStatefulSetObject,
21
+ parseDaemonSetObject,
22
+ parseJobObject,
23
+ parseCronJobObject,
24
+ parseNamespaceObject,
25
+ parsePVCObject,
26
+ parsePVObject,
27
+ parseHPAObject,
28
+ parseVPAObject,
29
+ extractObjectFromLogBody,
30
+ } from "./KubernetesObjectParser";
31
+
32
+ /*
33
+ * ------------------------------------------------------------------
34
+ * KubernetesInventoryExtractor
35
+ *
36
+ * Shared helpers for converting an OTLP k8sobjects log body into a
37
+ * row-shaped payload (ParsedKubernetesResource) that the inventory
38
+ * ingest path upserts into Postgres.
39
+ *
40
+ * Kept in Common/Types so the server-side ingest and any future
41
+ * client/worker code can both import it. The helpers are pure — no
42
+ * IO, no db — so they're trivially testable.
43
+ * ------------------------------------------------------------------
44
+ */
45
+
46
+ /*
47
+ * Union of all typed parser outputs. Each one has .metadata; most
48
+ * also have .spec and .status.
49
+ */
50
+ type AnyKubernetesObject =
51
+ | KubernetesPodObject
52
+ | KubernetesNodeObject
53
+ | KubernetesDeploymentObject
54
+ | KubernetesStatefulSetObject
55
+ | KubernetesDaemonSetObject
56
+ | KubernetesJobObject
57
+ | KubernetesCronJobObject
58
+ | KubernetesNamespaceObject
59
+ | KubernetesPVCObject
60
+ | KubernetesPVObject
61
+ | KubernetesHPAObject
62
+ | KubernetesVPAObject;
63
+
64
+ /**
65
+ * Row-shaped payload for KubernetesResource upserts. Mirrors the
66
+ * columns of the KubernetesResource Postgres model.
67
+ */
68
+ export interface ParsedKubernetesResource {
69
+ kind: string;
70
+ namespaceKey: string; // "" for cluster-scoped resources
71
+ name: string;
72
+ uid: string | null;
73
+ phase: string | null;
74
+ isReady: boolean | null;
75
+ hasMemoryPressure: boolean | null;
76
+ hasDiskPressure: boolean | null;
77
+ hasPidPressure: boolean | null;
78
+ labels: JSONObject | null;
79
+ annotations: JSONObject | null;
80
+ ownerReferences: JSONObject | null;
81
+ spec: JSONObject | null;
82
+ status: JSONObject | null;
83
+ lastSeenAt: Date;
84
+ resourceCreationTimestamp: Date | null;
85
+ }
86
+
87
+ /**
88
+ * k8s.resource.name (plural, lowercase from the k8sobjects receiver)
89
+ * → Kubernetes Kind (singular, PascalCase, used throughout the UI).
90
+ *
91
+ * Returns null for unrecognized types — caller should skip those
92
+ * records rather than store them under a bogus kind.
93
+ */
94
+ export function kindFromResourceType(resourceType: string): string | null {
95
+ const map: Record<string, string> = {
96
+ pods: "Pod",
97
+ nodes: "Node",
98
+ namespaces: "Namespace",
99
+ deployments: "Deployment",
100
+ statefulsets: "StatefulSet",
101
+ daemonsets: "DaemonSet",
102
+ jobs: "Job",
103
+ cronjobs: "CronJob",
104
+ persistentvolumeclaims: "PersistentVolumeClaim",
105
+ persistentvolumes: "PersistentVolume",
106
+ horizontalpodautoscalers: "HorizontalPodAutoscaler",
107
+ verticalpodautoscalers: "VerticalPodAutoscaler",
108
+ };
109
+ return map[resourceType.toLowerCase()] || null;
110
+ }
111
+
112
+ export const INVENTORIED_RESOURCE_TYPES: ReadonlyArray<string> = [
113
+ "pods",
114
+ "nodes",
115
+ "namespaces",
116
+ "deployments",
117
+ "statefulsets",
118
+ "daemonsets",
119
+ "jobs",
120
+ "cronjobs",
121
+ "persistentvolumeclaims",
122
+ "persistentvolumes",
123
+ "horizontalpodautoscalers",
124
+ "verticalpodautoscalers",
125
+ ];
126
+
127
+ function parseCreationTimestamp(value: string | undefined): Date | null {
128
+ if (!value) {
129
+ return null;
130
+ }
131
+ try {
132
+ const d: Date = new Date(value);
133
+ if (isNaN(d.getTime())) {
134
+ return null;
135
+ }
136
+ return d;
137
+ } catch {
138
+ return null;
139
+ }
140
+ }
141
+
142
+ function deriveNodeConditionFlags(
143
+ conditions: Array<KubernetesCondition> | undefined,
144
+ ): {
145
+ isReady: boolean | null;
146
+ hasMemoryPressure: boolean | null;
147
+ hasDiskPressure: boolean | null;
148
+ hasPidPressure: boolean | null;
149
+ } {
150
+ if (!conditions || conditions.length === 0) {
151
+ return {
152
+ isReady: null,
153
+ hasMemoryPressure: null,
154
+ hasDiskPressure: null,
155
+ hasPidPressure: null,
156
+ };
157
+ }
158
+
159
+ let isReady: boolean | null = null;
160
+ let memPressure: boolean | null = null;
161
+ let diskPressure: boolean | null = null;
162
+ let pidPressure: boolean | null = null;
163
+
164
+ for (const c of conditions) {
165
+ const isTrue: boolean = c.status === "True";
166
+ if (c.type === "Ready") {
167
+ isReady = isTrue;
168
+ } else if (c.type === "MemoryPressure") {
169
+ memPressure = isTrue;
170
+ } else if (c.type === "DiskPressure") {
171
+ diskPressure = isTrue;
172
+ } else if (c.type === "PIDPressure") {
173
+ pidPressure = isTrue;
174
+ }
175
+ }
176
+
177
+ /*
178
+ * For pressure flags we only treat a Node as having a signal when the
179
+ * condition was actually reported. If the agent didn't include it,
180
+ * leave as null rather than false — avoids false-negative alerting.
181
+ */
182
+ return {
183
+ isReady,
184
+ hasMemoryPressure: memPressure === null ? false : memPressure,
185
+ hasDiskPressure: diskPressure === null ? false : diskPressure,
186
+ hasPidPressure: pidPressure === null ? false : pidPressure,
187
+ };
188
+ }
189
+
190
+ function parseByResourceType(
191
+ resourceType: string,
192
+ kvList: JSONObject,
193
+ ): AnyKubernetesObject | null {
194
+ switch (resourceType.toLowerCase()) {
195
+ case "pods":
196
+ return parsePodObject(kvList);
197
+ case "nodes":
198
+ return parseNodeObject(kvList);
199
+ case "namespaces":
200
+ return parseNamespaceObject(kvList);
201
+ case "deployments":
202
+ return parseDeploymentObject(kvList);
203
+ case "statefulsets":
204
+ return parseStatefulSetObject(kvList);
205
+ case "daemonsets":
206
+ return parseDaemonSetObject(kvList);
207
+ case "jobs":
208
+ return parseJobObject(kvList);
209
+ case "cronjobs":
210
+ return parseCronJobObject(kvList);
211
+ case "persistentvolumeclaims":
212
+ return parsePVCObject(kvList);
213
+ case "persistentvolumes":
214
+ return parsePVObject(kvList);
215
+ case "horizontalpodautoscalers":
216
+ return parseHPAObject(kvList);
217
+ case "verticalpodautoscalers":
218
+ return parseVPAObject(kvList);
219
+ default:
220
+ return null;
221
+ }
222
+ }
223
+
224
+ /**
225
+ * Parse a single OTLP log body string + its k8s.resource.name into a
226
+ * ParsedKubernetesResource ready for upsert. Returns null when the
227
+ * record is malformed, unsupported, or missing required identity
228
+ * fields.
229
+ */
230
+ export function extractInventoryResource(data: {
231
+ resourceType: string;
232
+ logBody: string;
233
+ lastSeenAt: Date;
234
+ }): ParsedKubernetesResource | null {
235
+ const kind: string | null = kindFromResourceType(data.resourceType);
236
+ if (!kind) {
237
+ return null;
238
+ }
239
+
240
+ const kvList: JSONObject | null = extractObjectFromLogBody(data.logBody);
241
+ if (!kvList) {
242
+ return null;
243
+ }
244
+
245
+ const parsed: AnyKubernetesObject | null = parseByResourceType(
246
+ data.resourceType,
247
+ kvList,
248
+ );
249
+ if (!parsed) {
250
+ return null;
251
+ }
252
+
253
+ const metadata: KubernetesObjectMetadata = parsed.metadata;
254
+ if (!metadata || !metadata.name) {
255
+ return null;
256
+ }
257
+
258
+ // Pod-specific hot column
259
+ let phase: string | null = null;
260
+ if (kind === "Pod") {
261
+ const podStatus: KubernetesPodObject["status"] = (
262
+ parsed as KubernetesPodObject
263
+ ).status;
264
+ phase = podStatus?.phase || null;
265
+ }
266
+
267
+ // Node-specific hot columns
268
+ let nodeFlags: ReturnType<typeof deriveNodeConditionFlags> = {
269
+ isReady: null,
270
+ hasMemoryPressure: null,
271
+ hasDiskPressure: null,
272
+ hasPidPressure: null,
273
+ };
274
+ if (kind === "Node") {
275
+ const nodeStatus: KubernetesNodeObject["status"] = (
276
+ parsed as KubernetesNodeObject
277
+ ).status;
278
+ nodeFlags = deriveNodeConditionFlags(nodeStatus?.conditions);
279
+ }
280
+
281
+ /*
282
+ * Collect spec/status blocks when the typed parser exposed them.
283
+ * Some kinds (Namespace) don't carry spec/status, so these are
284
+ * nullable.
285
+ * Cast to a minimal structural shape so TS permits optional access
286
+ * across the heterogeneous union.
287
+ */
288
+ const anyParsed: {
289
+ spec?: unknown;
290
+ status?: unknown;
291
+ } = parsed as {
292
+ spec?: unknown;
293
+ status?: unknown;
294
+ };
295
+
296
+ return {
297
+ kind,
298
+ namespaceKey: metadata.namespace || "",
299
+ name: metadata.name,
300
+ uid: metadata.uid || null,
301
+ phase,
302
+ isReady: nodeFlags.isReady,
303
+ hasMemoryPressure: nodeFlags.hasMemoryPressure,
304
+ hasDiskPressure: nodeFlags.hasDiskPressure,
305
+ hasPidPressure: nodeFlags.hasPidPressure,
306
+ labels:
307
+ metadata.labels && Object.keys(metadata.labels).length > 0
308
+ ? (metadata.labels as JSONObject)
309
+ : null,
310
+ annotations:
311
+ metadata.annotations && Object.keys(metadata.annotations).length > 0
312
+ ? (metadata.annotations as JSONObject)
313
+ : null,
314
+ ownerReferences:
315
+ metadata.ownerReferences && metadata.ownerReferences.length > 0
316
+ ? ({
317
+ items: metadata.ownerReferences,
318
+ } as unknown as JSONObject)
319
+ : null,
320
+ spec: (anyParsed.spec as JSONObject | undefined) || null,
321
+ status: (anyParsed.status as JSONObject | undefined) || null,
322
+ lastSeenAt: data.lastSeenAt,
323
+ resourceCreationTimestamp: parseCreationTimestamp(
324
+ metadata.creationTimestamp,
325
+ ),
326
+ };
327
+ }