@oneuptime/common 10.0.93 → 10.0.94
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.
- package/Models/DatabaseModels/DockerResource.ts +497 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/Monitor.ts +83 -0
- package/Server/API/MonitorTemplateAPI.ts +182 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1777933061000-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1777972687018-MigrationName.ts +69 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Services/BillingInvoiceService.ts +18 -29
- package/Server/Services/DockerResourceService.ts +310 -0
- package/Server/Services/MonitorTemplateService.ts +359 -0
- package/Types/Dashboard/DashboardComponentType.ts +13 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +16 -0
- package/Types/Dashboard/DashboardComponents/DashboardAlertListComponent.ts +4 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerContainerListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerHostListComponent.ts +14 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerImageListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerNetworkListComponent.ts +14 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerVolumeListComponent.ts +14 -0
- package/Types/Dashboard/DashboardComponents/DashboardIncidentListComponent.ts +4 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesCronJobListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesDaemonSetListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesDeploymentListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesJobListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesNamespaceListComponent.ts +14 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesNodeListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesPodListComponent.ts +16 -0
- package/Types/Dashboard/DashboardComponents/DashboardKubernetesStatefulSetListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +3 -0
- package/Types/Docker/DockerInventoryExtractor.ts +343 -0
- package/Utils/Dashboard/Components/DashboardAlertListComponent.ts +47 -2
- package/Utils/Dashboard/Components/DashboardDockerContainerListComponent.ts +93 -0
- package/Utils/Dashboard/Components/DashboardDockerHostListComponent.ts +83 -0
- package/Utils/Dashboard/Components/DashboardDockerImageListComponent.ts +92 -0
- package/Utils/Dashboard/Components/DashboardDockerNetworkListComponent.ts +82 -0
- package/Utils/Dashboard/Components/DashboardDockerVolumeListComponent.ts +82 -0
- package/Utils/Dashboard/Components/DashboardIncidentListComponent.ts +47 -2
- package/Utils/Dashboard/Components/DashboardKubernetesCronJobListComponent.ts +36 -0
- package/Utils/Dashboard/Components/DashboardKubernetesDaemonSetListComponent.ts +36 -0
- package/Utils/Dashboard/Components/DashboardKubernetesDeploymentListComponent.ts +36 -0
- package/Utils/Dashboard/Components/DashboardKubernetesJobListComponent.ts +34 -0
- package/Utils/Dashboard/Components/DashboardKubernetesNamespaceListComponent.ts +36 -0
- package/Utils/Dashboard/Components/DashboardKubernetesNodeListComponent.ts +57 -0
- package/Utils/Dashboard/Components/DashboardKubernetesPodListComponent.ts +60 -0
- package/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.ts +75 -0
- package/Utils/Dashboard/Components/DashboardKubernetesStatefulSetListComponent.ts +36 -0
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +59 -2
- package/Utils/Dashboard/Components/Index.ts +102 -0
- package/build/dist/Models/DatabaseModels/DockerResource.js +525 -0
- package/build/dist/Models/DatabaseModels/DockerResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +82 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Server/API/MonitorTemplateAPI.js +108 -0
- package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1777933061000-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1777933061000-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1777972687018-MigrationName.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1777972687018-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/BillingInvoiceService.js +22 -25
- package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
- package/build/dist/Server/Services/DockerResourceService.js +196 -0
- package/build/dist/Server/Services/DockerResourceService.js.map +1 -0
- package/build/dist/Server/Services/MonitorTemplateService.js +290 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +13 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +15 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerContainerListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerContainerListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerImageListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerImageListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerNetworkListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerNetworkListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerVolumeListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerVolumeListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesCronJobListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesCronJobListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesDaemonSetListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesDaemonSetListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesDeploymentListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesDeploymentListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesJobListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesJobListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesNamespaceListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesNamespaceListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesNodeListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesNodeListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesPodListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesPodListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesStatefulSetListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesStatefulSetListComponent.js.map +1 -0
- package/build/dist/Types/Docker/DockerInventoryExtractor.js +293 -0
- package/build/dist/Types/Docker/DockerInventoryExtractor.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardAlertListComponent.js +43 -3
- package/build/dist/Utils/Dashboard/Components/DashboardAlertListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDockerContainerListComponent.js +75 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerContainerListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerHostListComponent.js +69 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerImageListComponent.js +75 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerImageListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerNetworkListComponent.js +66 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerNetworkListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerVolumeListComponent.js +66 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerVolumeListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardIncidentListComponent.js +43 -3
- package/build/dist/Utils/Dashboard/Components/DashboardIncidentListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesCronJobListComponent.js +29 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesCronJobListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesDaemonSetListComponent.js +29 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesDaemonSetListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesDeploymentListComponent.js +29 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesDeploymentListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesJobListComponent.js +29 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesJobListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesNamespaceListComponent.js +29 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesNamespaceListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesNodeListComponent.js +44 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesNodeListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesPodListComponent.js +47 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesPodListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.js +55 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesStatefulSetListComponent.js +29 -0
- package/build/dist/Utils/Dashboard/Components/DashboardKubernetesStatefulSetListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +46 -3
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/Index.js +53 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesCronJobListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesCronJobListComponent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesDaemonSetListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesDaemonSetListComponent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesDeploymentListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesDeploymentListComponent.ts"],"names":[],"mappings":""}
|
package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesJobListComponent.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesJobListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesJobListComponent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesNamespaceListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesNamespaceListComponent.ts"],"names":[],"mappings":""}
|
package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesNodeListComponent.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesNodeListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesNodeListComponent.ts"],"names":[],"mappings":""}
|
package/build/dist/Types/Dashboard/DashboardComponents/DashboardKubernetesPodListComponent.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesPodListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesPodListComponent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardKubernetesStatefulSetListComponent.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/DashboardKubernetesStatefulSetListComponent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import OneUptimeDate from "../Date";
|
|
2
|
+
/*
|
|
3
|
+
* ------------------------------------------------------------------
|
|
4
|
+
* DockerInventoryExtractor
|
|
5
|
+
* ------------------------------------------------------------------
|
|
6
|
+
*
|
|
7
|
+
* Parses a single inventory log record emitted by the OneUptime
|
|
8
|
+
* Docker Agent's snapshot script. The script polls the local Docker
|
|
9
|
+
* daemon every 5 minutes for containers / images / networks /
|
|
10
|
+
* volumes and emits one JSON object per line into a log file that
|
|
11
|
+
* the OTel filelog receiver forwards as an OTLP log.
|
|
12
|
+
*
|
|
13
|
+
* The agreed wire format is a JSON envelope:
|
|
14
|
+
*
|
|
15
|
+
* {
|
|
16
|
+
* "kind": "Container" | "Image" | "Network" | "Volume",
|
|
17
|
+
* "data": { ...native docker payload... }
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* The kind discriminator is set as a log record attribute by the
|
|
21
|
+
* agent's filelog operator chain, but we also keep it inside the
|
|
22
|
+
* envelope so the parser can sanity-check.
|
|
23
|
+
*
|
|
24
|
+
* Each kind has a small dedicated parser that pulls out the fields
|
|
25
|
+
* we promote to first-class columns on `DockerResource` (name,
|
|
26
|
+
* containerId, imageName, state, labels, creation timestamp). The
|
|
27
|
+
* full payload is *not* persisted — it lives on the original log
|
|
28
|
+
* record in ClickHouse if a user ever needs the raw blob.
|
|
29
|
+
*
|
|
30
|
+
* ------------------------------------------------------------------
|
|
31
|
+
*/
|
|
32
|
+
export const INVENTORY_KIND_ATTRIBUTE = "oneuptime.docker.kind";
|
|
33
|
+
export const INVENTORIED_DOCKER_KINDS = [
|
|
34
|
+
"Container",
|
|
35
|
+
"Image",
|
|
36
|
+
"Network",
|
|
37
|
+
"Volume",
|
|
38
|
+
];
|
|
39
|
+
const INVENTORIED_KIND_SET = new Set(INVENTORIED_DOCKER_KINDS.map((k) => {
|
|
40
|
+
return k.toLowerCase();
|
|
41
|
+
}));
|
|
42
|
+
export function isInventoriedDockerKind(kind) {
|
|
43
|
+
return INVENTORIED_KIND_SET.has(kind.toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
/*
|
|
46
|
+
* Map a kind in any common form (lowercase plural, lowercase
|
|
47
|
+
* singular, or PascalCase) to the canonical PascalCase kind we store
|
|
48
|
+
* in the database. Returns null for anything we don't model.
|
|
49
|
+
*/
|
|
50
|
+
export function canonicalDockerKind(raw) {
|
|
51
|
+
const trimmed = (raw || "").trim().toLowerCase();
|
|
52
|
+
if (!trimmed) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const map = {
|
|
56
|
+
container: "Container",
|
|
57
|
+
containers: "Container",
|
|
58
|
+
image: "Image",
|
|
59
|
+
images: "Image",
|
|
60
|
+
network: "Network",
|
|
61
|
+
networks: "Network",
|
|
62
|
+
volume: "Volume",
|
|
63
|
+
volumes: "Volume",
|
|
64
|
+
};
|
|
65
|
+
return map[trimmed] || null;
|
|
66
|
+
}
|
|
67
|
+
function parseLogBody(logBody) {
|
|
68
|
+
try {
|
|
69
|
+
const parsed = JSON.parse(logBody);
|
|
70
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
71
|
+
return parsed;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
catch (_a) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function readString(obj, key) {
|
|
80
|
+
const v = obj[key];
|
|
81
|
+
if (typeof v === "string" && v.trim().length > 0) {
|
|
82
|
+
return v.trim();
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function readJSONObject(obj, key) {
|
|
87
|
+
const v = obj[key];
|
|
88
|
+
if (v && typeof v === "object" && !Array.isArray(v)) {
|
|
89
|
+
return v;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function parseTimestamp(raw) {
|
|
94
|
+
if (!raw) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
const d = OneUptimeDate.fromString(raw);
|
|
99
|
+
if (isNaN(d.getTime())) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
return d;
|
|
103
|
+
}
|
|
104
|
+
catch (_a) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/*
|
|
109
|
+
* Container shape emitted by `docker container ls --format json` plus
|
|
110
|
+
* a few enrichments the agent script adds:
|
|
111
|
+
* { Id, Names, Image, State, Status, CreatedAt, Labels }
|
|
112
|
+
*
|
|
113
|
+
* Names from the Docker CLI is a slash-prefixed comma-joined string
|
|
114
|
+
* ("/web,/web-1"). We strip the leading slash and take the first
|
|
115
|
+
* entry — that's what `docker_stats` reports as `container.name` in
|
|
116
|
+
* metric attributes, so the row keys stay consistent across paths.
|
|
117
|
+
*/
|
|
118
|
+
function parseContainer(data, lastSeenAt) {
|
|
119
|
+
const rawNames = readString(data, "Names");
|
|
120
|
+
const rawName = readString(data, "Name");
|
|
121
|
+
const namesField = rawNames || rawName || "";
|
|
122
|
+
const firstName = namesField
|
|
123
|
+
.split(",")
|
|
124
|
+
.map((n) => {
|
|
125
|
+
return n.trim().replace(/^\//, "");
|
|
126
|
+
})
|
|
127
|
+
.filter((n) => {
|
|
128
|
+
return n.length > 0;
|
|
129
|
+
})[0];
|
|
130
|
+
if (!firstName) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
const idRaw = readString(data, "Id");
|
|
134
|
+
const containerId = idRaw ? idRaw.substring(0, 12) : null;
|
|
135
|
+
const imageName = readString(data, "Image");
|
|
136
|
+
const state = readString(data, "State");
|
|
137
|
+
const labels = readJSONObject(data, "Labels");
|
|
138
|
+
const created = parseTimestamp(readString(data, "CreatedAt"));
|
|
139
|
+
return {
|
|
140
|
+
kind: "Container",
|
|
141
|
+
name: firstName,
|
|
142
|
+
containerId,
|
|
143
|
+
imageName,
|
|
144
|
+
state: state ? state.toLowerCase() : null,
|
|
145
|
+
labels,
|
|
146
|
+
resourceCreationTimestamp: created,
|
|
147
|
+
lastSeenAt,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/*
|
|
151
|
+
* Image shape from `docker image ls --format json`:
|
|
152
|
+
* { ID, Repository, Tag, CreatedAt, Labels }
|
|
153
|
+
*
|
|
154
|
+
* Name = Repository:Tag (matches what container.image.name emits).
|
|
155
|
+
* Skip dangling images (Repository=<none> with no tag) — they would
|
|
156
|
+
* collide on the unique key and are noise in a list view.
|
|
157
|
+
*/
|
|
158
|
+
function parseImage(data, lastSeenAt) {
|
|
159
|
+
const repository = readString(data, "Repository");
|
|
160
|
+
const tag = readString(data, "Tag");
|
|
161
|
+
const explicitName = readString(data, "Name");
|
|
162
|
+
let name = explicitName;
|
|
163
|
+
if (!name && repository && repository !== "<none>") {
|
|
164
|
+
name = tag && tag !== "<none>" ? `${repository}:${tag}` : repository;
|
|
165
|
+
}
|
|
166
|
+
if (!name) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
const idRaw = readString(data, "ID") || readString(data, "Id");
|
|
170
|
+
const containerId = idRaw
|
|
171
|
+
? idRaw.replace(/^sha256:/, "").substring(0, 12)
|
|
172
|
+
: null;
|
|
173
|
+
const labels = readJSONObject(data, "Labels");
|
|
174
|
+
const created = parseTimestamp(readString(data, "CreatedAt"));
|
|
175
|
+
return {
|
|
176
|
+
kind: "Image",
|
|
177
|
+
name,
|
|
178
|
+
containerId,
|
|
179
|
+
imageName: null,
|
|
180
|
+
state: null,
|
|
181
|
+
labels,
|
|
182
|
+
resourceCreationTimestamp: created,
|
|
183
|
+
lastSeenAt,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/*
|
|
187
|
+
* Network shape from `docker network ls --format json`:
|
|
188
|
+
* { ID, Name, Driver, Scope, CreatedAt, Labels }
|
|
189
|
+
*/
|
|
190
|
+
function parseNetwork(data, lastSeenAt) {
|
|
191
|
+
const name = readString(data, "Name");
|
|
192
|
+
if (!name) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const idRaw = readString(data, "ID") || readString(data, "Id");
|
|
196
|
+
const driver = readString(data, "Driver");
|
|
197
|
+
const scope = readString(data, "Scope");
|
|
198
|
+
const labels = readJSONObject(data, "Labels");
|
|
199
|
+
const created = parseTimestamp(readString(data, "CreatedAt"));
|
|
200
|
+
/*
|
|
201
|
+
* Driver and scope are surfaced in the State column in the widget
|
|
202
|
+
* (e.g. "bridge / local"). Encoded as "driver/scope" so we don't
|
|
203
|
+
* need a new column on the table.
|
|
204
|
+
*/
|
|
205
|
+
const stateParts = [];
|
|
206
|
+
if (driver) {
|
|
207
|
+
stateParts.push(driver);
|
|
208
|
+
}
|
|
209
|
+
if (scope) {
|
|
210
|
+
stateParts.push(scope);
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
kind: "Network",
|
|
214
|
+
name,
|
|
215
|
+
containerId: idRaw ? idRaw.substring(0, 12) : null,
|
|
216
|
+
imageName: null,
|
|
217
|
+
state: stateParts.length > 0 ? stateParts.join("/") : null,
|
|
218
|
+
labels,
|
|
219
|
+
resourceCreationTimestamp: created,
|
|
220
|
+
lastSeenAt,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/*
|
|
224
|
+
* Volume shape from `docker volume ls --format json`:
|
|
225
|
+
* { Name, Driver, Mountpoint, Scope, Labels, CreatedAt }
|
|
226
|
+
*/
|
|
227
|
+
function parseVolume(data, lastSeenAt) {
|
|
228
|
+
const name = readString(data, "Name");
|
|
229
|
+
if (!name) {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
const driver = readString(data, "Driver");
|
|
233
|
+
const scope = readString(data, "Scope");
|
|
234
|
+
const labels = readJSONObject(data, "Labels");
|
|
235
|
+
const created = parseTimestamp(readString(data, "CreatedAt"));
|
|
236
|
+
const stateParts = [];
|
|
237
|
+
if (driver) {
|
|
238
|
+
stateParts.push(driver);
|
|
239
|
+
}
|
|
240
|
+
if (scope) {
|
|
241
|
+
stateParts.push(scope);
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
kind: "Volume",
|
|
245
|
+
name,
|
|
246
|
+
containerId: null,
|
|
247
|
+
imageName: null,
|
|
248
|
+
state: stateParts.length > 0 ? stateParts.join("/") : null,
|
|
249
|
+
labels,
|
|
250
|
+
resourceCreationTimestamp: created,
|
|
251
|
+
lastSeenAt,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Parse a single inventory log line. Returns null when the body is
|
|
256
|
+
* malformed or the kind is not modeled — callers should swallow nulls
|
|
257
|
+
* silently rather than fail the whole batch.
|
|
258
|
+
*/
|
|
259
|
+
export function extractDockerInventoryResource(data) {
|
|
260
|
+
const canonical = canonicalDockerKind(data.kind);
|
|
261
|
+
if (!canonical) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
const body = parseLogBody(data.logBody);
|
|
265
|
+
if (!body) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
/*
|
|
269
|
+
* The agent wraps the native docker payload in `{ kind, data }`.
|
|
270
|
+
* Older snapshot lines or test inputs may be the raw payload — we
|
|
271
|
+
* accept either by pulling `data` if present, else using the body
|
|
272
|
+
* directly.
|
|
273
|
+
*/
|
|
274
|
+
const inner = readJSONObject(body, "data") || body;
|
|
275
|
+
let parsed = null;
|
|
276
|
+
if (canonical === "Container") {
|
|
277
|
+
parsed = parseContainer(inner, data.lastSeenAt);
|
|
278
|
+
}
|
|
279
|
+
else if (canonical === "Image") {
|
|
280
|
+
parsed = parseImage(inner, data.lastSeenAt);
|
|
281
|
+
}
|
|
282
|
+
else if (canonical === "Network") {
|
|
283
|
+
parsed = parseNetwork(inner, data.lastSeenAt);
|
|
284
|
+
}
|
|
285
|
+
else if (canonical === "Volume") {
|
|
286
|
+
parsed = parseVolume(inner, data.lastSeenAt);
|
|
287
|
+
}
|
|
288
|
+
if (!parsed) {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
return { resource: parsed };
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=DockerInventoryExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerInventoryExtractor.js","sourceRoot":"","sources":["../../../../Types/Docker/DockerInventoryExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,SAAS,CAAC;AAIpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAW,uBAAuB,CAAC;AAExE,MAAM,CAAC,MAAM,wBAAwB,GAA0B;IAC7D,WAAW;IACX,OAAO;IACP,SAAS;IACT,QAAQ;CACT,CAAC;AAEF,MAAM,oBAAoB,GAAgB,IAAI,GAAG,CAC/C,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE;IACzC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAAW,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAA2B;QAClC,SAAS,EAAE,WAAW;QACtB,UAAU,EAAE,WAAW;QACvB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,QAAQ;KAClB,CAAC;IACF,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,OAAO,MAAoB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAe,EAAE,GAAW;IAC9C,MAAM,CAAC,GAAY,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,GAAe,EAAE,GAAW;IAClD,MAAM,CAAC,GAAY,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,CAAe,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,GAAkB;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAS,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,cAAc,CACrB,IAAgB,EAChB,UAAgB;IAEhB,MAAM,QAAQ,GAAkB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAkB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,UAAU,GAAW,QAAQ,IAAI,OAAO,IAAI,EAAE,CAAC;IACrD,MAAM,SAAS,GAAW,UAAU;SACjC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE;QACjB,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE;QACpB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IAET,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAkB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,WAAW,GAAkB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,SAAS,GAAkB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAkB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,OAAO,GAAgB,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,WAAW;QACX,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;QACzC,MAAM;QACN,yBAAyB,EAAE,OAAO;QAClC,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,UAAU,CACjB,IAAgB,EAChB,UAAgB;IAEhB,MAAM,UAAU,GAAkB,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACjE,MAAM,GAAG,GAAkB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,YAAY,GAAkB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE7D,IAAI,IAAI,GAAkB,YAAY,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,UAAU,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnD,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAkB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAkB,KAAK;QACtC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAChD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,OAAO,GAAgB,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI;QACJ,WAAW;QACX,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI;QACX,MAAM;QACN,yBAAyB,EAAE,OAAO;QAClC,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,IAAgB,EAChB,UAAgB;IAEhB,MAAM,IAAI,GAAkB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAkB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAkB,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAkB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,OAAO,GAAgB,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3E;;;;OAIG;IACH,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAClD,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1D,MAAM;QACN,yBAAyB,EAAE,OAAO;QAClC,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAClB,IAAgB,EAChB,UAAgB;IAEhB,MAAM,IAAI,GAAkB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAkB,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAkB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,OAAO,GAAgB,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1D,MAAM;QACN,yBAAyB,EAAE,OAAO;QAClC,UAAU;KACX,CAAC;AACJ,CAAC;AAMD;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAI9C;IACC,MAAM,SAAS,GAAkB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAsB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,MAAM,KAAK,GACR,cAAc,CAAC,IAAI,EAAE,MAAM,CAAgB,IAAI,IAAI,CAAC;IAEvD,IAAI,MAAM,GAAgC,IAAI,CAAC;IAC/C,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ObjectType } from "../../../Types/JSON";
|
|
2
2
|
import ObjectID from "../../../Types/ObjectID";
|
|
3
3
|
import DashboardBaseComponentUtil from "./DashboardBaseComponent";
|
|
4
|
-
import { ComponentInputType, } from "../../../Types/Dashboard/DashboardComponents/ComponentArgument";
|
|
4
|
+
import { ComponentInputType, EntityFilterModelType, } from "../../../Types/Dashboard/DashboardComponents/ComponentArgument";
|
|
5
5
|
import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
|
|
6
6
|
const DisplaySection = {
|
|
7
7
|
name: "Display Options",
|
|
@@ -51,8 +51,8 @@ export default class DashboardAlertListComponentUtil extends DashboardBaseCompon
|
|
|
51
51
|
section: DisplaySection,
|
|
52
52
|
});
|
|
53
53
|
componentArguments.push({
|
|
54
|
-
name: "State",
|
|
55
|
-
description: "
|
|
54
|
+
name: "Lifecycle State",
|
|
55
|
+
description: "Quick filter by lifecycle state",
|
|
56
56
|
required: false,
|
|
57
57
|
type: ComponentInputType.Dropdown,
|
|
58
58
|
id: "stateFilter",
|
|
@@ -64,6 +64,46 @@ export default class DashboardAlertListComponentUtil extends DashboardBaseCompon
|
|
|
64
64
|
{ label: "Resolved", value: "resolved" },
|
|
65
65
|
],
|
|
66
66
|
});
|
|
67
|
+
componentArguments.push({
|
|
68
|
+
name: "Severity",
|
|
69
|
+
description: "Show only alerts matching the selected severities",
|
|
70
|
+
required: false,
|
|
71
|
+
type: ComponentInputType.EntityMultiSelectDropdown,
|
|
72
|
+
id: "severityIds",
|
|
73
|
+
placeholder: "All severities",
|
|
74
|
+
section: FiltersSection,
|
|
75
|
+
entityFilterModelType: EntityFilterModelType.AlertSeverity,
|
|
76
|
+
});
|
|
77
|
+
componentArguments.push({
|
|
78
|
+
name: "State",
|
|
79
|
+
description: "Show only alerts in the selected states",
|
|
80
|
+
required: false,
|
|
81
|
+
type: ComponentInputType.EntityMultiSelectDropdown,
|
|
82
|
+
id: "stateIds",
|
|
83
|
+
placeholder: "All states",
|
|
84
|
+
section: FiltersSection,
|
|
85
|
+
entityFilterModelType: EntityFilterModelType.AlertState,
|
|
86
|
+
});
|
|
87
|
+
componentArguments.push({
|
|
88
|
+
name: "Monitors",
|
|
89
|
+
description: "Show only alerts linked to the selected monitors",
|
|
90
|
+
required: false,
|
|
91
|
+
type: ComponentInputType.EntityMultiSelectDropdown,
|
|
92
|
+
id: "monitorIds",
|
|
93
|
+
placeholder: "All monitors",
|
|
94
|
+
section: FiltersSection,
|
|
95
|
+
entityFilterModelType: EntityFilterModelType.Monitor,
|
|
96
|
+
});
|
|
97
|
+
componentArguments.push({
|
|
98
|
+
name: "Labels",
|
|
99
|
+
description: "Show only alerts tagged with the selected labels",
|
|
100
|
+
required: false,
|
|
101
|
+
type: ComponentInputType.EntityMultiSelectDropdown,
|
|
102
|
+
id: "labelIds",
|
|
103
|
+
placeholder: "All labels",
|
|
104
|
+
section: FiltersSection,
|
|
105
|
+
entityFilterModelType: EntityFilterModelType.Label,
|
|
106
|
+
});
|
|
67
107
|
return componentArguments;
|
|
68
108
|
}
|
|
69
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardAlertListComponent.js","sourceRoot":"","sources":["../../../../../Utils/Dashboard/Components/DashboardAlertListComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,0BAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAGL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"DashboardAlertListComponent.js","sourceRoot":"","sources":["../../../../../Utils/Dashboard/Components/DashboardAlertListComponent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ObjectType } from "../../../Types/JSON";
|
|
2
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
3
|
+
import DashboardBaseComponentUtil from "./DashboardBaseComponent";
|
|
4
|
+
import { ComponentInputType, EntityFilterModelType, } from "../../../Types/Dashboard/DashboardComponents/ComponentArgument";
|
|
5
|
+
import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
|
|
6
|
+
const DisplaySection = {
|
|
7
|
+
name: "Display Options",
|
|
8
|
+
description: "Configure the widget title and row limit",
|
|
9
|
+
order: 1,
|
|
10
|
+
};
|
|
11
|
+
const FiltersSection = {
|
|
12
|
+
name: "Filters",
|
|
13
|
+
description: "Narrow down which containers are shown",
|
|
14
|
+
order: 2,
|
|
15
|
+
defaultCollapsed: true,
|
|
16
|
+
};
|
|
17
|
+
export default class DashboardDockerContainerListComponentUtil extends DashboardBaseComponentUtil {
|
|
18
|
+
static getDefaultComponent() {
|
|
19
|
+
return {
|
|
20
|
+
_type: ObjectType.DashboardComponent,
|
|
21
|
+
componentType: DashboardComponentType.DockerContainerList,
|
|
22
|
+
widthInDashboardUnits: 6,
|
|
23
|
+
heightInDashboardUnits: 4,
|
|
24
|
+
topInDashboardUnits: 0,
|
|
25
|
+
leftInDashboardUnits: 0,
|
|
26
|
+
componentId: ObjectID.generate(),
|
|
27
|
+
minHeightInDashboardUnits: 3,
|
|
28
|
+
minWidthInDashboardUnits: 6,
|
|
29
|
+
arguments: {
|
|
30
|
+
maxRows: 25,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
static getComponentConfigArguments() {
|
|
35
|
+
const args = [];
|
|
36
|
+
args.push({
|
|
37
|
+
name: "Title",
|
|
38
|
+
description: "Header shown above the container list",
|
|
39
|
+
required: false,
|
|
40
|
+
type: ComponentInputType.Text,
|
|
41
|
+
id: "title",
|
|
42
|
+
section: DisplaySection,
|
|
43
|
+
});
|
|
44
|
+
args.push({
|
|
45
|
+
name: "Max Rows",
|
|
46
|
+
description: "Maximum number of containers to show",
|
|
47
|
+
required: false,
|
|
48
|
+
type: ComponentInputType.Number,
|
|
49
|
+
id: "maxRows",
|
|
50
|
+
placeholder: "25",
|
|
51
|
+
section: DisplaySection,
|
|
52
|
+
});
|
|
53
|
+
args.push({
|
|
54
|
+
name: "Hosts",
|
|
55
|
+
description: "Show only containers from the selected hosts",
|
|
56
|
+
required: false,
|
|
57
|
+
type: ComponentInputType.EntityMultiSelectDropdown,
|
|
58
|
+
id: "dockerHostIds",
|
|
59
|
+
placeholder: "All hosts",
|
|
60
|
+
section: FiltersSection,
|
|
61
|
+
entityFilterModelType: EntityFilterModelType.DockerHost,
|
|
62
|
+
});
|
|
63
|
+
args.push({
|
|
64
|
+
name: "Image Name",
|
|
65
|
+
description: "Substring of the container image to match (e.g. nginx)",
|
|
66
|
+
required: false,
|
|
67
|
+
type: ComponentInputType.Text,
|
|
68
|
+
id: "imageName",
|
|
69
|
+
placeholder: "nginx",
|
|
70
|
+
section: FiltersSection,
|
|
71
|
+
});
|
|
72
|
+
return args;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=DashboardDockerContainerListComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardDockerContainerListComponent.js","sourceRoot":"","sources":["../../../../../Utils/Dashboard/Components/DashboardDockerContainerListComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,0BAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAGL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,gEAAgE,CAAC;AACxE,OAAO,sBAAsB,MAAM,iDAAiD,CAAC;AAErF,MAAM,cAAc,GAA6B;IAC/C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,0CAA0C;IACvD,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,cAAc,GAA6B;IAC/C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,wCAAwC;IACrD,KAAK,EAAE,CAAC;IACR,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,yCAA0C,SAAQ,0BAA0B;IACxF,MAAM,CAAU,mBAAmB;QACxC,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,kBAAkB;YACpC,aAAa,EAAE,sBAAsB,CAAC,mBAAmB;YACzD,qBAAqB,EAAE,CAAC;YACxB,sBAAsB,EAAE,CAAC;YACzB,mBAAmB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;YACvB,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAChC,yBAAyB,EAAE,CAAC;YAC5B,wBAAwB,EAAE,CAAC;YAC3B,SAAS,EAAE;gBACT,OAAO,EAAE,EAAE;aACZ;SACF,CAAC;IACJ,CAAC;IAEM,MAAM,CAAU,2BAA2B;QAGhD,MAAM,IAAI,GAEN,EAAE,CAAC;QAEP,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,uCAAuC;YACpD,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,kBAAkB,CAAC,IAAI;YAC7B,EAAE,EAAE,OAAO;YACX,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,kBAAkB,CAAC,MAAM;YAC/B,EAAE,EAAE,SAAS;YACb,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,kBAAkB,CAAC,yBAAyB;YAClD,EAAE,EAAE,eAAe;YACnB,WAAW,EAAE,WAAW;YACxB,OAAO,EAAE,cAAc;YACvB,qBAAqB,EAAE,qBAAqB,CAAC,UAAU;SACxD,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,wDAAwD;YACrE,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,kBAAkB,CAAC,IAAI;YAC7B,EAAE,EAAE,WAAW;YACf,WAAW,EAAE,OAAO;YACpB,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ObjectType } from "../../../Types/JSON";
|
|
2
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
3
|
+
import DashboardBaseComponentUtil from "./DashboardBaseComponent";
|
|
4
|
+
import { ComponentInputType, } from "../../../Types/Dashboard/DashboardComponents/ComponentArgument";
|
|
5
|
+
import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
|
|
6
|
+
const DisplaySection = {
|
|
7
|
+
name: "Display Options",
|
|
8
|
+
description: "Configure the widget title and row limit",
|
|
9
|
+
order: 1,
|
|
10
|
+
};
|
|
11
|
+
const FiltersSection = {
|
|
12
|
+
name: "Filters",
|
|
13
|
+
description: "Narrow down which Docker hosts are shown",
|
|
14
|
+
order: 2,
|
|
15
|
+
defaultCollapsed: true,
|
|
16
|
+
};
|
|
17
|
+
export default class DashboardDockerHostListComponentUtil extends DashboardBaseComponentUtil {
|
|
18
|
+
static getDefaultComponent() {
|
|
19
|
+
return {
|
|
20
|
+
_type: ObjectType.DashboardComponent,
|
|
21
|
+
componentType: DashboardComponentType.DockerHostList,
|
|
22
|
+
widthInDashboardUnits: 6,
|
|
23
|
+
heightInDashboardUnits: 4,
|
|
24
|
+
topInDashboardUnits: 0,
|
|
25
|
+
leftInDashboardUnits: 0,
|
|
26
|
+
componentId: ObjectID.generate(),
|
|
27
|
+
minHeightInDashboardUnits: 3,
|
|
28
|
+
minWidthInDashboardUnits: 6,
|
|
29
|
+
arguments: {
|
|
30
|
+
maxRows: 25,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
static getComponentConfigArguments() {
|
|
35
|
+
const args = [];
|
|
36
|
+
args.push({
|
|
37
|
+
name: "Title",
|
|
38
|
+
description: "Header shown above the host list",
|
|
39
|
+
required: false,
|
|
40
|
+
type: ComponentInputType.Text,
|
|
41
|
+
id: "title",
|
|
42
|
+
section: DisplaySection,
|
|
43
|
+
});
|
|
44
|
+
args.push({
|
|
45
|
+
name: "Max Rows",
|
|
46
|
+
description: "Maximum number of hosts to show",
|
|
47
|
+
required: false,
|
|
48
|
+
type: ComponentInputType.Number,
|
|
49
|
+
id: "maxRows",
|
|
50
|
+
placeholder: "25",
|
|
51
|
+
section: DisplaySection,
|
|
52
|
+
});
|
|
53
|
+
args.push({
|
|
54
|
+
name: "Connection Status",
|
|
55
|
+
description: "Quick filter by OTel collector status",
|
|
56
|
+
required: false,
|
|
57
|
+
type: ComponentInputType.Dropdown,
|
|
58
|
+
id: "statusFilter",
|
|
59
|
+
section: FiltersSection,
|
|
60
|
+
dropdownOptions: [
|
|
61
|
+
{ label: "All", value: "" },
|
|
62
|
+
{ label: "Connected only", value: "connected" },
|
|
63
|
+
{ label: "Disconnected only", value: "disconnected" },
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
return args;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=DashboardDockerHostListComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardDockerHostListComponent.js","sourceRoot":"","sources":["../../../../../Utils/Dashboard/Components/DashboardDockerHostListComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,0BAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAGL,kBAAkB,GACnB,MAAM,gEAAgE,CAAC;AACxE,OAAO,sBAAsB,MAAM,iDAAiD,CAAC;AAErF,MAAM,cAAc,GAA6B;IAC/C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,0CAA0C;IACvD,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,cAAc,GAA6B;IAC/C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,0CAA0C;IACvD,KAAK,EAAE,CAAC;IACR,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,oCAAqC,SAAQ,0BAA0B;IACnF,MAAM,CAAU,mBAAmB;QACxC,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,kBAAkB;YACpC,aAAa,EAAE,sBAAsB,CAAC,cAAc;YACpD,qBAAqB,EAAE,CAAC;YACxB,sBAAsB,EAAE,CAAC;YACzB,mBAAmB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;YACvB,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAChC,yBAAyB,EAAE,CAAC;YAC5B,wBAAwB,EAAE,CAAC;YAC3B,SAAS,EAAE;gBACT,OAAO,EAAE,EAAE;aACZ;SACF,CAAC;IACJ,CAAC;IAEM,MAAM,CAAU,2BAA2B;QAGhD,MAAM,IAAI,GAA+D,EAAE,CAAC;QAE5E,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,kBAAkB,CAAC,IAAI;YAC7B,EAAE,EAAE,OAAO;YACX,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,kBAAkB,CAAC,MAAM;YAC/B,EAAE,EAAE,SAAS;YACb,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,uCAAuC;YACpD,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,kBAAkB,CAAC,QAAQ;YACjC,EAAE,EAAE,cAAc;YAClB,OAAO,EAAE,cAAc;YACvB,eAAe,EAAE;gBACf,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC3B,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC/C,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,EAAE;aACtD;SACF,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|