master
go 196 lines 5.4 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package tomcat
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10 )
11
12 const (
13 prioConnectorRequestsCount = collectorapi.Priority + iota
14 prioConnectorRequestsBandwidth
15 prioConnectorRequestsProcessingTime
16 prioConnectorRequestsErrors
17
18 prioConnectorRequestThreads
19
20 prioJvmMemoryUsage
21
22 prioJvmMemoryPoolMemoryUsage
23 )
24
25 var (
26 defaultCharts = collectorapi.Charts{
27 jvmMemoryUsageChart.Copy(),
28 }
29
30 jvmMemoryUsageChart = collectorapi.Chart{
31 ID: "jvm_memory_usage",
32 Title: "JVM Memory Usage",
33 Units: "bytes",
34 Fam: "memory",
35 Ctx: "tomcat.jvm_memory_usage",
36 Type: collectorapi.Stacked,
37 Priority: prioJvmMemoryUsage,
38 Dims: collectorapi.Dims{
39 {ID: "jvm_memory_free", Name: "free"},
40 {ID: "jvm_memory_used", Name: "used"},
41 },
42 }
43 )
44
45 var (
46 connectorChartsTmpl = collectorapi.Charts{
47 connectorRequestsCountChartTmpl.Copy(),
48 connectorRequestsBandwidthChartTmpl.Copy(),
49 connectorRequestsProcessingTimeChartTmpl.Copy(),
50 connectorRequestsErrorsChartTmpl.Copy(),
51 connectorRequestThreadsChartTmpl.Copy(),
52 }
53
54 connectorRequestsCountChartTmpl = collectorapi.Chart{
55 ID: "connector_%_requests",
56 Title: "Connector Requests",
57 Units: "requests/s",
58 Fam: "requests",
59 Ctx: "tomcat.connector_requests",
60 Type: collectorapi.Line,
61 Priority: prioConnectorRequestsCount,
62 Dims: collectorapi.Dims{
63 {ID: "connector_%s_request_info_request_count", Name: "requests", Algo: collectorapi.Incremental},
64 },
65 }
66 connectorRequestsBandwidthChartTmpl = collectorapi.Chart{
67 ID: "connector_%s_requests_bandwidth",
68 Title: "Connector Requests Bandwidth",
69 Units: "bytes/s",
70 Fam: "requests",
71 Ctx: "tomcat.connector_bandwidth",
72 Type: collectorapi.Area,
73 Priority: prioConnectorRequestsBandwidth,
74 Dims: collectorapi.Dims{
75 {ID: "connector_%s_request_info_bytes_received", Name: "received", Algo: collectorapi.Incremental},
76 {ID: "connector_%s_request_info_bytes_sent", Name: "sent", Mul: -1, Algo: collectorapi.Incremental},
77 },
78 }
79 connectorRequestsProcessingTimeChartTmpl = collectorapi.Chart{
80 ID: "connector_%_requests_processing_time",
81 Title: "Connector Requests Processing Time",
82 Units: "milliseconds",
83 Fam: "requests",
84 Ctx: "tomcat.connector_requests_processing_time",
85 Type: collectorapi.Line,
86 Priority: prioConnectorRequestsProcessingTime,
87 Dims: collectorapi.Dims{
88 {ID: "connector_%s_request_info_processing_time", Name: "processing_time", Algo: collectorapi.Incremental},
89 },
90 }
91 connectorRequestsErrorsChartTmpl = collectorapi.Chart{
92 ID: "connector_%_errors",
93 Title: "Connector Errors",
94 Units: "errors/s",
95 Fam: "requests",
96 Ctx: "tomcat.connector_errors",
97 Type: collectorapi.Line,
98 Priority: prioConnectorRequestsErrors,
99 Dims: collectorapi.Dims{
100 {ID: "connector_%s_request_info_error_count", Name: "errors", Algo: collectorapi.Incremental},
101 },
102 }
103
104 connectorRequestThreadsChartTmpl = collectorapi.Chart{
105 ID: "connector_%s_request_threads",
106 Title: "Connector RequestConfig Threads",
107 Units: "threads",
108 Fam: "threads",
109 Ctx: "tomcat.connector_request_threads",
110 Type: collectorapi.Stacked,
111 Priority: prioConnectorRequestThreads,
112 Dims: collectorapi.Dims{
113 {ID: "connector_%s_thread_info_idle", Name: "idle"},
114 {ID: "connector_%s_thread_info_busy", Name: "busy"},
115 },
116 }
117 )
118
119 var (
120 jvmMemoryPoolChartsTmpl = collectorapi.Charts{
121 jvmMemoryPoolMemoryUsageChartTmpl.Copy(),
122 }
123
124 jvmMemoryPoolMemoryUsageChartTmpl = collectorapi.Chart{
125 ID: "jvm_mem_pool_%s_memory_usage",
126 Title: "JVM Mem Pool Memory Usage",
127 Units: "bytes",
128 Fam: "memory",
129 Ctx: "tomcat.jvm_mem_pool_memory_usage",
130 Type: collectorapi.Area,
131 Priority: prioJvmMemoryPoolMemoryUsage,
132 Dims: collectorapi.Dims{
133 {ID: "jvm_memorypool_%s_commited", Name: "commited"},
134 {ID: "jvm_memorypool_%s_used", Name: "used"},
135 {ID: "jvm_memorypool_%s_max", Name: "max"},
136 },
137 }
138 )
139
140 func (c *Collector) addConnectorCharts(name string) {
141 charts := connectorChartsTmpl.Copy()
142
143 for _, chart := range *charts {
144 chart.ID = fmt.Sprintf(chart.ID, cleanName(name))
145 chart.Labels = []collectorapi.Label{
146 {Key: "connector_name", Value: strings.Trim(name, "\"")},
147 }
148 for _, dim := range chart.Dims {
149 dim.ID = fmt.Sprintf(dim.ID, cleanName(name))
150 }
151 }
152
153 if err := c.Charts().Add(*charts...); err != nil {
154 c.Warning(err)
155 }
156 }
157
158 func (c *Collector) addMemPoolCharts(name, typ string) {
159 name = strings.ReplaceAll(name, "'", "")
160
161 charts := jvmMemoryPoolChartsTmpl.Copy()
162
163 for _, chart := range *charts {
164 chart.ID = fmt.Sprintf(chart.ID, cleanName(name))
165 chart.Labels = []collectorapi.Label{
166 {Key: "mempool_name", Value: name},
167 {Key: "mempool_type", Value: typ},
168 }
169 for _, dim := range chart.Dims {
170 dim.ID = fmt.Sprintf(dim.ID, cleanName(name))
171 }
172 }
173
174 if err := c.Charts().Add(*charts...); err != nil {
175 c.Warning(err)
176 }
177 }
178
179 func (c *Collector) removeConnectorCharts(name string) {
180 px := fmt.Sprintf("connector_%s_", cleanName(name))
181 c.removeCharts(px)
182 }
183
184 func (c *Collector) removeMemoryPoolCharts(name string) {
185 px := fmt.Sprintf("jvm_mem_pool_%s_", cleanName(name))
186 c.removeCharts(px)
187 }
188
189 func (c *Collector) removeCharts(prefix string) {
190 for _, chart := range *c.Charts() {
191 if strings.HasPrefix(chart.ID, prefix) {
192 chart.MarkRemove()
193 chart.MarkNotCreated()
194 }
195 }
196 }