Skip to content

Commit ef57345

Browse files
authoredMar 12, 2025··
Add limit field to WorkloadUtilization and implement resolver (#111)
1 parent 14ebe27 commit ef57345

File tree

4 files changed

+177
-0
lines changed

4 files changed

+177
-0
lines changed
 

‎internal/graph/gengql/generated.go

+148
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎internal/graph/schema/utilization.graphqls

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ type WorkloadUtilization {
3131
"Gets the requested amount of resources for the requested resource type."
3232
requested(resourceType: UtilizationResourceType!): Float!
3333

34+
"Gets the limit of the resources for the requested resource type."
35+
limit(resourceType: UtilizationResourceType!): Float
36+
3437
"Usage between start and end with step size for given resource type."
3538
series(input: WorkloadUtilizationSeriesInput!): [UtilizationSample!]!
3639
}

‎internal/graph/utilization.resolvers.go

+4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ func (r *workloadUtilizationResolver) Requested(ctx context.Context, obj *utiliz
5353
return utilization.WorkloadResourceRequest(ctx, obj.EnvironmentName, obj.TeamSlug, obj.WorkloadName, resourceType)
5454
}
5555

56+
func (r *workloadUtilizationResolver) Limit(ctx context.Context, obj *utilization.WorkloadUtilization, resourceType utilization.UtilizationResourceType) (*float64, error) {
57+
return utilization.WorkloadResourceLimit(ctx, obj.EnvironmentName, obj.TeamSlug, obj.WorkloadName, resourceType)
58+
}
59+
5660
func (r *workloadUtilizationResolver) Series(ctx context.Context, obj *utilization.WorkloadUtilization, input utilization.WorkloadUtilizationSeriesInput) ([]*utilization.UtilizationSample, error) {
5761
return utilization.WorkloadResourceUsageRange(ctx, obj.EnvironmentName, obj.TeamSlug, obj.WorkloadName, input.ResourceType, input.Start, input.End, input.Step())
5862
}

‎internal/utilization/queries.go

+22
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import (
1414
)
1515

1616
const (
17+
appCPULimit = `sum by (container) (kube_pod_container_resource_limits{namespace=%q, container=%q, resource="cpu", unit="core"})`
1718
appCPURequest = `sum by (container) (kube_pod_container_resource_requests{namespace=%q, container=%q, resource="cpu",unit="core"})`
1819
appCPUUsage = `sum by (container) (rate(container_cpu_usage_seconds_total{namespace=%q, container=%q}[5m]))`
20+
appMemoryLimit = `sum by (container) (kube_pod_container_resource_limits{namespace=%q, container=%q, resource="memory", unit="byte"})`
1921
appMemoryRequest = `sum by (container) (kube_pod_container_resource_requests{namespace=%q, container=%q, resource="memory",unit="byte"})`
2022
appMemoryUsage = `sum by (container) (container_memory_working_set_bytes{namespace=%q, container=%q})`
2123
teamCPURequest = `sum by (container, owner_kind) (kube_pod_container_resource_requests{namespace=%q, container!~%q, resource="cpu",unit="core"} * on(pod,namespace) group_left(owner_kind) kube_pod_owner{owner_kind="ReplicaSet"})`
@@ -154,6 +156,26 @@ func WorkloadResourceRequest(ctx context.Context, env string, teamSlug slug.Slug
154156
return ensuredVal(v), nil
155157
}
156158

159+
func WorkloadResourceLimit(ctx context.Context, env string, teamSlug slug.Slug, workloadName string, resourceType UtilizationResourceType) (*float64, error) {
160+
q := appMemoryLimit
161+
if resourceType == UtilizationResourceTypeCPU {
162+
q = appCPULimit
163+
}
164+
165+
c := fromContext(ctx).client
166+
167+
v, err := c.query(ctx, env, fmt.Sprintf(q, teamSlug, workloadName))
168+
if err != nil {
169+
return nil, err
170+
}
171+
172+
if len(v) == 0 {
173+
return nil, nil
174+
}
175+
176+
return (*float64)(&v[0].Value), nil
177+
}
178+
157179
func WorkloadResourceUsage(ctx context.Context, env string, teamSlug slug.Slug, workloadName string, resourceType UtilizationResourceType) (float64, error) {
158180
q := appMemoryUsage
159181
if resourceType == UtilizationResourceTypeCPU {

0 commit comments

Comments
 (0)
Please sign in to comment.