master
go 275 lines 7.69 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package uwsgi
4
5 import (
6 "fmt"
7 "strconv"
8 "strings"
9
10 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
11 )
12
13 const (
14 prioTransmittedData = collectorapi.Priority + iota
15 prioRequests
16 prioHarakiris
17 prioExceptions
18 prioRespawns
19
20 prioWorkerTransmittedData
21 prioWorkerRequests
22 prioWorkerDeltaRequests
23 prioWorkerAvgRequestTime
24 prioWorkerHarakiris
25 prioWorkerExceptions
26 prioWorkerStatus
27 prioWorkerRequestHandlingStatus
28 prioWorkerRespawns
29 prioWorkerMemoryRss
30 prioWorkerMemoryVsz
31 )
32
33 var charts = collectorapi.Charts{
34 transmittedDataChart.Copy(),
35 requestsChart.Copy(),
36 harakirisChart.Copy(),
37 exceptionsChart.Copy(),
38 respawnsChart.Copy(),
39 }
40
41 var (
42 transmittedDataChart = collectorapi.Chart{
43 ID: "transmitted_data",
44 Title: "UWSGI Transmitted Data",
45 Units: "bytes/s",
46 Fam: "workers",
47 Ctx: "uwsgi.transmitted_data",
48 Priority: prioTransmittedData,
49 Type: collectorapi.Area,
50 Dims: collectorapi.Dims{
51 {ID: "workers_tx", Name: "tx", Algo: collectorapi.Incremental},
52 },
53 }
54 requestsChart = collectorapi.Chart{
55 ID: "requests",
56 Title: "UWSGI Requests",
57 Units: "requests/s",
58 Fam: "workers",
59 Ctx: "uwsgi.requests",
60 Priority: prioRequests,
61 Dims: collectorapi.Dims{
62 {ID: "workers_requests", Name: "requests", Algo: collectorapi.Incremental},
63 },
64 }
65 harakirisChart = collectorapi.Chart{
66 ID: "harakiris",
67 Title: "UWSGI Dropped Requests",
68 Units: "harakiris/s",
69 Fam: "workers",
70 Ctx: "uwsgi.harakiris",
71 Priority: prioHarakiris,
72 Dims: collectorapi.Dims{
73 {ID: "workers_harakiris", Name: "harakiris", Algo: collectorapi.Incremental},
74 },
75 }
76 exceptionsChart = collectorapi.Chart{
77 ID: "exceptions",
78 Title: "UWSGI Raised Exceptions",
79 Units: "exceptions/s",
80 Fam: "workers",
81 Ctx: "uwsgi.exceptions",
82 Priority: prioExceptions,
83 Dims: collectorapi.Dims{
84 {ID: "workers_exceptions", Name: "exceptions", Algo: collectorapi.Incremental},
85 },
86 }
87 respawnsChart = collectorapi.Chart{
88 ID: "respawns",
89 Title: "UWSGI Respawns",
90 Units: "respawns/s",
91 Fam: "workers",
92 Ctx: "uwsgi.respawns",
93 Priority: prioRespawns,
94 Dims: collectorapi.Dims{
95 {ID: "workers_respawns", Name: "respawns", Algo: collectorapi.Incremental},
96 },
97 }
98 )
99
100 var workerChartsTmpl = collectorapi.Charts{
101 workerTransmittedDataChartTmpl.Copy(),
102 workerRequestsChartTmpl.Copy(),
103 workerDeltaRequestsChartTmpl.Copy(),
104 workerAvgRequestTimeChartTmpl.Copy(),
105 workerHarakirisChartTmpl.Copy(),
106 workerExceptionsChartTmpl.Copy(),
107 workerStatusChartTmpl.Copy(),
108 workerRequestHandlingStatusChartTmpl.Copy(),
109 workerRespawnsChartTmpl.Copy(),
110 workerMemoryRssChartTmpl.Copy(),
111 workerMemoryVszChartTmpl.Copy(),
112 }
113
114 var (
115 workerTransmittedDataChartTmpl = collectorapi.Chart{
116 ID: "worker_%s_transmitted_data",
117 Title: "UWSGI Worker Transmitted Data",
118 Units: "bytes/s",
119 Fam: "wrk transmitted data",
120 Ctx: "uwsgi.worker_transmitted_data",
121 Priority: prioWorkerTransmittedData,
122 Type: collectorapi.Area,
123 Dims: collectorapi.Dims{
124 {ID: "worker_%s_tx", Name: "tx", Algo: collectorapi.Incremental},
125 },
126 }
127 workerRequestsChartTmpl = collectorapi.Chart{
128 ID: "worker_%s_requests",
129 Title: "UWSGI Worker Requests",
130 Units: "requests/s",
131 Fam: "wrk requests",
132 Ctx: "uwsgi.worker_requests",
133 Priority: prioWorkerRequests,
134 Dims: collectorapi.Dims{
135 {ID: "worker_%s_requests", Name: "requests", Algo: collectorapi.Incremental},
136 },
137 }
138 workerDeltaRequestsChartTmpl = collectorapi.Chart{
139 ID: "worker_%s_delta_requests",
140 Title: "UWSGI Worker Delta Requests",
141 Units: "requests/s",
142 Fam: "wrk requests",
143 Ctx: "uwsgi.worker_delta_requests",
144 Priority: prioWorkerDeltaRequests,
145 Dims: collectorapi.Dims{
146 {ID: "worker_%s_delta_requests", Name: "delta_requests", Algo: collectorapi.Incremental},
147 },
148 }
149 workerAvgRequestTimeChartTmpl = collectorapi.Chart{
150 ID: "worker_%s_average_request_time",
151 Title: "UWSGI Worker Average Request Time",
152 Units: "milliseconds",
153 Fam: "wrk request time",
154 Ctx: "uwsgi.worker_average_request_time",
155 Priority: prioWorkerAvgRequestTime,
156 Dims: collectorapi.Dims{
157 {ID: "worker_%s_average_request_time", Name: "avg"},
158 },
159 }
160 workerHarakirisChartTmpl = collectorapi.Chart{
161 ID: "worker_%s_harakiris",
162 Title: "UWSGI Worker Dropped Requests",
163 Units: "harakiris/s",
164 Fam: "wrk harakiris",
165 Ctx: "uwsgi.worker_harakiris",
166 Priority: prioWorkerHarakiris,
167 Dims: collectorapi.Dims{
168 {ID: "worker_%s_harakiris", Name: "harakiris", Algo: collectorapi.Incremental},
169 },
170 }
171 workerExceptionsChartTmpl = collectorapi.Chart{
172 ID: "worker_%s_exceptions",
173 Title: "UWSGI Worker Raised Exceptions",
174 Units: "exceptions/s",
175 Fam: "wrk exceptions",
176 Ctx: "uwsgi.worker_exceptions",
177 Priority: prioWorkerExceptions,
178 Dims: collectorapi.Dims{
179 {ID: "worker_%s_exceptions", Name: "exceptions", Algo: collectorapi.Incremental},
180 },
181 }
182 workerStatusChartTmpl = collectorapi.Chart{
183 ID: "worker_%s_status",
184 Title: "UWSGI Worker Status",
185 Units: "status",
186 Fam: "wrk status",
187 Ctx: "uwsgi.status",
188 Priority: prioWorkerStatus,
189 Dims: collectorapi.Dims{
190 {ID: "worker_%s_status_idle", Name: "idle"},
191 {ID: "worker_%s_status_busy", Name: "busy"},
192 {ID: "worker_%s_status_cheap", Name: "cheap"},
193 {ID: "worker_%s_status_pause", Name: "pause"},
194 {ID: "worker_%s_status_sig", Name: "sig"},
195 },
196 }
197 workerRequestHandlingStatusChartTmpl = collectorapi.Chart{
198 ID: "worker_%s_request_handling_status",
199 Title: "UWSGI Worker Request Handling Status",
200 Units: "status",
201 Fam: "wrk status",
202 Ctx: "uwsgi.request_handling_status",
203 Priority: prioWorkerRequestHandlingStatus,
204 Dims: collectorapi.Dims{
205 {ID: "worker_%s_request_handling_status_accepting", Name: "accepting"},
206 {ID: "worker_%s_request_handling_status_not_accepting", Name: "not_accepting"},
207 },
208 }
209 workerRespawnsChartTmpl = collectorapi.Chart{
210 ID: "worker_%s_respawns",
211 Title: "UWSGI Worker Respawns",
212 Units: "respawns/s",
213 Fam: "wrk respawns",
214 Ctx: "uwsgi.worker_respawns",
215 Priority: prioWorkerRespawns,
216 Dims: collectorapi.Dims{
217 {ID: "worker_%s_respawns", Name: "respawns", Algo: collectorapi.Incremental},
218 },
219 }
220 workerMemoryRssChartTmpl = collectorapi.Chart{
221 ID: "worker_%s_memory_rss",
222 Title: "UWSGI Worker Memory RSS (Resident Set Size)",
223 Units: "bytes",
224 Fam: "wrk memory",
225 Ctx: "uwsgi.worker_memory_rss",
226 Priority: prioWorkerMemoryRss,
227 Type: collectorapi.Area,
228 Dims: collectorapi.Dims{
229 {ID: "worker_%s_memory_rss", Name: "rss"},
230 },
231 }
232 workerMemoryVszChartTmpl = collectorapi.Chart{
233 ID: "worker_%s_memory_vsz",
234 Title: "UWSGI Worker Memory VSZ (Virtual Memory Size)",
235 Units: "bytes",
236 Fam: "wrk memory",
237 Ctx: "uwsgi.worker_memory_vsz",
238 Priority: prioWorkerMemoryVsz,
239 Type: collectorapi.Area,
240 Dims: collectorapi.Dims{
241 {ID: "worker_%s_memory_vsz", Name: "vsz"},
242 },
243 }
244 )
245
246 func (c *Collector) addWorkerCharts(workerID int) {
247 charts := workerChartsTmpl.Copy()
248
249 id := strconv.Itoa(workerID)
250
251 for _, chart := range *charts {
252 chart.ID = fmt.Sprintf(chart.ID, id)
253 chart.Labels = []collectorapi.Label{
254 {Key: "worker_id", Value: id},
255 }
256 for _, dim := range chart.Dims {
257 dim.ID = fmt.Sprintf(dim.ID, id)
258 }
259 }
260
261 if err := c.Charts().Add(*charts...); err != nil {
262 c.Warning(err)
263 }
264 }
265
266 func (c *Collector) removeWorkerCharts(workerID int) {
267 px := fmt.Sprintf("worker_%d_", workerID)
268
269 for _, chart := range *c.Charts() {
270 if strings.HasPrefix(chart.ID, px) {
271 chart.MarkRemove()
272 chart.MarkNotCreated()
273 }
274 }
275 }