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