-
Notifications
You must be signed in to change notification settings - Fork 596
/
resource-metrics.ts
160 lines (154 loc) · 6.13 KB
/
resource-metrics.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import * as _ from 'lodash';
import { K8sResourceKind, referenceFor } from '@console/internal/module/k8s';
import { useK8sModel } from '../hooks/useK8sModel';
export enum ResourceUtilizationQuery {
MEMORY = 'MEMORY',
CPU = 'CPU',
FILESYSTEM = 'FILESYSTEM',
NETWORK_IN = 'NETWORK_IN',
NETWORK_OUT = 'NETWORK_OUT',
QUOTA_LIMIT = 'QUOTA_LIMIT',
QUOTA_REQUEST = 'QUOTA_REQUEST',
}
const podMetricsQueries = {
[ResourceUtilizationQuery.MEMORY]: _.template(
"sum(container_memory_working_set_bytes{pod='<%= name %>',namespace='<%= namespace %>',container=''}) BY (pod, namespace)",
),
[ResourceUtilizationQuery.CPU]: _.template(
"pod:container_cpu_usage:sum{pod='<%= name %>',namespace='<%= namespace %>'}",
),
[ResourceUtilizationQuery.FILESYSTEM]: _.template(
"pod:container_fs_usage_bytes:sum{pod='<%= name %>',namespace='<%= namespace %>'}",
),
[ResourceUtilizationQuery.NETWORK_IN]: _.template(
"(sum(irate(container_network_receive_bytes_total{pod='<%= name %>', namespace='<%= namespace %>'}[5m])) by (pod, namespace, interface)) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )",
),
[ResourceUtilizationQuery.NETWORK_OUT]: _.template(
"(sum(irate(container_network_transmit_bytes_total{pod='<%= name %>', namespace='<%= namespace %>'}[5m])) by (pod, namespace, interface)) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info )",
),
[ResourceUtilizationQuery.QUOTA_LIMIT]: _.template(
"sum by (pod, namespace, resource) (kube_pod_resource_limit{resource='<%= resource %>',pod='<%= name %>',namespace='<%= namespace %>'})",
),
[ResourceUtilizationQuery.QUOTA_REQUEST]: _.template(
"sum by (pod, namespace, resource) (kube_pod_resource_request{resource='<%= resource %>',pod='<%= name %>',namespace='<%= namespace %>'})",
),
};
const podControllerMetricsQueries = {
[ResourceUtilizationQuery.MEMORY]: _.template(
"sum(container_memory_working_set_bytes{namespace='<%= namespace %>',container!=''} * on(namespace,pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace='<%= namespace %>', workload='<%= name %>', workload_type='<%= type %>'}) by (pod)",
),
[ResourceUtilizationQuery.CPU]: _.template(
"sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace='<%= namespace %>'} * on(namespace,pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace='<%= namespace %>', workload='<%= name %>', workload_type='<%= type %>'}) by (pod)",
),
[ResourceUtilizationQuery.FILESYSTEM]: _.template(
"sum(pod:container_fs_usage_bytes:sum{namespace='<%= namespace %>'} * on(namespace,pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace='<%= namespace %>', workload='<%= name %>', workload_type='<%= type %>'}) by (pod)",
),
[ResourceUtilizationQuery.NETWORK_IN]: _.template(
"sum(irate(container_network_receive_bytes_total{namespace=~'<%= namespace %>'}[5m]) * on (namespace,pod) group_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=~'<%= namespace %>', workload=~'<%= name %>', workload_type='<%= type %>'}) by (pod)",
),
[ResourceUtilizationQuery.NETWORK_OUT]: _.template(
"sum(irate(container_network_transmit_bytes_total{namespace=~'<%= namespace %>'}[5m]) * on (namespace,pod) group_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=~'<%= namespace %>', workload=~'<%= name %>', workload_type='<%= type %>'}) by (pod)",
),
};
export const getPodMetricsQueries = (
name: string,
namespace: string,
): { [key: string]: string[] } => ({
[ResourceUtilizationQuery.MEMORY]: [
podMetricsQueries[ResourceUtilizationQuery.MEMORY]({
name,
namespace,
}),
podMetricsQueries[ResourceUtilizationQuery.QUOTA_LIMIT]({
name,
namespace,
resource: 'memory',
}),
podMetricsQueries[ResourceUtilizationQuery.QUOTA_REQUEST]({
name,
namespace,
resource: 'memmory',
}),
],
[ResourceUtilizationQuery.CPU]: [
podMetricsQueries[ResourceUtilizationQuery.CPU]({ name, namespace }),
podMetricsQueries[ResourceUtilizationQuery.QUOTA_LIMIT]({
name,
namespace,
resource: 'cpu',
}),
podMetricsQueries[ResourceUtilizationQuery.QUOTA_REQUEST]({
name,
namespace,
resource: 'cpu',
}),
],
[ResourceUtilizationQuery.FILESYSTEM]: [
podMetricsQueries[ResourceUtilizationQuery.FILESYSTEM]({
name,
namespace,
}),
],
[ResourceUtilizationQuery.NETWORK_IN]: [
podMetricsQueries[ResourceUtilizationQuery.NETWORK_IN]({
name,
namespace,
}),
],
[ResourceUtilizationQuery.NETWORK_OUT]: [
podMetricsQueries[ResourceUtilizationQuery.NETWORK_OUT]({
name,
namespace,
}),
],
});
export const getPodControllerMetricsQueries = (
name: string,
namespace: string,
type: string,
): { [key: string]: string[] } => ({
[ResourceUtilizationQuery.MEMORY]: [
podControllerMetricsQueries[ResourceUtilizationQuery.MEMORY]({
name,
namespace,
type,
}),
],
[ResourceUtilizationQuery.CPU]: [
podControllerMetricsQueries[ResourceUtilizationQuery.CPU]({
name,
namespace,
type,
}),
],
[ResourceUtilizationQuery.FILESYSTEM]: [
podControllerMetricsQueries[ResourceUtilizationQuery.FILESYSTEM]({
name,
namespace,
type,
}),
],
[ResourceUtilizationQuery.NETWORK_IN]: [
podControllerMetricsQueries[ResourceUtilizationQuery.NETWORK_IN]({
name,
namespace,
type,
}),
],
[ResourceUtilizationQuery.NETWORK_OUT]: [
podControllerMetricsQueries[ResourceUtilizationQuery.NETWORK_OUT]({
name,
namespace,
type,
}),
],
});
export const useResourceMetricsQueries = (obj: K8sResourceKind): { [key: string]: string[] } => {
const [model] = useK8sModel(referenceFor(obj));
if (model) {
return model.id === 'pod'
? getPodMetricsQueries(obj.metadata.name, obj.metadata.namespace)
: getPodControllerMetricsQueries(obj.metadata.name, obj.metadata.namespace, model.id);
}
return null;
};