master
go 100 lines 2.22 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package tomcat
4
5 import (
6 "errors"
7 "net/url"
8 "strings"
9
10 "github.com/netdata/netdata/go/plugins/pkg/stm"
11 "github.com/netdata/netdata/go/plugins/pkg/web"
12 )
13
14 var (
15 urlPathServerStatus = "/manager/status"
16 urlQueryServerStatus = url.Values{"XML": {"true"}}.Encode()
17 )
18
19 func (c *Collector) collect() (map[string]int64, error) {
20 mx, err := c.collectServerStatus()
21 if err != nil {
22 return nil, err
23 }
24
25 return mx, nil
26 }
27
28 func (c *Collector) collectServerStatus() (map[string]int64, error) {
29 resp, err := c.queryServerStatus()
30 if err != nil {
31 return nil, err
32 }
33
34 if len(resp.Connectors) == 0 {
35 return nil, errors.New("unexpected response: not tomcat server status data")
36 }
37
38 seenConns, seenPools := make(map[string]bool), make(map[string]bool)
39
40 for i, v := range resp.Connectors {
41 resp.Connectors[i].STMKey = cleanName(v.Name)
42 ti := &resp.Connectors[i].ThreadInfo
43 ti.CurrentThreadsIdle = ti.CurrentThreadCount - ti.CurrentThreadsBusy
44
45 seenConns[v.Name] = true
46 if !c.seenConnectors[v.Name] {
47 c.seenConnectors[v.Name] = true
48 c.addConnectorCharts(v.Name)
49 }
50 }
51
52 for i, v := range resp.JVM.MemoryPools {
53 resp.JVM.MemoryPools[i].STMKey = cleanName(v.Name)
54
55 seenPools[v.Name] = true
56 if !c.seenMemPools[v.Name] {
57 c.seenMemPools[v.Name] = true
58 c.addMemPoolCharts(v.Name, v.Type)
59 }
60 }
61
62 for name := range c.seenConnectors {
63 if !seenConns[name] {
64 delete(c.seenConnectors, name)
65 c.removeConnectorCharts(name)
66 }
67 }
68
69 for name := range c.seenMemPools {
70 if !seenPools[name] {
71 delete(c.seenMemPools, name)
72 c.removeMemoryPoolCharts(name)
73 }
74 }
75
76 resp.JVM.Memory.Used = resp.JVM.Memory.Total - resp.JVM.Memory.Free
77
78 return stm.ToMap(resp), nil
79 }
80
81 func cleanName(name string) string {
82 r := strings.NewReplacer(" ", "_", ".", "_", "\"", "", "'", "")
83 return strings.ToLower(r.Replace(name))
84 }
85
86 func (c *Collector) queryServerStatus() (*serverStatusResponse, error) {
87 req, err := web.NewHTTPRequestWithPath(c.RequestConfig, urlPathServerStatus)
88 if err != nil {
89 return nil, err
90 }
91
92 req.URL.RawQuery = urlQueryServerStatus
93
94 var status serverStatusResponse
95 if err := web.DoHTTP(c.httpClient).RequestXML(req, &status); err != nil {
96 return nil, err
97 }
98
99 return &status, nil
100 }