fix creationtime in aggregations
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-01-23 07:29:59 +11:00
parent 13adc159a2
commit 8a3481b966
9 changed files with 183 additions and 178 deletions

View File

@@ -574,7 +574,6 @@ WHERE EXISTS (
OR (l."VmUuid" IS NOT NULL AND %[1]s."VmUuid" IS NOT NULL AND l."VmUuid" = %[1]s."VmUuid")
OR (l."Name" IS NOT NULL AND %[1]s."Name" IS NOT NULL AND l."Name" = %[1]s."Name")
)
AND (%[1]s."DeletionTime" IS NULL OR %[1]s."DeletionTime" = 0 OR l."DeletedAt" < %[1]s."DeletionTime")
);
`, summaryTable)
bind := dbConn.Rebind(query)
@@ -589,6 +588,51 @@ WHERE EXISTS (
return rows, nil
}
// ApplyLifecycleCreationToSummary updates CreationTime values in a summary table from vm_lifecycle_cache.
func ApplyLifecycleCreationToSummary(ctx context.Context, dbConn *sqlx.DB, summaryTable string) (int64, error) {
if err := ValidateTableName(summaryTable); err != nil {
return 0, err
}
if err := EnsureVmLifecycleCache(ctx, dbConn); err != nil {
return 0, err
}
query := fmt.Sprintf(`
UPDATE %[1]s
SET "CreationTime" = (
SELECT MIN(l."FirstSeen")
FROM vm_lifecycle_cache l
WHERE l."Vcenter" = %[1]s."Vcenter"
AND l."FirstSeen" IS NOT NULL AND l."FirstSeen" > 0
AND (
(l."VmId" IS NOT NULL AND %[1]s."VmId" IS NOT NULL AND l."VmId" = %[1]s."VmId")
OR (l."VmUuid" IS NOT NULL AND %[1]s."VmUuid" IS NOT NULL AND l."VmUuid" = %[1]s."VmUuid")
OR (l."Name" IS NOT NULL AND %[1]s."Name" IS NOT NULL AND l."Name" = %[1]s."Name")
)
)
WHERE ("CreationTime" IS NULL OR "CreationTime" = 0)
AND EXISTS (
SELECT 1 FROM vm_lifecycle_cache l
WHERE l."Vcenter" = %[1]s."Vcenter"
AND l."FirstSeen" IS NOT NULL AND l."FirstSeen" > 0
AND (
(l."VmId" IS NOT NULL AND %[1]s."VmId" IS NOT NULL AND l."VmId" = %[1]s."VmId")
OR (l."VmUuid" IS NOT NULL AND %[1]s."VmUuid" IS NOT NULL AND l."VmUuid" = %[1]s."VmUuid")
OR (l."Name" IS NOT NULL AND %[1]s."Name" IS NOT NULL AND l."Name" = %[1]s."Name")
)
);
`, summaryTable)
bind := dbConn.Rebind(query)
res, err := execLog(ctx, dbConn, bind)
if err != nil {
return 0, err
}
rows, err := res.RowsAffected()
if err != nil {
return 0, err
}
return rows, nil
}
// UpsertVmDailyRollup writes/updates a daily rollup row.
func UpsertVmDailyRollup(ctx context.Context, dbConn *sqlx.DB, day int64, v VmDailyRollupRow) error {
if err := EnsureVmDailyRollup(ctx, dbConn); err != nil {
@@ -1348,7 +1392,6 @@ WITH snapshots AS (
s."InventoryId", s."Name", s."Vcenter", s."VmId", s."EventKey", s."CloudId",
MIN(NULLIF(s."CreationTime", 0)) AS any_creation,
MAX(NULLIF(s."DeletionTime", 0)) AS any_deletion,
MAX(COALESCE(inv."DeletionTime", 0)) AS inv_deletion,
MIN(s."SnapshotTime") AS first_present,
MAX(s."SnapshotTime") AS last_present,
COUNT(*) AS samples_present,
@@ -1365,7 +1408,6 @@ WITH snapshots AS (
SUM(CASE WHEN LOWER(s."ResourcePool") = 'silver' THEN 1 ELSE 0 END) AS silver_hits,
SUM(CASE WHEN LOWER(s."ResourcePool") = 'gold' THEN 1 ELSE 0 END) AS gold_hits
FROM snapshots s
LEFT JOIN inventory inv ON inv."VmId" = s."VmId" AND inv."Vcenter" = s."Vcenter"
GROUP BY
s."InventoryId", s."Name", s."Vcenter", s."VmId", s."EventKey", s."CloudId",
s."Datacenter", s."Cluster", s."Folder",
@@ -1381,9 +1423,8 @@ INSERT INTO %s (
)
SELECT
agg."InventoryId", agg."Name", agg."Vcenter", agg."VmId", agg."EventKey", agg."CloudId",
COALESCE(agg.any_creation, agg.first_present, 0) AS "CreationTime",
COALESCE(agg.any_creation, 0) AS "CreationTime",
CASE
WHEN NULLIF(agg.inv_deletion, 0) IS NOT NULL THEN NULLIF(agg.inv_deletion, 0)
WHEN totals.max_snapshot IS NOT NULL AND agg.last_present < totals.max_snapshot THEN COALESCE(
NULLIF(agg.any_deletion, 0),
(SELECT MIN(s2."SnapshotTime") FROM snapshots s2 WHERE s2."SnapshotTime" > agg.last_present),
@@ -1429,46 +1470,13 @@ SELECT
agg.last_present AS "SnapshotTime",
agg.samples_present AS "SamplesPresent",
CASE WHEN totals.total_samples > 0
THEN (1.0 * agg.samples_present / totals.total_samples) * (
SELECT s2."VcpuCount"
FROM snapshots s2
WHERE s2."Vcenter" = agg."Vcenter"
AND (
(s2."VmId" = agg."VmId" AND s2."VmId" IS NOT NULL AND agg."VmId" IS NOT NULL)
OR (s2."VmUuid" = agg."VmUuid" AND s2."VmUuid" IS NOT NULL AND agg."VmUuid" IS NOT NULL)
OR (LOWER(s2."Name") = LOWER(agg."Name") AND s2."Name" IS NOT NULL AND agg."Name" IS NOT NULL)
)
ORDER BY s2."SnapshotTime" DESC
LIMIT 1
)
THEN 1.0 * agg.sum_vcpu / totals.total_samples
ELSE NULL END AS "AvgVcpuCount",
CASE WHEN totals.total_samples > 0
THEN (1.0 * agg.samples_present / totals.total_samples) * (
SELECT s2."RamGB"
FROM snapshots s2
WHERE s2."Vcenter" = agg."Vcenter"
AND (
(s2."VmId" = agg."VmId" AND s2."VmId" IS NOT NULL AND agg."VmId" IS NOT NULL)
OR (s2."VmUuid" = agg."VmUuid" AND s2."VmUuid" IS NOT NULL AND agg."VmUuid" IS NOT NULL)
OR (LOWER(s2."Name") = LOWER(agg."Name") AND s2."Name" IS NOT NULL AND agg."Name" IS NOT NULL)
)
ORDER BY s2."SnapshotTime" DESC
LIMIT 1
)
THEN 1.0 * agg.sum_ram / totals.total_samples
ELSE NULL END AS "AvgRamGB",
CASE WHEN totals.total_samples > 0
THEN (1.0 * agg.samples_present / totals.total_samples) * (
SELECT s2."ProvisionedDisk"
FROM snapshots s2
WHERE s2."Vcenter" = agg."Vcenter"
AND (
(s2."VmId" = agg."VmId" AND s2."VmId" IS NOT NULL AND agg."VmId" IS NOT NULL)
OR (s2."VmUuid" = agg."VmUuid" AND s2."VmUuid" IS NOT NULL AND agg."VmUuid" IS NOT NULL)
OR (LOWER(s2."Name") = LOWER(agg."Name") AND s2."Name" IS NOT NULL AND agg."Name" IS NOT NULL)
)
ORDER BY s2."SnapshotTime" DESC
LIMIT 1
)
THEN 1.0 * agg.sum_disk / totals.total_samples
ELSE NULL END AS "AvgProvisionedDisk",
CASE WHEN totals.total_samples > 0
THEN 1.0 * agg.samples_present / totals.total_samples
@@ -1543,7 +1551,6 @@ UPDATE %s dst
SET
"CreationTime" = CASE
WHEN t.any_creation IS NOT NULL AND t.any_creation > 0 THEN LEAST(COALESCE(NULLIF(dst."CreationTime", 0), t.any_creation), t.any_creation)
WHEN t.first_seen IS NOT NULL THEN LEAST(COALESCE(NULLIF(dst."CreationTime", 0), t.first_seen), t.first_seen)
ELSE dst."CreationTime"
END,
"DeletionTime" = CASE
@@ -1605,7 +1612,6 @@ SET
(
SELECT CASE
WHEN t.any_creation IS NOT NULL AND t.any_creation > 0 AND COALESCE(NULLIF(%[2]s."CreationTime", 0), t.any_creation) > t.any_creation THEN t.any_creation
WHEN t.any_creation IS NULL AND t.first_seen IS NOT NULL AND COALESCE(NULLIF(%[2]s."CreationTime", 0), t.first_seen) > t.first_seen THEN t.first_seen
ELSE NULL
END
FROM enriched t