github.com/netdata/go.d.plugin@v0.58.1/modules/squidlog/charts.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package squidlog 4 5 import ( 6 "errors" 7 8 "github.com/netdata/go.d.plugin/agent/module" 9 ) 10 11 type ( 12 Charts = module.Charts 13 Chart = module.Chart 14 Dims = module.Dims 15 Dim = module.Dim 16 ) 17 18 const ( 19 prioReqTotal = module.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: module.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: module.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: module.Stacked, 78 Priority: prioReqType, 79 Dims: Dims{ 80 {ID: "req_type_success", Name: "success", Algo: module.Incremental}, 81 {ID: "req_type_bad", Name: "bad", Algo: module.Incremental}, 82 {ID: "req_type_redirect", Name: "redirect", Algo: module.Incremental}, 83 {ID: "req_type_error", Name: "error", Algo: module.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: module.Stacked, 95 Priority: prioHTTPRespCodesClass, 96 Dims: Dims{ 97 {ID: "http_resp_2xx", Name: "2xx", Algo: module.Incremental}, 98 {ID: "http_resp_5xx", Name: "5xx", Algo: module.Incremental}, 99 {ID: "http_resp_3xx", Name: "3xx", Algo: module.Incremental}, 100 {ID: "http_resp_4xx", Name: "4xx", Algo: module.Incremental}, 101 {ID: "http_resp_1xx", Name: "1xx", Algo: module.Incremental}, 102 {ID: "http_resp_0xx", Name: "0xx", Algo: module.Incremental}, 103 {ID: "http_resp_6xx", Name: "6xx", Algo: module.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: module.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: module.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: module.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: module.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: module.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: module.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: module.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: module.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: module.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: module.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: module.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: module.Stacked, 252 Priority: prioServers, 253 } 254 ) 255 256 func (s *SquidLog) 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 s.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 }