️ Decrease row space drastically

This commit is contained in:
andreas.dinauer 2025-11-16 20:42:53 +01:00
parent 5b71f9b7ab
commit e231e4d6ae
6 changed files with 80 additions and 83 deletions

View File

@ -5,18 +5,18 @@ meta {
} }
get { get {
url: http://localhost:8090/api/metrics/POD-2/WORKLOAD?bucket-unit=TOTAL url: http://localhost:4000/api/metrics/POD-2/WORKLOAD?bucket-unit=DAILY
body: none body: none
auth: basic auth: basic
} }
params:query { params:query {
bucket-unit: TOTAL bucket-unit: DAILY
} }
auth:basic { auth:basic {
username: test username: kubooboo
password: test password: password
} }
settings { settings {

View File

@ -5,7 +5,7 @@ meta {
} }
post { post {
url: http://localhost:4000/api/metrics/POD-2/WORKLOAD url: http://localhost:4000/api/metrics/analytics-backend-deployment-8695d9f87f-v8n7r/WORKLOAD
body: json body: json
auth: basic auth: basic
} }
@ -23,9 +23,10 @@ body:json {
{ {
"owner": "kubooboo", "owner": "kubooboo",
"values": { "values": {
"x": "20", "RELATIVE_CPU": "20",
"y": "23", "RELATIVE_MEMORY": "23",
"z": "56" "RELATIVE_DISK_USAGE": "56",
"TOTAL_DISK_SPACE": "73483209348"
} }
} }
} }

View File

