Skip to main content

GmFunctionCircuit

One model function's circuit on the player-invoke path. Rows are created lazily on a function's first failure, so a function absent from this list has never failed.

type GmFunctionCircuit {
appId: BigInt!
functionName: String!
circuitState: String!
consecutiveFailures: Int!
cooldownUntil: DateTime
openedAt: DateTime
totalOpens: BigInt!
shadowRefusals: BigInt!
updatedAt: DateTime!
}

Fields

GmFunctionCircuit.appId ● BigInt! non-null scalar

App the function belongs to.

GmFunctionCircuit.functionName ● String! non-null scalar

Function name as a player invokes it, matching gm_function_defs.name. A renamed function starts with a clean circuit.

GmFunctionCircuit.circuitState ● String! non-null scalar

'closed', 'open', or 'half_open'. In shadow mode an open circuit refuses nothing: read it as 'this function has been failing', not 'players are being blocked'.

GmFunctionCircuit.consecutiveFailures ● Int! non-null scalar

Failed player invokes with no success in between. One success resets it to zero, which is what makes the threshold mean a broken function rather than a busy one.

GmFunctionCircuit.cooldownUntil ● DateTime scalar

When an open circuit next admits one probe, and the window that probe holds. Null when closed.

GmFunctionCircuit.openedAt ● DateTime scalar

When the circuit last opened. Null if it never has.

GmFunctionCircuit.totalOpens ● BigInt! non-null scalar

Lifetime openings. A function that opens once a week and one that opens every minute are different problems, and circuitState cannot tell them apart.

GmFunctionCircuit.shadowRefusals ● BigInt! non-null scalar

Player invokes admitted in shadow mode that enforcement WOULD have refused. This is the measurement: it answers what switching enforcement on would have cost players. Never incremented in enforce mode, where those calls are refused instead.

GmFunctionCircuit.updatedAt ● DateTime! non-null scalar

When the circuit row last changed.

Member Of

GmFunctionBreakerStatus object