Skip to content

Commit

Permalink
Add test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
bastjan committed Dec 21, 2022
1 parent 68996be commit a0c9bce
Show file tree
Hide file tree
Showing 3 changed files with 217 additions and 94 deletions.
16 changes: 16 additions & 0 deletions pkg/db/seeds/promtest/common.libsonnet
Expand Up @@ -7,7 +7,23 @@ local series = function(name, labels, values) {
values: values,
};

// returns a test object with the given series and samples. Sample interval is 30s
// the evaluation time is set one hour in the future since all our queries operate on a 1h window
local test = function(name, series, query, samples) {
name: name,
interval: '30s',
input_series: if std.isArray(series) then series else std.objectValues(series),
promql_expr_test: [
{
expr: query,
eval_time: '1h',
exp_samples: if std.isArray(samples) then samples else [ samples ],
},
],
};

{
series: series,
formatLabels: formatLabels,
test: test,
}
291 changes: 199 additions & 92 deletions pkg/db/seeds/promtest/query.jsonnet
Expand Up @@ -7,99 +7,206 @@ local commonLabels = {
tenant_id: 'c-appuio-cloudscale-lpg-2',
};

// One running pod, minimal (=1 byte) memory request and usage, no CPU request
// 10 samples
local baseSeries = {
local runningUID = '35e3a8b1-b46d-496c-b2b7-1b52953bf904',

flexNodeLabel: c.series('kube_node_labels', commonLabels {
label_appuio_io_node_class: 'flex',
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '1x10'),
testprojectNamespaceOrgLabel: c.series('kube_namespace_labels', commonLabels {
namespace: 'testproject',
label_appuio_io_organization: 'cherry-pickers-inc',
}, '1x10'),
// Phases
runningPodPhase: c.series('kube_pod_status_phase', commonLabels {
namespace: 'testproject',
phase: 'Running',
pod: 'running-pod',
uid: runningUID,
}, '1x10'),
// Requests
runningPodMemoryRequests: c.series('kube_pod_container_resource_requests', commonLabels {
namespace: 'testproject',
pod: 'running-pod',
resource: 'memory',
node: 'flex-x666',
uid: runningUID,
}, '1x10'),
runningPodCPURequests: c.series('kube_pod_container_resource_requests', commonLabels {
namespace: 'testproject',
pod: 'running-pod',
node: 'flex-x666',
resource: 'cpu',
uid: runningUID,
}, '0x10'),
// Real usage
runningPodMemoryUsage: c.series('container_memory_working_set_bytes', commonLabels {
image: 'busybox',
namespace: 'testproject',
pod: 'running-pod',
node: 'flex-x666',
uid: runningUID,
}, '1x10'),
};

local baseCalculatedLabels = {
category: 'c-appuio-cloudscale-lpg-2:testproject',
cluster_id: 'c-appuio-cloudscale-lpg-2',
label_appuio_io_node_class: 'flex',
namespace: 'testproject',
product: 'appuio_cloud_memory:c-appuio-cloudscale-lpg-2:cherry-pickers-inc:testproject:flex',
tenant_id: 'cherry-pickers-inc',
};

{
tests: [
{
interval: '30s',
local runningUID = '35e3a8b1-b46d-496c-b2b7-1b52953bf904',
local succeededUID = '2a7a6e32-0840-4ac3-bab4-52d7e16f4a0a',
input_series: [
c.series('kube_node_labels', commonLabels {
label_appuio_io_node_class: 'flex',
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '1+0x10'),
c.series('kube_namespace_labels', commonLabels {
namespace: 'testproject',
label_appuio_io_organization: 'cherry-pickers-inc',
}, '1+0x10'),
// Phases
c.series('kube_pod_status_phase', commonLabels {
namespace: 'testproject',
phase: 'Succeeded',
pod: 'succeeded-pod',
uid: succeededUID,
}, '1+0x10'),
c.series('kube_pod_status_phase', commonLabels {
namespace: 'testproject',
phase: 'Running',
pod: 'running-pod',
uid: runningUID,
}, '1+0x10'),
// Requests
c.series('kube_pod_container_resource_requests', commonLabels {
namespace: 'testproject',
pod: 'succeeded-pod',
resource: 'memory',
node: 'flex-x666',
uid: succeededUID,
}, '1+0x10'),
c.series('kube_pod_container_resource_requests', commonLabels {
namespace: 'testproject',
pod: 'running-pod',
resource: 'memory',
node: 'flex-x666',
uid: runningUID,
}, '1+0x10'),
c.series('kube_pod_container_resource_requests', commonLabels {
namespace: 'testproject',
pod: 'succeeded-pod',
node: 'flex-x666',
resource: 'cpu',
uid: succeededUID,
}, '0+0x10'),
c.series('kube_pod_container_resource_requests', commonLabels {
namespace: 'testproject',
pod: 'running-pod',
node: 'flex-x666',
resource: 'cpu',
uid: runningUID,
}, '0+0x10'),
// Real usage
c.series('container_memory_working_set_bytes', commonLabels {
image: 'busybox',
namespace: 'testproject',
pod: 'succeeded-pod',
node: 'flex-x666',
uid: succeededUID,
}, '1+0x10'),
c.series('container_memory_working_set_bytes', commonLabels {
image: 'busybox',
namespace: 'testproject',
pod: 'running-pod',
node: 'flex-x666',
uid: runningUID,
}, '1+0x10'),
],
promql_expr_test: [
{
expr: query,
eval_time: '1h',
exp_samples: [
{
labels: c.formatLabels({
category: 'c-appuio-cloudscale-lpg-2:testproject',
cluster_id: 'c-appuio-cloudscale-lpg-2',
label_appuio_io_node_class: 'flex',
namespace: 'testproject',
product: 'appuio_cloud_memory:c-appuio-cloudscale-lpg-2:cherry-pickers-inc:testproject:flex',
tenant_id: 'cherry-pickers-inc',
}),
value: 128 * 10,
},
],
},
],
},
c.test('minimal pod',
baseSeries,
query,
{
labels: c.formatLabels(baseCalculatedLabels),
// Minimum value is 128MiB
value: 128 * 10,
}),
c.test('pod with higher memory usage',
baseSeries {
runningPodMemoryUsage+: {
values: '%sx10' % (500 * 1024 * 1024),
},
},
query,
{
labels: c.formatLabels(baseCalculatedLabels),
value: 500 * 10,
}),
c.test('pod with higher memory requests',
baseSeries {
runningPodMemoryRequests+: {
values: '%sx10' % (500 * 1024 * 1024),
},
},
query,
{
labels: c.formatLabels(baseCalculatedLabels),
value: 500 * 10,
}),
c.test('pod with CPU requests violating fair use',
baseSeries {
runningPodCPURequests+: {
values: '%sx10' % 0.5,
},
},
query,
{
labels: c.formatLabels(baseCalculatedLabels),
// See per cluster fair use ratio in query
value: 2.048E+04,
}),
c.test('pod with CPU requests violating fair use',
baseSeries {
runningPodCPURequests+: {
values: '%sx10' % 0.5,
},
},
query,
{
labels: c.formatLabels(baseCalculatedLabels),
// See per cluster fair use ratio in query
value: 2.048E+04,
}),
c.test('non-running pods are not counted',
baseSeries {
local lbls = commonLabels {
namespace: 'testproject',
pod: 'succeeded-pod',
uid: '2a7a6e32-0840-4ac3-bab4-52d7e16f4a0a',
},
succeededPodPhase: c.series('kube_pod_status_phase', lbls {
phase: 'Succeeded',
}, '1x10'),
succeededPodMemoryRequests: c.series('kube_pod_container_resource_requests', lbls {
resource: 'memory',
node: 'flex-x666',
}, '1x10'),
succeededPodCPURequests: c.series('kube_pod_container_resource_requests', lbls {
node: 'flex-x666',
resource: 'cpu',
}, '1x10'),
},
query,
{
labels: c.formatLabels(baseCalculatedLabels),
value: 128 * 10,
}),
c.test('unrelated kube node label changes do not throw errors - there is an overlap since series go stale only after a few missed scrapes',
baseSeries {
flexNodeLabel: c.series('kube_node_labels', commonLabels {
label_csi_driver_id: 'A09B8DDE-5435-4D74-923C-4866513E8F02',
label_appuio_io_node_class: 'flex',
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '1x10 _x10 stale'),
flexNodeLabelUpdated: c.series('kube_node_labels', commonLabels {
label_csi_driver_id: '18539CC3-0B6C-4E72-82BD-90A9BEF7D807',
label_appuio_io_node_class: 'flex',
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '_x5 1x15'),
},
query,
{
labels: c.formatLabels(baseCalculatedLabels),
value: 128 * 10,
}),
c.test('unrelated kube node label adds do not throw errors - there is an overlap since series go stale only after a few missed scrapes',
baseSeries {
flexNodeLabel: c.series('kube_node_labels', commonLabels {
label_appuio_io_node_class: 'flex',
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '1x10 _x10 stale'),
flexNodeLabelUpdated: c.series('kube_node_labels', commonLabels {
label_csi_driver_id: '18539CC3-0B6C-4E72-82BD-90A9BEF7D807',
label_appuio_io_node_class: 'flex',
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '_x5 1x15'),
},
query,
{
labels: c.formatLabels(baseCalculatedLabels),
value: 128 * 10,
}),
c.test('node class adds do not throw errors - there is an overlap since series go stale only after a few missed scrapes',
baseSeries {
flexNodeLabel: c.series('kube_node_labels', commonLabels {
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '1x10 _x10 stale'),
flexNodeLabelUpdated: c.series('kube_node_labels', commonLabels {
label_appuio_io_node_class: 'flex',
label_kubernetes_io_hostname: 'flex-x666',
node: 'flex-x666',
}, '_x5 1x15'),
},
query,
[
// I'm not sure why this is 11 * 128, might have something to do with the intervals or intra minute switching
{
labels: c.formatLabels(baseCalculatedLabels),
value: 128 * 8,
},
{
labels: c.formatLabels(baseCalculatedLabels {
label_appuio_io_node_class:: null,
product: 'appuio_cloud_memory:c-appuio-cloudscale-lpg-2:cherry-pickers-inc:testproject:',
}),
value: 128 * 3,
},
]),
],
}
4 changes: 2 additions & 2 deletions pkg/db/seeds/queries_test.go
Expand Up @@ -38,10 +38,10 @@ func runPromtool(t *testing.T, tmp string) {
cmd.Stdout = &stdout
assert.NoError(t, cmd.Run())
// Not using t.Log to keep formatting sane
fmt.Println("STDERR")
fmt.Println(stderr.String())
fmt.Println("STDOUT")
fmt.Println(stdout.String())
fmt.Println("STDERR")
fmt.Println(stderr.String())
}

func renderJsonnet(t *testing.T, tFile string) string {
Expand Down

0 comments on commit a0c9bce

Please sign in to comment.