@oneuptime/common 11.1.2 → 11.2.0

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 (146) hide show
  1. package/Models/DatabaseModels/Alert.ts +55 -0
  2. package/Models/DatabaseModels/Incident.ts +55 -0
  3. package/Models/DatabaseModels/Index.ts +12 -0
  4. package/Models/DatabaseModels/IoTDevice.ts +690 -0
  5. package/Models/DatabaseModels/IoTFleet.ts +862 -0
  6. package/Models/DatabaseModels/IoTFleetLabelRule.ts +514 -0
  7. package/Models/DatabaseModels/IoTFleetOwnerRule.ts +596 -0
  8. package/Models/DatabaseModels/IoTFleetOwnerTeam.ts +485 -0
  9. package/Models/DatabaseModels/IoTFleetOwnerUser.ts +484 -0
  10. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  11. package/Server/API/IoTDeviceAPI.ts +128 -0
  12. package/Server/API/TelemetryAPI.ts +104 -35
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1782900000000-AddIoTFleetAndDeviceTables.ts +399 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1783000000000-AddIoTFleetActivityJoinTables.ts +97 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1783010000000-MigrationName.ts +979 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  17. package/Server/Services/IoTDeviceService.ts +356 -0
  18. package/Server/Services/IoTFleetLabelRuleEngineService.ts +198 -0
  19. package/Server/Services/IoTFleetLabelRuleService.ts +14 -0
  20. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +216 -0
  21. package/Server/Services/IoTFleetOwnerRuleService.ts +14 -0
  22. package/Server/Services/IoTFleetOwnerTeamService.ts +10 -0
  23. package/Server/Services/IoTFleetOwnerUserService.ts +10 -0
  24. package/Server/Services/IoTFleetService.ts +376 -0
  25. package/Server/Services/OpenTelemetryIngestService.ts +16 -0
  26. package/Server/Services/StatusPageService.ts +69 -26
  27. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +36 -0
  28. package/Server/Services/TelemetryUsageBillingService.ts +18 -0
  29. package/Server/Services/TraceAggregationService.ts +174 -0
  30. package/Server/Utils/Monitor/MonitorAlert.ts +24 -4
  31. package/Server/Utils/Monitor/MonitorClusterContext.ts +26 -2
  32. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +4 -2
  33. package/Server/Utils/Monitor/MonitorIncident.ts +39 -5
  34. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +14 -0
  35. package/Server/Utils/Monitor/SeriesResourceLabels.ts +22 -0
  36. package/Server/Utils/Telemetry/IoTSnapshotScan.ts +408 -0
  37. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +36 -0
  38. package/Types/Icon/IconProp.ts +1 -0
  39. package/Types/Monitor/IotAlertTemplates.ts +593 -0
  40. package/Types/Monitor/IotMetricCatalog.ts +146 -0
  41. package/Types/Monitor/MonitorStep.ts +31 -0
  42. package/Types/Monitor/MonitorStepIoTMonitor.ts +65 -0
  43. package/Types/Monitor/MonitorType.ts +12 -1
  44. package/Types/Permission.ts +230 -0
  45. package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +3 -0
  46. package/Types/Telemetry/ServiceType.ts +1 -0
  47. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +5 -5
  48. package/UI/Components/Icon/Icon.tsx +18 -2
  49. package/UI/Components/Page/Page.tsx +1 -2
  50. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  51. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  52. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  53. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  54. package/build/dist/Models/DatabaseModels/Index.js +12 -0
  55. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  56. package/build/dist/Models/DatabaseModels/IoTDevice.js +722 -0
  57. package/build/dist/Models/DatabaseModels/IoTDevice.js.map +1 -0
  58. package/build/dist/Models/DatabaseModels/IoTFleet.js +882 -0
  59. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -0
  60. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +522 -0
  61. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -0
  62. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +603 -0
  63. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -0
  64. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js +503 -0
  65. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js.map +1 -0
  66. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js +502 -0
  67. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js.map +1 -0
  68. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  69. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  70. package/build/dist/Server/API/IoTDeviceAPI.js +92 -0
  71. package/build/dist/Server/API/IoTDeviceAPI.js.map +1 -0
  72. package/build/dist/Server/API/TelemetryAPI.js +76 -27
  73. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  74. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782900000000-AddIoTFleetAndDeviceTables.js +187 -0
  75. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782900000000-AddIoTFleetAndDeviceTables.js.map +1 -0
  76. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783000000000-AddIoTFleetActivityJoinTables.js +48 -0
  77. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783000000000-AddIoTFleetActivityJoinTables.js.map +1 -0
  78. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783010000000-MigrationName.js +340 -0
  79. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783010000000-MigrationName.js.map +1 -0
  80. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  81. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  82. package/build/dist/Server/Services/IoTDeviceService.js +249 -0
  83. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -0
  84. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +166 -0
  85. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -0
  86. package/build/dist/Server/Services/IoTFleetLabelRuleService.js +13 -0
  87. package/build/dist/Server/Services/IoTFleetLabelRuleService.js.map +1 -0
  88. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +186 -0
  89. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -0
  90. package/build/dist/Server/Services/IoTFleetOwnerRuleService.js +13 -0
  91. package/build/dist/Server/Services/IoTFleetOwnerRuleService.js.map +1 -0
  92. package/build/dist/Server/Services/IoTFleetOwnerTeamService.js +9 -0
  93. package/build/dist/Server/Services/IoTFleetOwnerTeamService.js.map +1 -0
  94. package/build/dist/Server/Services/IoTFleetOwnerUserService.js +9 -0
  95. package/build/dist/Server/Services/IoTFleetOwnerUserService.js.map +1 -0
  96. package/build/dist/Server/Services/IoTFleetService.js +340 -0
  97. package/build/dist/Server/Services/IoTFleetService.js.map +1 -0
  98. package/build/dist/Server/Services/OpenTelemetryIngestService.js +26 -11
  99. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  100. package/build/dist/Server/Services/StatusPageService.js +57 -23
  101. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  102. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +34 -0
  103. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  104. package/build/dist/Server/Services/TelemetryUsageBillingService.js +13 -0
  105. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  106. package/build/dist/Server/Services/TraceAggregationService.js +136 -0
  107. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  108. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +37 -19
  109. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  110. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +27 -4
  111. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -1
  112. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +4 -2
  113. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  114. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +39 -11
  115. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  116. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +8 -0
  117. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  118. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +17 -0
  119. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  120. package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js +300 -0
  121. package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js.map +1 -0
  122. package/build/dist/Types/Icon/IconProp.js +1 -0
  123. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  124. package/build/dist/Types/Monitor/IotAlertTemplates.js +467 -0
  125. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -0
  126. package/build/dist/Types/Monitor/IotMetricCatalog.js +108 -0
  127. package/build/dist/Types/Monitor/IotMetricCatalog.js.map +1 -0
  128. package/build/dist/Types/Monitor/MonitorStep.js +23 -0
  129. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  130. package/build/dist/Types/Monitor/MonitorStepIoTMonitor.js +32 -0
  131. package/build/dist/Types/Monitor/MonitorStepIoTMonitor.js.map +1 -0
  132. package/build/dist/Types/Monitor/MonitorType.js +11 -1
  133. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  134. package/build/dist/Types/Permission.js +204 -0
  135. package/build/dist/Types/Permission.js.map +1 -1
  136. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +2 -0
  137. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
  138. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  139. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  140. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +3 -3
  141. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  142. package/build/dist/UI/Components/Icon/Icon.js +12 -2
  143. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  144. package/build/dist/UI/Components/Page/Page.js +1 -2
  145. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  146. package/package.json +1 -1
