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  }