chore: emulator sip_gateway, Makefile targets, full README documentation

- Emulator: add sip_gateway field to all scenarios (auto-trunk creation)
- Makefile: build-agent, build-siptest, emulate-*, siptest-* targets
- README: full documentation with agent section, production deployment
- Project structure update with all components
This commit is contained in:
Maksim Totmin
2026-06-25 16:59:17 +07:00
parent 1e6f432230
commit 95ac4164dd
3 changed files with 841 additions and 10 deletions
+15 -9
View File
@@ -37,6 +37,7 @@ type nodeMetric struct {
IdleCPU float64 `json:"idle_cpu"`
LoadAvg float64 `json:"load_avg"`
CallFailureRate float64 `json:"call_failure_rate"`
SIPGateway string `json:"sip_gateway,omitempty"`
}
// --- Спецификация значения (фиксированное или случайный диапазон) ---
@@ -63,13 +64,14 @@ func (v valueSpec) get() float64 {
// --- Конфигурация ноды в эмуляторе ---
type nodeSpec struct {
nodeID string
status valueSpec // строка: ok / down
calls valueSpec
maxCalls float64 // фиксированное
idleCPU valueSpec
loadAvg valueSpec
failRate valueSpec
nodeID string
status valueSpec // строка: ok / down
calls valueSpec
maxCalls float64 // фиксированное
idleCPU valueSpec
loadAvg valueSpec
failRate valueSpec
sipGateway string // SIP-адрес для авто-создания транка
}
func (ns *nodeSpec) generate() nodeMetric {
@@ -82,6 +84,7 @@ func (ns *nodeSpec) generate() nodeMetric {
IdleCPU: ns.idleCPU.get(),
LoadAvg: ns.loadAvg.get(),
CallFailureRate: ns.failRate.get(),
SIPGateway: ns.sipGateway,
}
}
@@ -100,16 +103,19 @@ func scenarioNormal() []nodeSpec {
nodeID: "pbx-01", status: fixed(1),
calls: rrange(10, 100), maxCalls: 250,
idleCPU: rrange(40, 95), loadAvg: rrange(0.1, 1.0), failRate: rrange(0, 2),
sipGateway: "sip:pbx-01.lan:5060",
},
{
nodeID: "pbx-02", status: fixed(1),
calls: rrange(50, 200), maxCalls: 250,
idleCPU: rrange(15, 45), loadAvg: rrange(0.5, 2.0), failRate: rrange(1, 8),
sipGateway: "sip:pbx-02.lan:5060",
},
{
nodeID: "pbx-03", status: fixed(1),
calls: rrange(5, 60), maxCalls: 250,
idleCPU: rrange(60, 90), loadAvg: rrange(0.05, 0.5), failRate: rrange(0, 1),
sipGateway: "sip:pbx-03.lan:5060",
},
}
}
@@ -327,6 +333,6 @@ func publish(nc *natsgo.Conn, m nodeMetric) {
log.Printf("[emulator] ошибка публикации %s: %v", m.NodeID, err)
return
}
log.Printf("[emulator] → %s: calls=%d/%d idle=%.0f%% load=%.2f fail=%.1f%% status=%s",
m.NodeID, m.ActiveCalls, m.MaxCalls, m.IdleCPU, m.LoadAvg, m.CallFailureRate, m.Status)
log.Printf("[emulator] → %s: calls=%d/%d idle=%.0f%% load=%.2f fail=%.1f%% status=%s gw=%s",
m.NodeID, m.ActiveCalls, m.MaxCalls, m.IdleCPU, m.LoadAvg, m.CallFailureRate, m.Status, m.SIPGateway)
}