@@ -0,0 +1,862 @@
1
+ import Label from "./Label";
2
+ import Project from "./Project";
3
+ import User from "./User";
4
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
5
+ import Route from "../../Types/API/Route";
6
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
7
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
8
+ import AccessControlColumn from "../../Types/Database/AccessControlColumn";
9
+ import ColumnLength from "../../Types/Database/ColumnLength";
10
+ import ColumnType from "../../Types/Database/ColumnType";
11
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
12
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
13
+ import SlugifyColumn from "../../Types/Database/SlugifyColumn";
14
+ import TableColumn from "../../Types/Database/TableColumn";
15
+ import TableColumnType from "../../Types/Database/TableColumnType";
16
+ import TableMetadata from "../../Types/Database/TableMetadata";
17
+ import TenantColumn from "../../Types/Database/TenantColumn";
18
+ import UniqueColumnBy from "../../Types/Database/UniqueColumnBy";
19
+ import IconProp from "../../Types/Icon/IconProp";
20
+ import ObjectID from "../../Types/ObjectID";
21
+ import Permission from "../../Types/Permission";
22
+ import TelemetryRetentionConfig from "../../Types/Telemetry/TelemetryRetentionConfig";
23
+ import {
24
+ Column,
25
+ Entity,
26
+ Index,
27
+ JoinColumn,
28
+ JoinTable,
29
+ ManyToMany,
30
+ ManyToOne,
31
+ } from "typeorm";
32
+
33
+ @AccessControlColumn("labels")
34
+ @EnableDocumentation()
35
+ @TenantColumn("projectId")
36
+ @TableAccessControl({
37
+ create: [
38
+ Permission.ProjectOwner,
39
+ Permission.ProjectAdmin,
40
+ Permission.ProjectMember,
41
+ Permission.SettingsAdmin,
42
+ Permission.SettingsMember,
43
+ Permission.CreateIoTFleet,
44
+ ],
45
+ read: [
46
+ Permission.ProjectOwner,
47
+ Permission.ProjectAdmin,
48
+ Permission.ProjectMember,
49
+ Permission.Viewer,
50
+ Permission.SettingsAdmin,
51
+ Permission.SettingsMember,
52
+ Permission.SettingsViewer,
53
+ Permission.ReadIoTFleet,
54
+ ],
55
+ delete: [
56
+ Permission.ProjectOwner,
57
+ Permission.ProjectAdmin,
58
+ Permission.ProjectMember,
59
+ Permission.SettingsAdmin,
60
+ Permission.SettingsMember,
61
+ Permission.DeleteIoTFleet,
62
+ ],
63
+ update: [
64
+ Permission.ProjectOwner,
65
+ Permission.ProjectAdmin,
66
+ Permission.ProjectMember,
67
+ Permission.SettingsAdmin,
68
+ Permission.SettingsMember,
69
+ Permission.EditIoTFleet,
70
+ ],
71
+ })
72
+ @CrudApiEndpoint(new Route("/iot-fleet"))
73
+ @SlugifyColumn("name", "slug")
74
+ /*
75
+ * DB-level unique index on (projectId, name) — the @UniqueColumnBy decorator
76
+ * on `name` is app-level only and does not defuse the concurrent
77
+ * find-or-create race at ingest (multiple agent pods discovering the same
78
+ * fleet simultaneously). Mirrors KubernetesCluster's
79
+ * (projectId, clusterIdentifier) unique index.
80
+ */
81
+ @Index(["projectId", "name"], { unique: true })
82
+ @Index(["projectId", "isArchived"])
83
+ @TableMetadata({
84
+ tableName: "IoTFleet",
85
+ singularName: "IoT Fleet",
86
+ pluralName: "IoT Fleets",
87
+ icon: IconProp.IoT,
88
+ tableDescription:
89
+ "IoT device fleets that are being monitored in this project. Each fleet is auto-discovered when an IoT device or gateway sends metrics with the iot.fleet.name OTel resource attribute, or can be manually registered.",
90
+ })
91
+ @Entity({
92
+ name: "IoTFleet",
93
+ })
94
+ export default class IoTFleet extends BaseModel {
95
+ @ColumnAccessControl({
96
+ create: [
97
+ Permission.ProjectOwner,
98
+ Permission.ProjectAdmin,
99
+ Permission.ProjectMember,
100
+ Permission.SettingsAdmin,
101
+ Permission.SettingsMember,
102
+ Permission.CreateIoTFleet,
103
+ ],
104
+ read: [
105
+ Permission.ProjectOwner,
106
+ Permission.ProjectAdmin,
107
+ Permission.ProjectMember,
108
+ Permission.Viewer,
109
+ Permission.SettingsAdmin,
110
+ Permission.SettingsMember,
111
+ Permission.SettingsViewer,
112
+ Permission.ReadIoTFleet,
113
+ ],
114
+ update: [],
115
+ })
116
+ @TableColumn({
117
+ manyToOneRelationColumn: "projectId",
118
+ type: TableColumnType.Entity,
119
+ modelType: Project,
120
+ title: "Project",
121
+ description: "Relation to Project Resource in which this object belongs",
122
+ })
123
+ @ManyToOne(
124
+ () => {
125
+ return Project;
126
+ },
127
+ {
128
+ eager: false,
129
+ nullable: true,
130
+ onDelete: "CASCADE",
131
+ orphanedRowAction: "nullify",
132
+ },
133
+ )
134
+ @JoinColumn({ name: "projectId" })
135
+ public project?: Project = undefined;
136
+
137
+ @ColumnAccessControl({
138
+ create: [
139
+ Permission.ProjectOwner,
140
+ Permission.ProjectAdmin,
141
+ Permission.ProjectMember,
142
+ Permission.SettingsAdmin,
143
+ Permission.SettingsMember,
144
+ Permission.CreateIoTFleet,
145
+ ],
146
+ read: [
147
+ Permission.ProjectOwner,
148
+ Permission.ProjectAdmin,
149
+ Permission.ProjectMember,
150
+ Permission.Viewer,
151
+ Permission.SettingsAdmin,
152
+ Permission.SettingsMember,
153
+ Permission.SettingsViewer,
154
+ Permission.ReadIoTFleet,
155
+ ],
156
+ update: [],
157
+ })
158
+ @Index()
159
+ @TableColumn({
160
+ type: TableColumnType.ObjectID,
161
+ required: true,
162
+ canReadOnRelationQuery: true,
163
+ title: "Project ID",
164
+ description: "ID of your OneUptime Project in which this object belongs",
165
+ })
166
+ @Column({
167
+ type: ColumnType.ObjectID,
168
+ nullable: false,
169
+ transformer: ObjectID.getDatabaseTransformer(),
170
+ })
171
+ public projectId?: ObjectID = undefined;
172
+
173
+ @ColumnAccessControl({
174
+ create: [
175
+ Permission.ProjectOwner,
176
+ Permission.ProjectAdmin,
177
+ Permission.ProjectMember,
178
+ Permission.SettingsAdmin,
179
+ Permission.SettingsMember,
180
+ Permission.CreateIoTFleet,
181
+ ],
182
+ read: [
183
+ Permission.ProjectOwner,
184
+ Permission.ProjectAdmin,
185
+ Permission.ProjectMember,
186
+ Permission.Viewer,
187
+ Permission.SettingsAdmin,
188
+ Permission.SettingsMember,
189
+ Permission.SettingsViewer,
190
+ Permission.ReadIoTFleet,
191
+ ],
192
+ update: [
193
+ Permission.ProjectOwner,
194
+ Permission.ProjectAdmin,
195
+ Permission.ProjectMember,
196
+ Permission.SettingsAdmin,
197
+ Permission.SettingsMember,
198
+ Permission.EditIoTFleet,
199
+ ],
200
+ })
201
+ @Index()
202
+ @TableColumn({
203
+ required: true,
204
+ type: TableColumnType.ShortText,
205
+ canReadOnRelationQuery: true,
206
+ title: "Name",
207
+ description:
208
+ "Name of this IoT fleet. This is the join key — it must match the iot.fleet.name OTel resource attribute stamped by the IoT device or gateway.",
209
+ example: "field-sensors-prod",
210
+ })
211
+ @Column({
212
+ nullable: false,
213
+ type: ColumnType.ShortText,
214
+ length: ColumnLength.ShortText,
215
+ })
216
+ @UniqueColumnBy("projectId")
217
+ public name?: string = undefined;
218
+
219
+ @ColumnAccessControl({
220
+ create: [],
221
+ read: [
222
+ Permission.ProjectOwner,
223
+ Permission.ProjectAdmin,
224
+ Permission.ProjectMember,
225
+ Permission.Viewer,
226
+ Permission.SettingsAdmin,
227
+ Permission.SettingsMember,
228
+ Permission.SettingsViewer,
229
+ Permission.ReadIoTFleet,
230
+ ],
231
+ update: [],
232
+ })
233
+ @TableColumn({
234
+ required: true,
235
+ unique: true,
236
+ type: TableColumnType.Slug,
237
+ computed: true,
238
+ title: "Slug",
239
+ description: "Friendly globally unique name for your object",
240
+ })
241
+ @Column({
242
+ nullable: false,
243
+ type: ColumnType.Slug,
244
+ length: ColumnLength.Slug,
245
+ })
246
+ public slug?: string = undefined;
247
+
248
+ @ColumnAccessControl({
249
+ create: [
250
+ Permission.ProjectOwner,
251
+ Permission.ProjectAdmin,
252
+ Permission.ProjectMember,
253
+ Permission.SettingsAdmin,
254
+ Permission.SettingsMember,
255
+ Permission.CreateIoTFleet,
256
+ ],
257
+ read: [
258
+ Permission.ProjectOwner,
259
+ Permission.ProjectAdmin,
260
+ Permission.ProjectMember,
261
+ Permission.Viewer,
262
+ Permission.SettingsAdmin,
263
+ Permission.SettingsMember,
264
+ Permission.SettingsViewer,
265
+ Permission.ReadIoTFleet,
266
+ ],
267
+ update: [
268
+ Permission.ProjectOwner,
269
+ Permission.ProjectAdmin,
270
+ Permission.ProjectMember,
271
+ Permission.SettingsAdmin,
272
+ Permission.SettingsMember,
273
+ Permission.EditIoTFleet,
274
+ ],
275
+ })
276
+ @TableColumn({
277
+ required: false,
278
+ type: TableColumnType.LongText,
279
+ canReadOnRelationQuery: true,
280
+ title: "Description",
281
+ description: "Friendly description for this IoT fleet",
282
+ example: "Production field sensor fleet running in US East region",
283
+ })
284
+ @Column({
285
+ nullable: true,
286
+ type: ColumnType.LongText,
287
+ length: ColumnLength.LongText,
288
+ })
289
+ public description?: string = undefined;
290
+
291
+ @ColumnAccessControl({
292
+ create: [],
293
+ read: [
294
+ Permission.ProjectOwner,
295
+ Permission.ProjectAdmin,
296
+ Permission.ProjectMember,
297
+ Permission.Viewer,
298
+ Permission.SettingsAdmin,
299
+ Permission.SettingsMember,
300
+ Permission.SettingsViewer,
301
+ Permission.ReadIoTFleet,
302
+ ],
303
+ update: [
304
+ Permission.ProjectOwner,
305
+ Permission.ProjectAdmin,
306
+ Permission.EditIoTFleet,
307
+ ],
308
+ })
309
+ @TableColumn({
310
+ required: false,
311
+ type: TableColumnType.ShortText,
312
+ canReadOnRelationQuery: true,
313
+ title: "OTel Collector Status",
314
+ description:
315
+ "Connection status of the OTel Collector agent (connected or disconnected)",
316
+ example: "connected",
317
+ })
318
+ @Column({
319
+ nullable: true,
320
+ type: ColumnType.ShortText,
321
+ length: ColumnLength.ShortText,
322
+ default: "disconnected",
323
+ })
324
+ public otelCollectorStatus?: string = undefined;
325
+
326
+ @ColumnAccessControl({
327
+ create: [],
328
+ read: [
329
+ Permission.ProjectOwner,
330
+ Permission.ProjectAdmin,
331
+ Permission.ProjectMember,
332
+ Permission.Viewer,
333
+ Permission.SettingsAdmin,
334
+ Permission.SettingsMember,
335
+ Permission.SettingsViewer,
336
+ Permission.ReadIoTFleet,
337
+ ],
338
+ update: [
339
+ Permission.ProjectOwner,
340
+ Permission.ProjectAdmin,
341
+ Permission.EditIoTFleet,
342
+ ],
343
+ })
344
+ @TableColumn({
345
+ required: false,
346
+ type: TableColumnType.ShortText,
347
+ canReadOnRelationQuery: true,
348
+ title: "Agent Version",
349
+ description:
350
+ "Version of the IoT agent reporting telemetry, as self-reported via the oneuptime.agent.version resource attribute",
351
+ example: "1.0.0",
352
+ })
353
+ @Column({
354
+ nullable: true,
355
+ type: ColumnType.ShortText,
356
+ length: ColumnLength.ShortText,
357
+ })
358
+ public agentVersion?: string = undefined;
359
+
360
+ @ColumnAccessControl({
361
+ create: [],
362
+ read: [
363
+ Permission.ProjectOwner,
364
+ Permission.ProjectAdmin,
365
+ Permission.ProjectMember,
366
+ Permission.Viewer,
367
+ Permission.SettingsAdmin,
368
+ Permission.SettingsMember,
369
+ Permission.SettingsViewer,
370
+ Permission.ReadIoTFleet,
371
+ ],
372
+ update: [
373
+ Permission.ProjectOwner,
374
+ Permission.ProjectAdmin,
375
+ Permission.EditIoTFleet,
376
+ ],
377
+ })
378
+ @TableColumn({
379
+ required: false,
380
+ type: TableColumnType.Date,
381
+ canReadOnRelationQuery: true,
382
+ title: "Last Seen At",
383
+ description: "When metrics were last received from this fleet",
384
+ })
385
+ @Column({
386
+ nullable: true,
387
+ type: ColumnType.Date,
388
+ })
389
+ public lastSeenAt?: Date = undefined;
390
+
391
+ @ColumnAccessControl({
392
+ create: [],
393
+ read: [
394
+ Permission.ProjectOwner,
395
+ Permission.ProjectAdmin,
396
+ Permission.ProjectMember,
397
+ Permission.Viewer,
398
+ Permission.SettingsAdmin,
399
+ Permission.SettingsMember,
400
+ Permission.SettingsViewer,
401
+ Permission.ReadIoTFleet,
402
+ ],
403
+ update: [
404
+ Permission.ProjectOwner,
405
+ Permission.ProjectAdmin,
406
+ Permission.EditIoTFleet,
407
+ ],
408
+ })
409
+ @TableColumn({
410
+ type: TableColumnType.Number,
411
+ title: "Device Count",
412
+ description: "Cached count of devices in this fleet",
413
+ })
414
+ @Column({
415
+ type: ColumnType.Number,
416
+ nullable: true,
417
+ default: 0,
418
+ })
419
+ public deviceCount?: number = undefined;
420
+
421
+ @ColumnAccessControl({
422
+ create: [],
423
+ read: [
424
+ Permission.ProjectOwner,
425
+ Permission.ProjectAdmin,
426
+ Permission.ProjectMember,
427
+ Permission.Viewer,
428
+ Permission.SettingsAdmin,
429
+ Permission.SettingsMember,
430
+ Permission.SettingsViewer,
431
+ Permission.ReadIoTFleet,
432
+ ],
433
+ update: [
434
+ Permission.ProjectOwner,
435
+ Permission.ProjectAdmin,
436
+ Permission.EditIoTFleet,
437
+ ],
438
+ })
439
+ @TableColumn({
440
+ type: TableColumnType.Number,
441
+ title: "Online Device Count",
442
+ description:
443
+ "Cached count of devices currently online (iot_device_up == 1) in this fleet. Rendered as 'Devices X/Y online' next to deviceCount.",
444
+ })
445
+ @Column({
446
+ type: ColumnType.Number,
447
+ nullable: true,
448
+ default: 0,
449
+ })
450
+ public onlineDeviceCount?: number = undefined;
451
+
452
+ @ColumnAccessControl({
453
+ create: [
454
+ Permission.ProjectOwner,
455
+ Permission.ProjectAdmin,
456
+ Permission.ProjectMember,
457
+ Permission.SettingsAdmin,
458
+ Permission.SettingsMember,
459
+ Permission.CreateIoTFleet,
460
+ ],
461
+ read: [
462
+ Permission.ProjectOwner,
463
+ Permission.ProjectAdmin,
464
+ Permission.ProjectMember,
465
+ Permission.Viewer,
466
+ Permission.SettingsAdmin,
467
+ Permission.SettingsMember,
468
+ Permission.SettingsViewer,
469
+ Permission.ReadIoTFleet,
470
+ ],
471
+ update: [],
472
+ })
473
+ @TableColumn({
474
+ manyToOneRelationColumn: "createdByUserId",
475
+ type: TableColumnType.Entity,
476
+ modelType: User,
477
+ title: "Created by User",
478
+ description:
479
+ "Relation to User who created this object (if this object was created by a User)",
480
+ })
481
+ @ManyToOne(
482
+ () => {
483
+ return User;
484
+ },
485
+ {
486
+ eager: false,
487
+ nullable: true,
488
+ onDelete: "SET NULL",
489
+ orphanedRowAction: "nullify",
490
+ },
491
+ )
492
+ @JoinColumn({ name: "createdByUserId" })
493
+ public createdByUser?: User = undefined;
494
+
495
+ @ColumnAccessControl({
496
+ create: [
497
+ Permission.ProjectOwner,
498
+ Permission.ProjectAdmin,
499
+ Permission.ProjectMember,
500
+ Permission.SettingsAdmin,
501
+ Permission.SettingsMember,
502
+ Permission.CreateIoTFleet,
503
+ ],
504
+ read: [
505
+ Permission.ProjectOwner,
506
+ Permission.ProjectAdmin,
507
+ Permission.ProjectMember,
508
+ Permission.Viewer,
509
+ Permission.SettingsAdmin,
510
+ Permission.SettingsMember,
511
+ Permission.SettingsViewer,
512
+ Permission.ReadIoTFleet,
513
+ ],
514
+ update: [],
515
+ })
516
+ @TableColumn({
517
+ type: TableColumnType.ObjectID,
518
+ title: "Created by User ID",
519
+ description:
520
+ "User ID who created this object (if this object was created by a User)",
521
+ })
522
+ @Column({
523
+ type: ColumnType.ObjectID,
524
+ nullable: true,
525
+ transformer: ObjectID.getDatabaseTransformer(),
526
+ })
527
+ public createdByUserId?: ObjectID = undefined;
528
+
529
+ @ColumnAccessControl({
530
+ create: [
531
+ Permission.ProjectOwner,
532
+ Permission.ProjectAdmin,
533
+ Permission.ProjectMember,
534
+ Permission.SettingsAdmin,
535
+ Permission.SettingsMember,
536
+ Permission.CreateIoTFleet,
537
+ ],
538
+ read: [
539
+ Permission.ProjectOwner,
540
+ Permission.ProjectAdmin,
541
+ Permission.ProjectMember,
542
+ Permission.Viewer,
543
+ Permission.SettingsAdmin,
544
+ Permission.SettingsMember,
545
+ Permission.SettingsViewer,
546
+ Permission.ReadIoTFleet,
547
+ ],
548
+ update: [
549
+ Permission.ProjectOwner,
550
+ Permission.ProjectAdmin,
551
+ Permission.ProjectMember,
552
+ Permission.SettingsAdmin,
553
+ Permission.SettingsMember,
554
+ Permission.EditIoTFleet,
555
+ ],
556
+ })
557
+ @TableColumn({
558
+ isDefaultValueColumn: true,
559
+ required: true,
560
+ type: TableColumnType.Boolean,
561
+ title: "Is Archived",
562
+ description:
563
+ "Is this IoT fleet archived? Archived IoT fleets are hidden from lists but keep collecting telemetry.",
564
+ defaultValue: false,
565
+ })
566
+ @Column({
567
+ type: ColumnType.Boolean,
568
+ nullable: false,
569
+ default: false,
570
+ })
571
+ public isArchived?: boolean = undefined;
572
+
573
+ @ColumnAccessControl({
574
+ create: [],
575
+ read: [
576
+ Permission.ProjectOwner,
577
+ Permission.ProjectAdmin,
578
+ Permission.ProjectMember,
579
+ Permission.Viewer,
580
+ Permission.SettingsAdmin,
581
+ Permission.SettingsMember,
582
+ Permission.SettingsViewer,
583
+ Permission.ReadIoTFleet,
584
+ ],
585
+ update: [],
586
+ })
587
+ @TableColumn({
588
+ required: false,
589
+ type: TableColumnType.Date,
590
+ title: "Archived At",
591
+ description: "When was this IoT fleet archived?",
592
+ })
593
+ @Column({
594
+ type: ColumnType.Date,
595
+ nullable: true,
596
+ })
597
+ public archivedAt?: Date = undefined;
598
+
599
+ @ColumnAccessControl({
600
+ create: [],
601
+ read: [
602
+ Permission.ProjectOwner,
603
+ Permission.ProjectAdmin,
604
+ Permission.ProjectMember,
605
+ Permission.Viewer,
606
+ Permission.SettingsAdmin,
607
+ Permission.SettingsMember,
608
+ Permission.SettingsViewer,
609
+ Permission.ReadIoTFleet,
610
+ ],
611
+ update: [],
612
+ })
613
+ @TableColumn({
614
+ manyToOneRelationColumn: "archivedByUserId",
615
+ type: TableColumnType.Entity,
616
+ modelType: User,
617
+ title: "Archived by User",
618
+ description:
619
+ "Relation to User who archived this object (if this object was archived by a User)",
620
+ })
621
+ @ManyToOne(
622
+ () => {
623
+ return User;
624
+ },
625
+ {
626
+ eager: false,
627
+ nullable: true,
628
+ onDelete: "SET NULL",
629
+ orphanedRowAction: "nullify",
630
+ },
631
+ )
632
+ @JoinColumn({ name: "archivedByUserId" })
633
+ public archivedByUser?: User = undefined;
634
+
635
+ @ColumnAccessControl({
636
+ create: [],
637
+ read: [
638
+ Permission.ProjectOwner,
639
+ Permission.ProjectAdmin,
640
+ Permission.ProjectMember,
641
+ Permission.Viewer,
642
+ Permission.SettingsAdmin,
643
+ Permission.SettingsMember,
644
+ Permission.SettingsViewer,
645
+ Permission.ReadIoTFleet,
646
+ ],
647
+ update: [],
648
+ })
649
+ @TableColumn({
650
+ type: TableColumnType.ObjectID,
651
+ title: "Archived by User ID",
652
+ description:
653
+ "User ID who archived this object (if this object was archived by a User)",
654
+ })
655
+ @Column({
656
+ type: ColumnType.ObjectID,
657
+ nullable: true,
658
+ transformer: ObjectID.getDatabaseTransformer(),
659
+ })
660
+ public archivedByUserId?: ObjectID = undefined;
661
+
662
+ @ColumnAccessControl({
663
+ create: [],
664
+ read: [
665
+ Permission.ProjectOwner,
666
+ Permission.ProjectAdmin,
667
+ Permission.ProjectMember,
668
+ Permission.Viewer,
669
+ Permission.SettingsAdmin,
670
+ Permission.SettingsMember,
671
+ Permission.SettingsViewer,
672
+ Permission.ReadIoTFleet,
673
+ ],
674
+ update: [],
675
+ })
676
+ @TableColumn({
677
+ manyToOneRelationColumn: "deletedByUserId",
678
+ type: TableColumnType.Entity,
679
+ title: "Deleted by User",
680
+ modelType: User,
681
+ description:
682
+ "Relation to User who deleted this object (if this object was deleted by a User)",
683
+ })
684
+ @ManyToOne(
685
+ () => {
686
+ return User;
687
+ },
688
+ {
689
+ cascade: false,
690
+ eager: false,
691
+ nullable: true,
692
+ onDelete: "SET NULL",
693
+ orphanedRowAction: "nullify",
694
+ },
695
+ )
696
+ @JoinColumn({ name: "deletedByUserId" })
697
+ public deletedByUser?: User = undefined;
698
+
699
+ @ColumnAccessControl({
700
+ create: [],
701
+ read: [
702
+ Permission.ProjectOwner,
703
+ Permission.ProjectAdmin,
704
+ Permission.ProjectMember,
705
+ Permission.Viewer,
706
+ Permission.SettingsAdmin,
707
+ Permission.SettingsMember,
708
+ Permission.SettingsViewer,
709
+ Permission.ReadIoTFleet,
710
+ ],
711
+ update: [],
712
+ })
713
+ @TableColumn({
714
+ type: TableColumnType.ObjectID,
715
+ title: "Deleted by User ID",
716
+ description:
717
+ "User ID who deleted this object (if this object was deleted by a User)",
718
+ })
719
+ @Column({
720
+ type: ColumnType.ObjectID,
721
+ nullable: true,
722
+ transformer: ObjectID.getDatabaseTransformer(),
723
+ })
724
+ public deletedByUserId?: ObjectID = undefined;
725
+
726
+ @ColumnAccessControl({
727
+ create: [
728
+ Permission.ProjectOwner,
729
+ Permission.ProjectAdmin,
730
+ Permission.ProjectMember,
731
+ Permission.SettingsAdmin,
732
+ Permission.SettingsMember,
733
+ Permission.CreateIoTFleet,
734
+ ],
735
+ read: [
736
+ Permission.ProjectOwner,
737
+ Permission.ProjectAdmin,
738
+ Permission.ProjectMember,
739
+ Permission.Viewer,
740
+ Permission.SettingsAdmin,
741
+ Permission.SettingsMember,
742
+ Permission.SettingsViewer,
743
+ Permission.ReadIoTFleet,
744
+ ],
745
+ update: [
746
+ Permission.ProjectOwner,
747
+ Permission.ProjectAdmin,
748
+ Permission.ProjectMember,
749
+ Permission.SettingsAdmin,
750
+ Permission.SettingsMember,
751
+ Permission.EditIoTFleet,
752
+ ],
753
+ })
754
+ @TableColumn({
755
+ required: false,
756
+ type: TableColumnType.EntityArray,
757
+ modelType: Label,
758
+ title: "Labels",
759
+ description:
760
+ "Relation to Labels Array where this object is categorized in.",
761
+ })
762
+ @ManyToMany(
763
+ () => {
764
+ return Label;
765
+ },
766
+ { eager: false },
767
+ )
768
+ @JoinTable({
769
+ name: "IoTFleetLabel",
770
+ inverseJoinColumn: {
771
+ name: "labelId",
772
+ referencedColumnName: "_id",
773
+ },
774
+ joinColumn: {
775
+ name: "iotFleetId",
776
+ referencedColumnName: "_id",
777
+ },
778
+ })
779
+ public labels?: Array<Label> = undefined;
780
+
781
+ @ColumnAccessControl({
782
+ create: [
783
+ Permission.ProjectOwner,
784
+ Permission.ProjectAdmin,
785
+ Permission.ProjectMember,
786
+ Permission.SettingsAdmin,
787
+ Permission.SettingsMember,
788
+ Permission.CreateIoTFleet,
789
+ ],
790
+ read: [
791
+ Permission.ProjectOwner,
792
+ Permission.ProjectAdmin,
793
+ Permission.ProjectMember,
794
+ Permission.Viewer,
795
+ Permission.SettingsAdmin,
796
+ Permission.SettingsMember,
797
+ Permission.SettingsViewer,
798
+ Permission.ReadIoTFleet,
799
+ ],
800
+ update: [
801
+ Permission.ProjectOwner,
802
+ Permission.ProjectAdmin,
803
+ Permission.ProjectMember,
804
+ Permission.SettingsAdmin,
805
+ Permission.SettingsMember,
806
+ Permission.EditIoTFleet,
807
+ ],
808
+ })
809
+ @TableColumn({
810
+ type: TableColumnType.Number,
811
+ title: "Retain Telemetry Data For Days",
812
+ description:
813
+ "Number of days to retain telemetry data for this IoT fleet. Leave blank to use the project-wide default.",
814
+ })
815
+ @Column({
816
+ type: ColumnType.Number,
817
+ nullable: true,
818
+ unique: false,
819
+ })
820
+ public retainTelemetryDataForDays?: number = undefined;
821
+
822
+ @ColumnAccessControl({
823
+ create: [
824
+ Permission.ProjectOwner,
825
+ Permission.ProjectAdmin,
826
+ Permission.ProjectMember,
827
+ Permission.SettingsAdmin,
828
+ Permission.SettingsMember,
829
+ Permission.CreateIoTFleet,
830
+ ],
831
+ read: [
832
+ Permission.ProjectOwner,
833
+ Permission.ProjectAdmin,
834
+ Permission.ProjectMember,
835
+ Permission.Viewer,
836
+ Permission.SettingsAdmin,
837
+ Permission.SettingsMember,
838
+ Permission.SettingsViewer,
839
+ Permission.ReadIoTFleet,
840
+ ],
841
+ update: [
842
+ Permission.ProjectOwner,
843
+ Permission.ProjectAdmin,
844
+ Permission.ProjectMember,
845
+ Permission.SettingsAdmin,
846
+ Permission.SettingsMember,
847
+ Permission.EditIoTFleet,
848
+ ],
849
+ })
850
+ @TableColumn({
851
+ type: TableColumnType.JSON,
852
+ required: false,
853
+ title: "Telemetry Data Retention Overrides",
854
+ description:
855
+ "Per-pillar retention overrides for this IoT fleet (logs by severity, traces by status, metrics, profiles). Unset fields fall back to the IoT fleet default, then the project's retention settings.",
856
+ })
857
+ @Column({
858
+ type: ColumnType.JSON,
859
+ nullable: true,
860
+ })
861
+ public telemetryRetentionConfig?: TelemetryRetentionConfig = undefined;
862
+ }