cc-backend/graph/schema.graphqls

219 lines
4.8 KiB
GraphQL
Raw Normal View History

type Job {
2021-10-26 10:22:02 +02:00
id: ID! # Database ID, unique
jobId: String! # ID given to the job by the cluster scheduler
userId: String! # Username
projectId: String! # Project
clusterId: String! # Name of the cluster this job was running on
startTime: Time! # RFC3339 formated string
duration: Int! # For running jobs, the time it has already run
numNodes: Int! # Number of nodes this job was running on
nodes: [String!]! # List of hostnames
hasProfile: Boolean! # TODO: Could be removed?
state: JobState! # State of the job
tags: [JobTag!]! # List of tags this job has
# Will be null for running jobs.
loadAvg: Float
memUsedMax: Float
flopsAnyAvg: Float
2021-10-26 10:22:02 +02:00
memBwAvg: Float
netBwAvg: Float
fileBwAvg: Float
}
# TODO: Extend by more possible states?
enum JobState {
running
completed
2021-09-23 11:45:20 +02:00
}
2021-04-21 10:12:19 +02:00
2021-09-23 11:45:20 +02:00
type JobTag {
2021-10-26 10:22:02 +02:00
id: ID! # Database ID, unique
tagType: String! # Type
tagName: String! # Name
2021-04-07 09:19:21 +02:00
}
2021-04-22 15:00:54 +02:00
type Cluster {
2021-10-26 10:22:02 +02:00
clusterID: String!
processorType: String!
socketsPerNode: Int!
coresPerSocket: Int!
threadsPerCore: Int!
flopRateScalar: Int!
flopRateSimd: Int!
2021-04-22 15:00:54 +02:00
memoryBandwidth: Int!
2021-10-26 10:22:02 +02:00
metricConfig: [MetricConfig!]!
filterRanges: FilterRanges!
2021-04-22 15:00:54 +02:00
}
type MetricConfig {
2021-10-26 10:22:02 +02:00
name: String!
unit: String!
2021-04-22 15:00:54 +02:00
sampletime: Int!
2021-10-26 10:22:02 +02:00
peak: Int!
normal: Int!
caution: Int!
alert: Int!
2021-04-22 15:00:54 +02:00
}
2021-04-07 09:19:21 +02:00
type JobMetric {
2021-10-26 10:22:02 +02:00
unit: String!
scope: JobMetricScope!
2021-04-07 09:19:21 +02:00
timestep: Int!
2021-10-26 10:22:02 +02:00
series: [JobMetricSeries!]!
2021-04-07 09:19:21 +02:00
}
type JobMetricSeries {
2021-10-26 10:22:02 +02:00
node_id: String!
2021-04-07 09:19:21 +02:00
statistics: JobMetricStatistics
2021-10-26 10:22:02 +02:00
data: [NullableFloat!]!
2021-04-07 09:19:21 +02:00
}
type JobMetricStatistics {
avg: Float!
min: Float!
max: Float!
}
2021-09-23 11:45:20 +02:00
type JobMetricWithName {
2021-10-26 10:22:02 +02:00
name: String!
2021-09-23 11:45:20 +02:00
metric: JobMetric!
2021-04-14 18:53:18 +02:00
}
2021-10-26 10:22:02 +02:00
type MetricFootprints {
name: String!
footprints: [NullableFloat!]!
}
enum Aggregate { USER, PROJECT, CLUSTER }
2021-12-09 16:25:48 +01:00
type NodeMetric {
name: String!
data: [NullableFloat!]!
}
type NodeMetrics {
id: String!
metrics: [NodeMetric!]!
}
type Query {
2021-10-26 10:22:02 +02:00
clusters: [Cluster!]! # List of all clusters
tags: [JobTag!]! # List of all tags
job(id: ID!): Job
jobMetrics(id: ID!, metrics: [String!]): [JobMetricWithName!]!
jobsFootprints(filter: [JobFilter!], metrics: [String!]!): [MetricFootprints]!
jobs(filter: [JobFilter!], page: PageRequest, order: OrderByInput): JobResultList!
jobsStatistics(filter: [JobFilter!], groupBy: Aggregate): [JobsStatistics!]!
rooflineHeatmap(filter: [JobFilter!]!, rows: Int!, cols: Int!, minX: Float!, minY: Float!, maxX: Float!, maxY: Float!): [[Float!]!]!
2021-12-09 16:25:48 +01:00
nodeMetrics(cluster: ID!, nodes: [String!], metrics: [String!], from: Time!, to: Time!): [NodeMetrics!]!
}
2021-05-21 09:30:15 +02:00
type Mutation {
createTag(type: String!, name: String!): JobTag!
deleteTag(id: ID!): ID!
addTagsToJob(job: ID!, tagIds: [ID!]!): [JobTag!]!
removeTagsFromJob(job: ID!, tagIds: [ID!]!): [JobTag!]!
2021-09-23 11:45:20 +02:00
updateConfiguration(name: String!, value: String!): String
}
type IntRangeOutput {
from: Int!
2021-10-26 10:22:02 +02:00
to: Int!
2021-09-23 11:45:20 +02:00
}
type TimeRangeOutput {
from: Time!
2021-10-26 10:22:02 +02:00
to: Time!
2021-09-23 11:45:20 +02:00
}
type FilterRanges {
2021-10-26 10:22:02 +02:00
duration: IntRangeOutput!
numNodes: IntRangeOutput!
2021-09-23 11:45:20 +02:00
startTime: TimeRangeOutput!
2021-05-21 09:30:15 +02:00
}
input JobFilter {
2021-10-26 10:22:02 +02:00
tags: [ID!]
jobId: StringInput
userId: StringInput
projectId: StringInput
clusterId: StringInput
duration: IntRange
numNodes: IntRange
startTime: TimeRange
isRunning: Boolean
flopsAnyAvg: FloatRange
2021-10-26 10:22:02 +02:00
memBwAvg: FloatRange
loadAvg: FloatRange
memUsedMax: FloatRange
}
input OrderByInput {
field: String!
2021-10-26 10:22:02 +02:00
order: SortDirectionEnum! = ASC
}
enum SortDirectionEnum {
DESC
ASC
}
input StringInput {
2021-10-26 10:22:02 +02:00
eq: String
contains: String
startsWith: String
2021-10-26 10:22:02 +02:00
endsWith: String
}
input IntRange {
from: Int!
2021-10-26 10:22:02 +02:00
to: Int!
}
input FloatRange {
from: Float!
2021-10-26 10:22:02 +02:00
to: Float!
}
input TimeRange {
2021-10-26 10:22:02 +02:00
from: Time
to: Time
}
type JobResultList {
2021-10-26 10:22:02 +02:00
items: [Job!]!
offset: Int
2021-10-26 10:22:02 +02:00
limit: Int
count: Int
}
type HistoPoint {
count: Int!
value: Int!
}
type JobsStatistics {
2021-10-26 10:22:02 +02:00
id: ID! # If `groupBy` was used, ID of the user/project/cluster
totalJobs: Int! # Number of jobs that matched
shortJobs: Int! # Number of jobs with a duration of less than 2 minutes
totalWalltime: Int! # Sum of the duration of all matched jobs in hours
totalCoreHours: Int! # Sum of the core hours of all matched jobs
histWalltime: [HistoPoint!]! # value: hour, count: number of jobs with a rounded duration of value
histNumNodes: [HistoPoint!]! # value: number of nodes, count: number of jobs with that number of nodes
2021-09-23 11:45:20 +02:00
}
input PageRequest {
2021-09-23 11:45:20 +02:00
itemsPerPage: Int!
2021-10-26 10:22:02 +02:00
page: Int!
}
scalar Time
2021-10-26 10:22:02 +02:00
scalar NullableFloat
scalar JobMetricScope