master
go 368 lines 9.12 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package squidlog
4
5 import (
6 "errors"
7
8 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
9 )
10
11 type (
12 Charts = collectorapi.Charts
13 Chart = collectorapi.Chart
14 Dims = collectorapi.Dims
15 Dim = collectorapi.Dim
16 )
17
18 const (
19 prioReqTotal = collectorapi.Priority + iota
20 prioReqExcluded
21 prioReqType
22
23 prioHTTPRespCodesClass
24 prioHTTPRespCodes
25
26 prioUniqClients
27
28 prioBandwidth
29
30 prioRespTime
31
32 prioCacheCode
33 prioCacheTransportTag
34 prioCacheHandlingTag
35 prioCacheObjectTag
36 prioCacheLoadSourceTag
37 prioCacheErrorTag
38
39 prioReqMethod
40
41 prioHierCode
42 prioServers
43
44 prioMimeType
45 )
46
47 var (
48 // Requests
49 reqTotalChart = Chart{
50 ID: "requests",
51 Title: "Total Requests",
52 Units: "requests/s",
53 Fam: "requests",
54 Ctx: "squidlog.requests",
55 Priority: prioReqTotal,
56 Dims: Dims{
57 {ID: "requests", Algo: collectorapi.Incremental},
58 },
59 }
60 reqExcludedChart = Chart{
61 ID: "excluded_requests",
62 Title: "Excluded Requests",
63 Units: "requests/s",
64 Fam: "requests",
65 Ctx: "squidlog.excluded_requests",
66 Priority: prioReqExcluded,
67 Dims: Dims{
68 {ID: "unmatched", Algo: collectorapi.Incremental},
69 },
70 }
71 reqTypesChart = Chart{
72 ID: "requests_by_type",
73 Title: "Requests By Type",
74 Units: "requests/s",
75 Fam: "requests",
76 Ctx: "squidlog.type_requests",
77 Type: collectorapi.Stacked,
78 Priority: prioReqType,
79 Dims: Dims{
80 {ID: "req_type_success", Name: "success", Algo: collectorapi.Incremental},
81 {ID: "req_type_bad", Name: "bad", Algo: collectorapi.Incremental},
82 {ID: "req_type_redirect", Name: "redirect", Algo: collectorapi.Incremental},
83 {ID: "req_type_error", Name: "error", Algo: collectorapi.Incremental},
84 },
85 }
86
87 // HTTP Code
88 httpRespCodeClassChart = Chart{
89 ID: "responses_by_http_status_code_class",
90 Title: "Responses By HTTP Status Code Class",
91 Units: "responses/s",
92 Fam: "http code",
93 Ctx: "squidlog.http_status_code_class_responses",
94 Type: collectorapi.Stacked,
95 Priority: prioHTTPRespCodesClass,
96 Dims: Dims{
97 {ID: "http_resp_2xx", Name: "2xx", Algo: collectorapi.Incremental},
98 {ID: "http_resp_5xx", Name: "5xx", Algo: collectorapi.Incremental},
99 {ID: "http_resp_3xx", Name: "3xx", Algo: collectorapi.Incremental},
100 {ID: "http_resp_4xx", Name: "4xx", Algo: collectorapi.Incremental},
101 {ID: "http_resp_1xx", Name: "1xx", Algo: collectorapi.Incremental},
102 {ID: "http_resp_0xx", Name: "0xx", Algo: collectorapi.Incremental},
103 {ID: "http_resp_6xx", Name: "6xx", Algo: collectorapi.Incremental},
104 },
105 }
106 httpRespCodesChart = Chart{
107 ID: "responses_by_http_status_code",
108 Title: "Responses By HTTP Status Code",
109 Units: "responses/s",
110 Fam: "http code",
111 Ctx: "squidlog.http_status_code_responses",
112 Type: collectorapi.Stacked,
113 Priority: prioHTTPRespCodes,
114 }
115
116 // Bandwidth
117 bandwidthChart = Chart{
118 ID: "bandwidth",
119 Title: "Bandwidth",
120 Units: "kilobits/s",
121 Fam: "bandwidth",
122 Ctx: "squidlog.bandwidth",
123 Priority: prioBandwidth,
124 Dims: Dims{
125 {ID: "bytes_sent", Name: "sent", Algo: collectorapi.Incremental, Div: 1000},
126 },
127 }
128
129 // Response Time
130 respTimeChart = Chart{
131 ID: "response_time",
132 Title: "Response Time",
133 Units: "milliseconds",
134 Fam: "timings",
135 Ctx: "squidlog.response_time",
136 Priority: prioRespTime,
137 Dims: Dims{
138 {ID: "resp_time_min", Name: "min", Div: 1000},
139 {ID: "resp_time_max", Name: "max", Div: 1000},
140 {ID: "resp_time_avg", Name: "avg", Div: 1000},
141 },
142 }
143
144 // Clients
145 uniqClientsChart = Chart{
146 ID: "uniq_clients",
147 Title: "Unique Clients",
148 Units: "clients/s",
149 Fam: "clients",
150 Ctx: "squidlog.uniq_clients",
151 Priority: prioUniqClients,
152 Dims: Dims{
153 {ID: "uniq_clients", Name: "clients"},
154 },
155 }
156
157 // Cache Code Result
158 cacheCodeChart = Chart{
159 ID: "requests_by_cache_result_code",
160 Title: "Requests By Cache Result Code",
161 Units: "requests/s",
162 Fam: "cache result",
163 Ctx: "squidlog.cache_result_code_requests",
164 Priority: prioCacheCode,
165 Type: collectorapi.Stacked,
166 }
167 cacheCodeTransportTagChart = Chart{
168 ID: "requests_by_cache_result_code_transport_tag",
169 Title: "Requests By Cache Result Delivery Transport Tag",
170 Units: "requests/s",
171 Fam: "cache result",
172 Ctx: "squidlog.cache_result_code_transport_tag_requests",
173 Type: collectorapi.Stacked,
174 Priority: prioCacheTransportTag,
175 }
176 cacheCodeHandlingTagChart = Chart{
177 ID: "requests_by_cache_result_code_handling_tag",
178 Title: "Requests By Cache Result Handling Tag",
179 Units: "requests/s",
180 Fam: "cache result",
181 Ctx: "squidlog.cache_result_code_handling_tag_requests",
182 Type: collectorapi.Stacked,
183 Priority: prioCacheHandlingTag,
184 }
185 cacheCodeObjectTagChart = Chart{
186 ID: "requests_by_cache_code_object_tag",
187 Title: "Requests By Cache Result Produced Object Tag",
188 Units: "requests/s",
189 Fam: "cache result",
190 Ctx: "squidlog.cache_code_object_tag_requests",
191 Type: collectorapi.Stacked,
192 Priority: prioCacheObjectTag,
193 }
194 cacheCodeLoadSourceTagChart = Chart{
195 ID: "requests_by_cache_code_load_source_tag",
196 Title: "Requests By Cache Result Load Source Tag",
197 Units: "requests/s",
198 Fam: "cache result",
199 Ctx: "squidlog.cache_code_load_source_tag_requests",
200 Type: collectorapi.Stacked,
201 Priority: prioCacheLoadSourceTag,
202 }
203 cacheCodeErrorTagChart = Chart{
204 ID: "requests_by_cache_code_error_tag",
205 Title: "Requests By Cache Result Errors Tag",
206 Units: "requests/s",
207 Fam: "cache result",
208 Ctx: "squidlog.cache_code_error_tag_requests",
209 Type: collectorapi.Stacked,
210 Priority: prioCacheErrorTag,
211 }
212
213 // HTTP Method
214 reqMethodChart = Chart{
215 ID: "requests_by_http_method",
216 Title: "Requests By HTTP Method",
217 Units: "requests/s",
218 Fam: "http method",
219 Ctx: "squidlog.http_method_requests",
220 Type: collectorapi.Stacked,
221 Priority: prioReqMethod,
222 }
223
224 // MIME Type
225 mimeTypeChart = Chart{
226 ID: "requests_by_mime_type",
227 Title: "Requests By MIME Type",
228 Units: "requests/s",
229 Fam: "mime type",
230 Ctx: "squidlog.mime_type_requests",
231 Type: collectorapi.Stacked,
232 Priority: prioMimeType,
233 }
234
235 // Hierarchy
236 hierCodeChart = Chart{
237 ID: "requests_by_hier_code",
238 Title: "Requests By Hierarchy Code",
239 Units: "requests/s",
240 Fam: "hierarchy",
241 Ctx: "squidlog.hier_code_requests",
242 Type: collectorapi.Stacked,
243 Priority: prioHierCode,
244 }
245 serverAddrChart = Chart{
246 ID: "forwarded_requests_by_server_address",
247 Title: "Forwarded Requests By Server Address",
248 Units: "requests/s",
249 Fam: "hierarchy",
250 Ctx: "squidlog.server_address_forwarded_requests",
251 Type: collectorapi.Stacked,
252 Priority: prioServers,
253 }
254 )
255
256 func (c *Collector) createCharts(line *logLine) error {
257 if line.empty() {
258 return errors.New("empty line")
259 }
260 charts := &Charts{
261 reqTotalChart.Copy(),
262 reqExcludedChart.Copy(),
263 }
264 if line.hasRespTime() {
265 if err := addRespTimeCharts(charts); err != nil {
266 return err
267 }
268 }
269 if line.hasClientAddress() {
270 if err := addClientAddressCharts(charts); err != nil {
271 return err
272 }
273 }
274 if line.hasCacheCode() {
275 if err := addCacheCodeCharts(charts); err != nil {
276 return err
277 }
278 }
279 if line.hasHTTPCode() {
280 if err := addHTTPRespCodeCharts(charts); err != nil {
281 return err
282 }
283 }
284 if line.hasRespSize() {
285 if err := addRespSizeCharts(charts); err != nil {
286 return err
287 }
288 }
289 if line.hasReqMethod() {
290 if err := addMethodCharts(charts); err != nil {
291 return err
292 }
293 }
294 if line.hasHierCode() {
295 if err := addHierCodeCharts(charts); err != nil {
296 return err
297 }
298 }
299 if line.hasServerAddress() {
300 if err := addServerAddressCharts(charts); err != nil {
301 return err
302 }
303 }
304 if line.hasMimeType() {
305 if err := addMimeTypeCharts(charts); err != nil {
306 return err
307 }
308 }
309 c.charts = charts
310 return nil
311 }
312
313 func addRespTimeCharts(charts *Charts) error {
314 return charts.Add(respTimeChart.Copy())
315 }
316
317 func addClientAddressCharts(charts *Charts) error {
318 return charts.Add(uniqClientsChart.Copy())
319 }
320
321 func addCacheCodeCharts(charts *Charts) error {
322 cs := []Chart{
323 cacheCodeChart,
324 cacheCodeTransportTagChart,
325 cacheCodeHandlingTagChart,
326 cacheCodeObjectTagChart,
327 cacheCodeLoadSourceTagChart,
328 cacheCodeErrorTagChart,
329 }
330 for _, chart := range cs {
331 if err := charts.Add(chart.Copy()); err != nil {
332 return err
333 }
334 }
335 return nil
336 }
337 func addHTTPRespCodeCharts(charts *Charts) error {
338 cs := []Chart{
339 reqTypesChart,
340 httpRespCodeClassChart,
341 httpRespCodesChart,
342 }
343 for _, chart := range cs {
344 if err := charts.Add(chart.Copy()); err != nil {
345 return err
346 }
347 }
348 return nil
349 }
350
351 func addRespSizeCharts(charts *Charts) error {
352 return charts.Add(bandwidthChart.Copy())
353 }
354
355 func addMethodCharts(charts *Charts) error {
356 return charts.Add(reqMethodChart.Copy())
357 }
358
359 func addHierCodeCharts(charts *Charts) error {
360 return charts.Add(hierCodeChart.Copy())
361 }
362 func addServerAddressCharts(charts *Charts) error {
363 return charts.Add(serverAddrChart.Copy())
364 }
365
366 func addMimeTypeCharts(charts *Charts) error {
367 return charts.Add(mimeTypeChart.Copy())
368 }