feat: balancer dashboard metrics + fix WebSocket Hijacker
This commit is contained in:
@@ -401,3 +401,70 @@ func (c *Client) GetStats() Stats {
|
||||
func (c *Client) IncGatewayOps() {
|
||||
c.gatewayOps.Add(1)
|
||||
}
|
||||
|
||||
// --- FS stats ---
|
||||
|
||||
// FsStats — показатели FreeSWITCH балансировщика.
|
||||
type FsStats struct {
|
||||
ActiveCalls int
|
||||
MaxSessions int
|
||||
FsUptime string
|
||||
}
|
||||
|
||||
// FetchFsStats запрашивает метрики FreeSWITCH через api команды.
|
||||
func (c *Client) FetchFsStats() (FsStats, error) {
|
||||
if !c.connected.Load() {
|
||||
return FsStats{}, fmt.Errorf("esl не подключён")
|
||||
}
|
||||
var stats FsStats
|
||||
|
||||
_, body, err := c.Send("api show calls count")
|
||||
if err != nil {
|
||||
return FsStats{}, err
|
||||
}
|
||||
stats.ActiveCalls = parseFirstInt(body)
|
||||
|
||||
_, body, err = c.Send("api status")
|
||||
if err != nil {
|
||||
return stats, err
|
||||
}
|
||||
stats.MaxSessions = parseMaxSessions(body)
|
||||
stats.FsUptime = parseUptime(body)
|
||||
|
||||
return stats, nil
|
||||
}
|
||||
|
||||
func parseFirstInt(s string) int {
|
||||
s = strings.TrimSpace(s)
|
||||
for i, c := range s {
|
||||
if c < '0' || c > '9' {
|
||||
if i == 0 {
|
||||
return 0
|
||||
}
|
||||
v, err := strconv.Atoi(s[:i])
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return v
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func parseMaxSessions(body string) int {
|
||||
for _, line := range strings.Split(body, "\n") {
|
||||
if strings.Contains(line, "session(s) max") {
|
||||
return parseFirstInt(line)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func parseUptime(body string) string {
|
||||
for _, line := range strings.Split(body, "\n") {
|
||||
if strings.HasPrefix(line, "UP ") {
|
||||
return strings.TrimPrefix(line, "UP ")
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user