const { BodyAdapter } = require("@srk0102/plexa")
class WebServerBody extends BodyAdapter {
static bodyName = "web_server"
static tools = {
scale_up: {
description: "Increase server capacity",
parameters: {
factor: { type: "number", min: 1, max: 10, required: true },
},
},
rate_limit: {
description: "Enable rate limiting",
parameters: {
requestsPerMinute: { type: "number", min: 1, required: true },
},
},
alert_team: {
description: "Send alert to on-call team",
parameters: {
severity: { type: "string", enum: ["low", "high", "critical"], required: true },
},
},
}
constructor(server, pagerduty) {
super()
this.server = server
this.pagerduty = pagerduty
}
async tick() {
await super.tick()
const metrics = await this.server.getMetrics()
this.setState({
rps: metrics.requestsPerSecond,
p99: metrics.p99Latency,
errorRate: metrics.errorRate,
})
if (metrics.errorRate > 0.05) {
this.emit("error_spike", metrics, "CRITICAL")
}
if (metrics.p99Latency > 2000) {
this.emit("slow_request", metrics, "HIGH")
}
if (metrics.requestsPerSecond > metrics.baselineRps * 3) {
this.emit("unusual_traffic", metrics, "HIGH")
}
}
async scale_up({ factor }) {
await this.server.scale(factor)
return { scaled: factor }
}
async rate_limit({ requestsPerMinute }) {
await this.server.setRateLimit(requestsPerMinute)
return { limited: requestsPerMinute }
}
async alert_team({ severity }) {
await this.pagerduty.alert({ severity, source: "web_server" })
return { alerted: severity }
}
}
module.exports = { WebServerBody }