@ -1,63 +1,50 @@
package dev.dinauer.metrics.service.model; package dev.dinauer.metrics.service.model;
import java.time.ZonedDateTime;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.stream.Collectors;
import jakarta.persistence.*; import jakarta.persistence.*;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
@Entity @Entity
@Table(name = "bucket") @Table(name = "bucket")
public class Bucket public class Bucket extends PanacheEntity
{ {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Id
private String id;
@Column(nullable = false) @Column(nullable = false)
private String resource; private String resource;
@Column(name = "bucket_name", nullable = false) @Column(name = "bucket_name", nullable = false)
private String name; private String name;
@Column(nullable = false) @Column(name = "formatted_timestamp", nullable = false)
private String timestamp; private String timestamp;
@Column(name = "unix_timestamp", nullable = false) @Column(name = "unix_timestamp", nullable = false)
private long unixTimestamp; private long unixTimestamp;
@Enumerated(EnumType.STRING) @Enumerated(EnumType.ORDINAL)
@Column(name = "bucket_unit", nullable = false) @Column(name = "bucket_unit", nullable = false)
private BucketUnit bucketUnit; private BucketUnit bucketUnit;
@Column(columnDefinition = "text", nullable = false) @Column(columnDefinition = "text", nullable = false)
private String metrics; private String metrics;
@Column(name = "bucket_owner")
private String owner; private String owner;
@CreationTimestamp
@Column(name = "created_at", updatable = false)
private ZonedDateTime createdAt;
@UpdateTimestamp
@Column(name = "updated_at")
private ZonedDateTime updatedAt;
public Bucket() public Bucket()
{ {
} }
public Bucket(String resource, String name, String timestamp, long unixTimestamp, String owner, BucketUnit bucketUnit) public Bucket(String resource, String name, String timestamp, long unixTimestamp, String owner, BucketUnit bucketUnit)
{ {
this.id = UUID.randomUUID().toString();
this.resource = resource; this.resource = resource;
this.name = name; this.name = name;
this.timestamp = timestamp; this.timestamp = timestamp;
@ -67,11 +54,6 @@ public class Bucket
this.metrics = "{}"; this.metrics = "{}";
} }
public String getId()
{
return id;
}
public void add(String key, double value) public void add(String key, double value)
{ {
Map<String, Metric> metrics = getMetrics(); Map<String, Metric> metrics = getMetrics();
@ -82,13 +64,12 @@ public class Bucket
} }
else else
{ {
Metric newMetric = new Metric(); metrics.put(key, Metric.init(value));
newMetric.add(value);
metrics.put(key, newMetric);
} }
try try
{ {
this.metrics = OBJECT_MAPPER.writeValueAsString(metrics); Map<String, String> serializedMetrics = metrics.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> Metric.serialize(entry.getValue())));
this.metrics = OBJECT_MAPPER.writeValueAsString(serializedMetrics);
} }
catch (JsonProcessingException e) catch (JsonProcessingException e)
{ {
@ -129,9 +110,10 @@ public class Bucket
{ {
try try
{ {
return OBJECT_MAPPER.readValue(metrics, new TypeReference<Map<String, Metric>>() Map<String, String> raw = OBJECT_MAPPER.readValue(metrics, new TypeReference<Map<String, String>>()
{ {
}); });
return raw.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> Metric.deserialize(entry.getValue())));
} }
catch (JsonProcessingException e) catch (JsonProcessingException e)
{ {
@ -144,28 +126,6 @@ public class Bucket
return unixTimestamp; return unixTimestamp;
} }
public ZonedDateTime getCreatedAt()
{
return createdAt;
}
public Bucket setCreatedAt(ZonedDateTime createdAt)
{
this.createdAt = createdAt;
return this;
}
public ZonedDateTime getUpdatedAt()
{
return updatedAt;
}
public Bucket setUpdatedAt(ZonedDateTime updatedAt)
{
this.updatedAt = updatedAt;
return this;
}
public String getOwner() public String getOwner()
{ {
return owner; return owner;

View File

@ -1,37 +1,41 @@
package dev.dinauer.metrics.service.model; package dev.dinauer.metrics.service.model;
import java.util.Objects;
public class Metric public class Metric
{ {
private int count; private int count;
private double sum; private double sum;
private double average; private double average;
private Double min; private double min;
private Double max; private double max;
public Metric() public static Metric init(double value)
{ {
this.count = 0; return new Metric(0, 0, 0.0F, value, value).add(value);
this.sum = 0;
this.average = 0.0F;
this.min = null;
this.max = null;
} }
public void add(double value) public Metric(int count, double sum, double average, double min, double max)
{
this.count = count;
this.sum = sum;
this.average = average;
this.min = min;
this.max = max;
}
public Metric add(double value)
{ {
count = count + 1; count = count + 1;
sum = sum + value; sum = sum + value;
average = calculateAverage(sum, count); average = calculateAverage(sum, count);
if (Objects.isNull(min) || value < min) if (value < min)
{ {
min = value; min = value;
} }
if (Objects.isNull(max) || value > max) if (value > max)
{ {
max = value; max = value;
} }
return this;
} }
private double calculateAverage(double sum, int count) private double calculateAverage(double sum, int count)
@ -67,4 +71,27 @@ public class Metric
{ {
return max; return max;
} }
public static Metric deserialize(String input)
{
if (input != null && !input.isBlank())
{
String[] sections = input.split(",");
if (sections.length == 5)
{
int count = Integer.parseInt(sections[0]);
double sum = Double.parseDouble(sections[1]);
double average = Double.parseDouble(sections[2]);
double min = Double.parseDouble(sections[3]);
double max = Double.parseDouble(sections[4]);
return new Metric(count, sum, average, min, max);
}
}
throw new IllegalArgumentException();
}
public static String serialize(Metric input)
{
return String.format("%s,%s,%s,%s,%s", input.getCount(), input.getSum(), input.getAverage(), input.getMin(), input.getMax());
}
} }

View File

@ -19,8 +19,11 @@ quarkus.datasource.db-kind = postgresql
%prod.quarkus.datasource.password=${DB_PASSWORD} %prod.quarkus.datasource.password=${DB_PASSWORD}
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_DATABASE}?currentSchema=${DB_SCHEMA} %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_DATABASE}?currentSchema=${DB_SCHEMA}
quarkus.banner.path=banner.txt quarkus.banner.path=banner.txt
# Flyway # Flyway
quarkus.hibernate-orm.schema-management.strategy=none
%test,dev.quarkus.flyway.clean-at-start=true %test,dev.quarkus.flyway.clean-at-start=true
quarkus.flyway.migrate-at-start=true quarkus.flyway.migrate-at-start=true

View File

@ -1,14 +1,20 @@
CREATE SEQUENCE public.bucket_seq
INCREMENT BY 50
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1
NO CYCLE;
CREATE TABLE public.bucket ( CREATE TABLE public.bucket (
created_at timestamptz(6) NULL, bucket_unit INT2 NOT NULL,
unix_timestamp int8 NOT NULL, id INT8 NOT NULL,
updated_at timestamptz(6) NULL, unix_timestamp INT8 NOT NULL,
bucket_name varchar(255) NOT NULL, bucket_name VARCHAR(255) NOT NULL,
bucket_unit varchar(255) NOT NULL, bucket_owner VARCHAR(255) NULL,
id varchar(255) NOT NULL, formatted_timestamp VARCHAR(255) NOT NULL,
metrics text NOT NULL, metrics text NOT NULL,
"owner" varchar(255) NULL, resource VARCHAR(255) NOT NULL,
resource varchar(255) NOT NULL, CONSTRAINT bucket_bucket_unit_check CHECK (((bucket_unit >= 0) AND (bucket_unit <= 6))),
"timestamp" varchar(255) NOT NULL,
CONSTRAINT bucket_bucket_unit_check CHECK (((bucket_unit)::text = ANY ((ARRAY['RAW'::character varying, 'HOURLY'::character varying, 'DAILY'::character varying, 'WEEKLY'::character varying, 'MONTHLY'::character varying, 'YEARLY'::character varying, 'TOTAL'::character varying])::text[]))),
CONSTRAINT bucket_pkey PRIMARY KEY (id) CONSTRAINT bucket_pkey PRIMARY KEY (id)
); );