master
go 79 lines 1.49 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package icecast
4
5 import (
6 "fmt"
7
8 "github.com/netdata/netdata/go/plugins/pkg/web"
9 )
10
11 const (
12 urlPathServerStats = "/status-json.xsl" // https://icecast.org/docs/icecast-trunk/server_stats/
13 )
14
15 func (c *Collector) collect() (map[string]int64, error) {
16 mx := make(map[string]int64)
17
18 if err := c.collectServerStats(mx); err != nil {
19 return nil, err
20 }
21
22 return mx, nil
23 }
24
25 func (c *Collector) collectServerStats(mx map[string]int64) error {
26 stats, err := c.queryServerStats()
27 if err != nil {
28 return err
29 }
30 if stats.IceStats == nil {
31 return fmt.Errorf("unexpected response: no icestats found")
32 }
33 if len(stats.IceStats.Source) == 0 {
34 return fmt.Errorf("no icecast sources found")
35 }
36
37 seen := make(map[string]bool)
38
39 for _, src := range stats.IceStats.Source {
40 name := src.ServerName
41 if name == "" {
42 continue
43 }
44
45 seen[name] = true
46
47 if !c.seenSources[name] {
48 c.seenSources[name] = true
49 c.addSourceCharts(name)
50 }
51
52 px := fmt.Sprintf("source_%s_", name)
53
54 mx[px+"listeners"] = src.Listeners
55 }
56
57 for name := range c.seenSources {
58 if !seen[name] {
59 delete(c.seenSources, name)
60 c.removeSourceCharts(name)
61 }
62 }
63
64 return nil
65 }
66
67 func (c *Collector) queryServerStats() (*serverStats, error) {
68 req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathServerStats)
69 if err != nil {
70 return nil, err
71 }
72
73 var stats serverStats
74 if err := web.DoHTTP(c.httpClient).RequestJSON(req, &stats); err != nil {
75 return nil, err
76 }
77
78 return &stats, nil
79 }