diff options
Diffstat (limited to 'src/go/plugin/go.d/modules/squidlog/charts.go')
-rw-r--r-- | src/go/plugin/go.d/modules/squidlog/charts.go | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/src/go/plugin/go.d/modules/squidlog/charts.go b/src/go/plugin/go.d/modules/squidlog/charts.go new file mode 100644 index 000000000..92875eaf9 --- /dev/null +++ b/src/go/plugin/go.d/modules/squidlog/charts.go @@ -0,0 +1,368 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package squidlog + +import ( + "errors" + + "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module" +) + +type ( + Charts = module.Charts + Chart = module.Chart + Dims = module.Dims + Dim = module.Dim +) + +const ( + prioReqTotal = module.Priority + iota + prioReqExcluded + prioReqType + + prioHTTPRespCodesClass + prioHTTPRespCodes + + prioUniqClients + + prioBandwidth + + prioRespTime + + prioCacheCode + prioCacheTransportTag + prioCacheHandlingTag + prioCacheObjectTag + prioCacheLoadSourceTag + prioCacheErrorTag + + prioReqMethod + + prioHierCode + prioServers + + prioMimeType +) + +var ( + // Requests + reqTotalChart = Chart{ + ID: "requests", + Title: "Total Requests", + Units: "requests/s", + Fam: "requests", + Ctx: "squidlog.requests", + Priority: prioReqTotal, + Dims: Dims{ + {ID: "requests", Algo: module.Incremental}, + }, + } + reqExcludedChart = Chart{ + ID: "excluded_requests", + Title: "Excluded Requests", + Units: "requests/s", + Fam: "requests", + Ctx: "squidlog.excluded_requests", + Priority: prioReqExcluded, + Dims: Dims{ + {ID: "unmatched", Algo: module.Incremental}, + }, + } + reqTypesChart = Chart{ + ID: "requests_by_type", + Title: "Requests By Type", + Units: "requests/s", + Fam: "requests", + Ctx: "squidlog.type_requests", + Type: module.Stacked, + Priority: prioReqType, + Dims: Dims{ + {ID: "req_type_success", Name: "success", Algo: module.Incremental}, + {ID: "req_type_bad", Name: "bad", Algo: module.Incremental}, + {ID: "req_type_redirect", Name: "redirect", Algo: module.Incremental}, + {ID: "req_type_error", Name: "error", Algo: module.Incremental}, + }, + } + + // HTTP Code + httpRespCodeClassChart = Chart{ + ID: "responses_by_http_status_code_class", + Title: "Responses By HTTP Status Code Class", + Units: "responses/s", + Fam: "http code", + Ctx: "squidlog.http_status_code_class_responses", + Type: module.Stacked, + Priority: prioHTTPRespCodesClass, + Dims: Dims{ + {ID: "http_resp_2xx", Name: "2xx", Algo: module.Incremental}, + {ID: "http_resp_5xx", Name: "5xx", Algo: module.Incremental}, + {ID: "http_resp_3xx", Name: "3xx", Algo: module.Incremental}, + {ID: "http_resp_4xx", Name: "4xx", Algo: module.Incremental}, + {ID: "http_resp_1xx", Name: "1xx", Algo: module.Incremental}, + {ID: "http_resp_0xx", Name: "0xx", Algo: module.Incremental}, + {ID: "http_resp_6xx", Name: "6xx", Algo: module.Incremental}, + }, + } + httpRespCodesChart = Chart{ + ID: "responses_by_http_status_code", + Title: "Responses By HTTP Status Code", + Units: "responses/s", + Fam: "http code", + Ctx: "squidlog.http_status_code_responses", + Type: module.Stacked, + Priority: prioHTTPRespCodes, + } + + // Bandwidth + bandwidthChart = Chart{ + ID: "bandwidth", + Title: "Bandwidth", + Units: "kilobits/s", + Fam: "bandwidth", + Ctx: "squidlog.bandwidth", + Priority: prioBandwidth, + Dims: Dims{ + {ID: "bytes_sent", Name: "sent", Algo: module.Incremental, Div: 1000}, + }, + } + + // Response Time + respTimeChart = Chart{ + ID: "response_time", + Title: "Response Time", + Units: "milliseconds", + Fam: "timings", + Ctx: "squidlog.response_time", + Priority: prioRespTime, + Dims: Dims{ + {ID: "resp_time_min", Name: "min", Div: 1000}, + {ID: "resp_time_max", Name: "max", Div: 1000}, + {ID: "resp_time_avg", Name: "avg", Div: 1000}, + }, + } + + // Clients + uniqClientsChart = Chart{ + ID: "uniq_clients", + Title: "Unique Clients", + Units: "clients/s", + Fam: "clients", + Ctx: "squidlog.uniq_clients", + Priority: prioUniqClients, + Dims: Dims{ + {ID: "uniq_clients", Name: "clients"}, + }, + } + + // Cache Code Result + cacheCodeChart = Chart{ + ID: "requests_by_cache_result_code", + Title: "Requests By Cache Result Code", + Units: "requests/s", + Fam: "cache result", + Ctx: "squidlog.cache_result_code_requests", + Priority: prioCacheCode, + Type: module.Stacked, + } + cacheCodeTransportTagChart = Chart{ + ID: "requests_by_cache_result_code_transport_tag", + Title: "Requests By Cache Result Delivery Transport Tag", + Units: "requests/s", + Fam: "cache result", + Ctx: "squidlog.cache_result_code_transport_tag_requests", + Type: module.Stacked, + Priority: prioCacheTransportTag, + } + cacheCodeHandlingTagChart = Chart{ + ID: "requests_by_cache_result_code_handling_tag", + Title: "Requests By Cache Result Handling Tag", + Units: "requests/s", + Fam: "cache result", + Ctx: "squidlog.cache_result_code_handling_tag_requests", + Type: module.Stacked, + Priority: prioCacheHandlingTag, + } + cacheCodeObjectTagChart = Chart{ + ID: "requests_by_cache_code_object_tag", + Title: "Requests By Cache Result Produced Object Tag", + Units: "requests/s", + Fam: "cache result", + Ctx: "squidlog.cache_code_object_tag_requests", + Type: module.Stacked, + Priority: prioCacheObjectTag, + } + cacheCodeLoadSourceTagChart = Chart{ + ID: "requests_by_cache_code_load_source_tag", + Title: "Requests By Cache Result Load Source Tag", + Units: "requests/s", + Fam: "cache result", + Ctx: "squidlog.cache_code_load_source_tag_requests", + Type: module.Stacked, + Priority: prioCacheLoadSourceTag, + } + cacheCodeErrorTagChart = Chart{ + ID: "requests_by_cache_code_error_tag", + Title: "Requests By Cache Result Errors Tag", + Units: "requests/s", + Fam: "cache result", + Ctx: "squidlog.cache_code_error_tag_requests", + Type: module.Stacked, + Priority: prioCacheErrorTag, + } + + // HTTP Method + reqMethodChart = Chart{ + ID: "requests_by_http_method", + Title: "Requests By HTTP Method", + Units: "requests/s", + Fam: "http method", + Ctx: "squidlog.http_method_requests", + Type: module.Stacked, + Priority: prioReqMethod, + } + + // MIME Type + mimeTypeChart = Chart{ + ID: "requests_by_mime_type", + Title: "Requests By MIME Type", + Units: "requests/s", + Fam: "mime type", + Ctx: "squidlog.mime_type_requests", + Type: module.Stacked, + Priority: prioMimeType, + } + + // Hierarchy + hierCodeChart = Chart{ + ID: "requests_by_hier_code", + Title: "Requests By Hierarchy Code", + Units: "requests/s", + Fam: "hierarchy", + Ctx: "squidlog.hier_code_requests", + Type: module.Stacked, + Priority: prioHierCode, + } + serverAddrChart = Chart{ + ID: "forwarded_requests_by_server_address", + Title: "Forwarded Requests By Server Address", + Units: "requests/s", + Fam: "hierarchy", + Ctx: "squidlog.server_address_forwarded_requests", + Type: module.Stacked, + Priority: prioServers, + } +) + +func (s *SquidLog) createCharts(line *logLine) error { + if line.empty() { + return errors.New("empty line") + } + charts := &Charts{ + reqTotalChart.Copy(), + reqExcludedChart.Copy(), + } + if line.hasRespTime() { + if err := addRespTimeCharts(charts); err != nil { + return err + } + } + if line.hasClientAddress() { + if err := addClientAddressCharts(charts); err != nil { + return err + } + } + if line.hasCacheCode() { + if err := addCacheCodeCharts(charts); err != nil { + return err + } + } + if line.hasHTTPCode() { + if err := addHTTPRespCodeCharts(charts); err != nil { + return err + } + } + if line.hasRespSize() { + if err := addRespSizeCharts(charts); err != nil { + return err + } + } + if line.hasReqMethod() { + if err := addMethodCharts(charts); err != nil { + return err + } + } + if line.hasHierCode() { + if err := addHierCodeCharts(charts); err != nil { + return err + } + } + if line.hasServerAddress() { + if err := addServerAddressCharts(charts); err != nil { + return err + } + } + if line.hasMimeType() { + if err := addMimeTypeCharts(charts); err != nil { + return err + } + } + s.charts = charts + return nil +} + +func addRespTimeCharts(charts *Charts) error { + return charts.Add(respTimeChart.Copy()) +} + +func addClientAddressCharts(charts *Charts) error { + return charts.Add(uniqClientsChart.Copy()) +} + +func addCacheCodeCharts(charts *Charts) error { + cs := []Chart{ + cacheCodeChart, + cacheCodeTransportTagChart, + cacheCodeHandlingTagChart, + cacheCodeObjectTagChart, + cacheCodeLoadSourceTagChart, + cacheCodeErrorTagChart, + } + for _, chart := range cs { + if err := charts.Add(chart.Copy()); err != nil { + return err + } + } + return nil +} +func addHTTPRespCodeCharts(charts *Charts) error { + cs := []Chart{ + reqTypesChart, + httpRespCodeClassChart, + httpRespCodesChart, + } + for _, chart := range cs { + if err := charts.Add(chart.Copy()); err != nil { + return err + } + } + return nil +} + +func addRespSizeCharts(charts *Charts) error { + return charts.Add(bandwidthChart.Copy()) +} + +func addMethodCharts(charts *Charts) error { + return charts.Add(reqMethodChart.Copy()) +} + +func addHierCodeCharts(charts *Charts) error { + return charts.Add(hierCodeChart.Copy()) +} +func addServerAddressCharts(charts *Charts) error { + return charts.Add(serverAddrChart.Copy()) +} + +func addMimeTypeCharts(charts *Charts) error { + return charts.Add(mimeTypeChart.Copy()) +} |