github.com/netdata/go.d.plugin@v0.58.1/modules/envoy/charts.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package envoy
     4  
     5  import (
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/netdata/go.d.plugin/agent/module"
    10  
    11  	"github.com/prometheus/prometheus/model/labels"
    12  )
    13  
    14  const (
    15  	prioServerState = module.Priority + iota
    16  	prioServerMemoryAllocatedSize
    17  	prioServerMemoryHeapSize
    18  	prioServerMemoryPhysicalSize
    19  	prioServerConnectionsCount
    20  	prioServerParentConnectionsCount
    21  
    22  	prioClusterManagerClustersCount
    23  	prioClusterManagerClusterChangesRate
    24  	prioClusterManagerClusterUpdatesRate
    25  	prioClusterManagerClusterUpdatesVieMergeRate
    26  	prioClusterManagerClusterUpdatesMergeCancelledRate
    27  	prioClusterManagerClusterUpdatesOufOfMergeWindowsRate
    28  
    29  	prioClusterMembershipEndpointsCount
    30  	prioClusterMembershipChangesRate
    31  	prioClusterMembershipUpdatesRate
    32  
    33  	prioClusterUpstreamActiveConnectionsCount
    34  	prioClusterUpstreamConnectionsRate
    35  	prioClusterUpstreamHTTPConnectionsRate
    36  	prioClusterUpstreamDestroyedConnectionsRate
    37  	prioClusterUpstreamFailedConnectionsRate
    38  	prioClusterUpstreamTimedOutConnectionsRate
    39  	prioClusterUpstreamTrafficRate
    40  	prioClusterUpstreamBufferedSize
    41  
    42  	prioClusterUpstreamActiveRequestsCount
    43  	prioClusterUpstreamRequestsRate
    44  	prioClusterUpstreamFailedRequestsRate
    45  	prioClusterUpstreamActivePendingRequestsCount
    46  	prioClusterUpstreamPendingRequestsRate
    47  	prioClusterUpstreamPendingFailedRequestsRate
    48  	prioClusterUpstreamRequestRetriesRate
    49  	prioClusterUpstreamRequestSuccessRetriesRate
    50  	prioClusterUpstreamRequestBackoffRetriesRate
    51  
    52  	prioListenerManagerListenerCount
    53  	prioListenerManagerListenerChangesRate
    54  	prioListenerManagerListenerObjectEventsRate
    55  
    56  	prioListenerAdminDownstreamActiveConnectionsCount
    57  	prioListenerAdminDownstreamConnectionsRate
    58  	prioListenerAdminDownstreamDestroyedConnectionsRate
    59  	prioListenerAdminDownstreamTimedOutConnectionsRate
    60  	prioListenerAdminDownstreamRejectedConnectionsRate
    61  	prioListenerAdminDownstreamFilterClosedByRemoteConnectionsRate
    62  	prioListenerAdminDownstreamFilterReadErrorsRate
    63  	prioListenerAdminDownstreamActiveSocketsCount
    64  	prioListenerAdminDownstreamTimedOutSocketsRate
    65  
    66  	prioListenerDownstreamActiveConnectionsCount
    67  	prioListenerDownstreamConnectionsRate
    68  	prioListenerDownstreamDestroyedConnectionsRate
    69  	prioListenerDownstreamTimedOutConnectionsRate
    70  	prioListenerDownstreamRejectedConnectionsRate
    71  	prioListenerDownstreamFilterClosedByRemoteConnectionsRate
    72  	prioListenerDownstreamFilterReadErrorsRate
    73  	prioListenerDownstreamActiveSocketsCount
    74  	prioListenerDownstreamTimedOutSocketsRate
    75  
    76  	prioServerUptime
    77  )
    78  
    79  var (
    80  	serverChartsTmpl = module.Charts{
    81  		serverStateChartTmpl.Copy(),
    82  
    83  		serverMemoryAllocatedSizeChartTmpl.Copy(),
    84  		serverMemoryHeapSizeChartTmpl.Copy(),
    85  		serverMemoryPhysicalSizeChartTmpl.Copy(),
    86  
    87  		serverConnectionsCountChartTmpl.Copy(),
    88  		serverParentConnectionsCountChartTmpl.Copy(),
    89  
    90  		serverUptimeChartTmpl.Copy(),
    91  	}
    92  	serverStateChartTmpl = module.Chart{
    93  		ID:       "server_state_%s",
    94  		Title:    "Server current state",
    95  		Units:    "state",
    96  		Fam:      "server",
    97  		Ctx:      "envoy.server_state",
    98  		Priority: prioServerState,
    99  		Dims: module.Dims{
   100  			{ID: "envoy_server_state_live_%s", Name: "live"},
   101  			{ID: "envoy_server_state_draining_%s", Name: "draining"},
   102  			{ID: "envoy_server_state_pre_initializing_%s", Name: "pre_initializing"},
   103  			{ID: "envoy_server_state_initializing_%s", Name: "initializing"},
   104  		},
   105  	}
   106  	serverConnectionsCountChartTmpl = module.Chart{
   107  		ID:       "server_connections_%s",
   108  		Title:    "Server current connections",
   109  		Units:    "connections",
   110  		Fam:      "server",
   111  		Ctx:      "envoy.server_connections_count",
   112  		Priority: prioServerConnectionsCount,
   113  		Dims: module.Dims{
   114  			{ID: "envoy_server_total_connections_%s", Name: "connections"},
   115  		},
   116  	}
   117  	serverParentConnectionsCountChartTmpl = module.Chart{
   118  		ID:       "server_parent_connections_%s",
   119  		Title:    "Server current parent connections",
   120  		Units:    "connections",
   121  		Fam:      "server",
   122  		Ctx:      "envoy.server_parent_connections_count",
   123  		Priority: prioServerParentConnectionsCount,
   124  		Dims: module.Dims{
   125  			{ID: "envoy_server_parent_connections_%s", Name: "connections"},
   126  		},
   127  	}
   128  	serverMemoryAllocatedSizeChartTmpl = module.Chart{
   129  		ID:       "server_memory_allocated_size_%s",
   130  		Title:    "Server memory allocated size",
   131  		Units:    "bytes",
   132  		Fam:      "server",
   133  		Ctx:      "envoy.server_memory_allocated_size",
   134  		Priority: prioServerMemoryAllocatedSize,
   135  		Dims: module.Dims{
   136  			{ID: "envoy_server_memory_allocated_%s", Name: "allocated"},
   137  		},
   138  	}
   139  	serverMemoryHeapSizeChartTmpl = module.Chart{
   140  		ID:       "server_memory_heap_size_%s",
   141  		Title:    "Server memory heap size",
   142  		Units:    "bytes",
   143  		Fam:      "server",
   144  		Ctx:      "envoy.server_memory_heap_size",
   145  		Priority: prioServerMemoryHeapSize,
   146  		Dims: module.Dims{
   147  			{ID: "envoy_server_memory_heap_size_%s", Name: "heap"},
   148  		},
   149  	}
   150  	serverMemoryPhysicalSizeChartTmpl = module.Chart{
   151  		ID:       "server_memory_physical_size_%s",
   152  		Title:    "Server memory physical size",
   153  		Units:    "bytes",
   154  		Fam:      "server",
   155  		Ctx:      "envoy.server_memory_physical_size",
   156  		Priority: prioServerMemoryPhysicalSize,
   157  		Dims: module.Dims{
   158  			{ID: "envoy_server_memory_physical_size_%s", Name: "physical"},
   159  		},
   160  	}
   161  	serverUptimeChartTmpl = module.Chart{
   162  		ID:       "server_uptime_%s",
   163  		Title:    "Server uptime",
   164  		Units:    "seconds",
   165  		Fam:      "uptime",
   166  		Ctx:      "envoy.server_uptime",
   167  		Priority: prioServerUptime,
   168  		Dims: module.Dims{
   169  			{ID: "envoy_server_uptime_%s", Name: "uptime"},
   170  		},
   171  	}
   172  )
   173  
   174  var (
   175  	clusterManagerChartsTmpl = module.Charts{
   176  		clusterManagerClusterCountChartTmpl.Copy(),
   177  		clusterManagerClusterChangesRateChartTmpl.Copy(),
   178  		clusterManagerClusterUpdatesRateChartTmpl.Copy(),
   179  		clusterManagerClusterUpdatesViaMergeRateChartTmpl.Copy(),
   180  		clusterManagerClusterUpdatesMergeCancelledRateChartTmpl.Copy(),
   181  		clusterManagerClusterUpdatesOutOfMergeWindowRateChartTmpl.Copy(),
   182  	}
   183  	clusterManagerClusterCountChartTmpl = module.Chart{
   184  		ID:       "cluster_manager_cluster_count_%s",
   185  		Title:    "Cluster manager current clusters",
   186  		Units:    "clusters",
   187  		Fam:      "cluster mgr",
   188  		Ctx:      "envoy.cluster_manager_cluster_count",
   189  		Priority: prioClusterManagerClustersCount,
   190  		Dims: module.Dims{
   191  			{ID: "envoy_cluster_manager_active_clusters_%s", Name: "active"},
   192  			{ID: "envoy_cluster_manager_warming_clusters_%s", Name: "not_active"},
   193  		},
   194  	}
   195  	clusterManagerClusterChangesRateChartTmpl = module.Chart{
   196  		ID:       "cluster_manager_cluster_changes_%s",
   197  		Title:    "Cluster manager cluster changes",
   198  		Units:    "clusters/s",
   199  		Fam:      "cluster mgr",
   200  		Ctx:      "envoy.cluster_manager_cluster_changes_rate",
   201  		Priority: prioClusterManagerClusterChangesRate,
   202  		Dims: module.Dims{
   203  			{ID: "envoy_cluster_manager_cluster_added_%s", Name: "added", Algo: module.Incremental},
   204  			{ID: "envoy_cluster_manager_cluster_modified_%s", Name: "modified", Algo: module.Incremental},
   205  			{ID: "envoy_cluster_manager_cluster_removed_%s", Name: "removed", Algo: module.Incremental},
   206  		},
   207  	}
   208  	clusterManagerClusterUpdatesRateChartTmpl = module.Chart{
   209  		ID:       "cluster_manager_cluster_updates_%s",
   210  		Title:    "Cluster manager updates",
   211  		Units:    "updates/s",
   212  		Fam:      "cluster mgr",
   213  		Ctx:      "envoy.cluster_manager_cluster_updates_rate",
   214  		Priority: prioClusterManagerClusterUpdatesRate,
   215  		Dims: module.Dims{
   216  			{ID: "envoy_cluster_manager_cluster_updated_%s", Name: "cluster", Algo: module.Incremental},
   217  		},
   218  	}
   219  	clusterManagerClusterUpdatesViaMergeRateChartTmpl = module.Chart{
   220  		ID:       "cluster_manager_cluster_updated_via_merge_%s",
   221  		Title:    "Cluster manager updates applied as merged updates",
   222  		Units:    "updates/s",
   223  		Fam:      "cluster mgr",
   224  		Ctx:      "envoy.cluster_manager_cluster_updated_via_merge_rate",
   225  		Priority: prioClusterManagerClusterUpdatesVieMergeRate,
   226  		Dims: module.Dims{
   227  			{ID: "envoy_cluster_manager_cluster_updated_via_merge_%s", Name: "via_merge", Algo: module.Incremental},
   228  		},
   229  	}
   230  	clusterManagerClusterUpdatesMergeCancelledRateChartTmpl = module.Chart{
   231  		ID:       "cluster_manager_update_merge_cancelled_%s",
   232  		Title:    "Cluster manager cancelled merged updates",
   233  		Units:    "updates/s",
   234  		Fam:      "cluster mgr",
   235  		Ctx:      "envoy.cluster_manager_update_merge_cancelled_rate",
   236  		Priority: prioClusterManagerClusterUpdatesMergeCancelledRate,
   237  		Dims: module.Dims{
   238  			{ID: "envoy_cluster_manager_update_merge_cancelled_%s", Name: "merge_cancelled", Algo: module.Incremental},
   239  		},
   240  	}
   241  	clusterManagerClusterUpdatesOutOfMergeWindowRateChartTmpl = module.Chart{
   242  		ID:       "cluster_manager_update_out_of_merge_window_%s",
   243  		Title:    "Cluster manager out of a merge window updates",
   244  		Units:    "updates/s",
   245  		Fam:      "cluster mgr",
   246  		Ctx:      "envoy.cluster_manager_update_out_of_merge_window_rate",
   247  		Priority: prioClusterManagerClusterUpdatesOufOfMergeWindowsRate,
   248  		Dims: module.Dims{
   249  			{ID: "envoy_cluster_manager_update_out_of_merge_window_%s", Name: "out_of_merge_window", Algo: module.Incremental},
   250  		},
   251  	}
   252  )
   253  
   254  var (
   255  	clusterUpstreamChartsTmpl = module.Charts{
   256  		clusterUpstreamActiveConnectionsCountChartTmpl.Copy(),
   257  		clusterUpstreamConnectionsRateChartTmpl.Copy(),
   258  		clusterUpstreamHTTPConnectionsRateChartTmpl.Copy(),
   259  		clusterUpstreamDestroyedConnectionsRateChartTmpl.Copy(),
   260  		clusterUpstreamFailedConnectionsRateChartTmpl.Copy(),
   261  		clusterUpstreamTimedOutConnectionsRateChartTmpl.Copy(),
   262  		clusterUpstreamTrafficRateChartTmpl.Copy(),
   263  		clusterUpstreamBufferedSizeChartTmpl.Copy(),
   264  
   265  		clusterUpstreamActiveRequestsCountChartTmpl.Copy(),
   266  		clusterUpstreamRequestsRateChartTmpl.Copy(),
   267  		clusterUpstreamFailedRequestsRateChartTmpl.Copy(),
   268  		clusterUpstreamActivePendingRequestsCountChartTmpl.Copy(),
   269  		clusterUpstreamPendingRequestsRateChartTmpl.Copy(),
   270  		clusterUpstreamPendingFailedRequestsRateChartTmpl.Copy(),
   271  		clusterUpstreamRequestRetriesRateChartTmpl.Copy(),
   272  		clusterUpstreamRequestSuccessRetriesRateChartTmpl.Copy(),
   273  		clusterUpstreamRequestRetriesBackoffRateChartTmpl.Copy(),
   274  
   275  		clusterMembershipEndpointsCountChartTmpl.Copy(),
   276  		clusterMembershipChangesRateChartTmpl.Copy(),
   277  		clusterMembershipUpdatesRateChartTmpl.Copy(),
   278  	}
   279  
   280  	clusterUpstreamActiveConnectionsCountChartTmpl = module.Chart{
   281  		ID:       "cluster_upstream_cx_active_%s",
   282  		Title:    "Cluster upstream current active connections",
   283  		Units:    "connections",
   284  		Fam:      "upstream conns",
   285  		Ctx:      "envoy.cluster_upstream_cx_active_count",
   286  		Priority: prioClusterUpstreamActiveConnectionsCount,
   287  		Dims: module.Dims{
   288  			{ID: "envoy_cluster_upstream_cx_active_%s", Name: "active"},
   289  		},
   290  	}
   291  	clusterUpstreamConnectionsRateChartTmpl = module.Chart{
   292  		ID:       "cluster_upstream_cx_total_%s",
   293  		Title:    "Cluster upstream connections",
   294  		Units:    "connections/s",
   295  		Fam:      "upstream conns",
   296  		Ctx:      "envoy.cluster_upstream_cx_rate",
   297  		Priority: prioClusterUpstreamConnectionsRate,
   298  		Dims: module.Dims{
   299  			{ID: "envoy_cluster_upstream_cx_total_%s", Name: "created", Algo: module.Incremental},
   300  		},
   301  	}
   302  	clusterUpstreamHTTPConnectionsRateChartTmpl = module.Chart{
   303  		ID:       "cluster_upstream_cx_http_total_%s",
   304  		Title:    "Cluster upstream connections by HTTP version",
   305  		Units:    "connections/s",
   306  		Fam:      "upstream conns",
   307  		Ctx:      "envoy.cluster_upstream_cx_http_rate",
   308  		Priority: prioClusterUpstreamHTTPConnectionsRate,
   309  		Dims: module.Dims{
   310  			{ID: "envoy_cluster_upstream_cx_http1_total_%s", Name: "http1", Algo: module.Incremental},
   311  			{ID: "envoy_cluster_upstream_cx_http2_total_%s", Name: "http2", Algo: module.Incremental},
   312  			{ID: "envoy_cluster_upstream_cx_http3_total_%s", Name: "http3", Algo: module.Incremental},
   313  		},
   314  	}
   315  	clusterUpstreamDestroyedConnectionsRateChartTmpl = module.Chart{
   316  		ID:       "cluster_upstream_cx_destroy_%s",
   317  		Title:    "Cluster upstream destroyed connections",
   318  		Units:    "connections/s",
   319  		Fam:      "upstream conns",
   320  		Ctx:      "envoy.cluster_upstream_cx_destroy_rate",
   321  		Priority: prioClusterUpstreamDestroyedConnectionsRate,
   322  		Dims: module.Dims{
   323  			{ID: "envoy_cluster_upstream_cx_destroy_local_%s", Name: "local", Algo: module.Incremental},
   324  			{ID: "envoy_cluster_upstream_cx_destroy_remote_%s", Name: "remote", Algo: module.Incremental},
   325  		},
   326  	}
   327  	clusterUpstreamFailedConnectionsRateChartTmpl = module.Chart{
   328  		ID:       "cluster_upstream_cx_connect_fail_%s",
   329  		Title:    "Cluster upstream failed connections",
   330  		Units:    "connections/s",
   331  		Fam:      "upstream conns",
   332  		Ctx:      "envoy.cluster_upstream_cx_connect_fail_rate",
   333  		Priority: prioClusterUpstreamFailedConnectionsRate,
   334  		Dims: module.Dims{
   335  			{ID: "envoy_cluster_upstream_cx_connect_fail_%s", Name: "failed", Algo: module.Incremental},
   336  		},
   337  	}
   338  	clusterUpstreamTimedOutConnectionsRateChartTmpl = module.Chart{
   339  		ID:       "cluster_upstream_cx_connect_timeout_%s",
   340  		Title:    "Cluster upstream timed out connections",
   341  		Units:    "connections/s",
   342  		Fam:      "upstream conns",
   343  		Ctx:      "envoy.cluster_upstream_cx_connect_timeout_rate",
   344  		Priority: prioClusterUpstreamTimedOutConnectionsRate,
   345  		Dims: module.Dims{
   346  			{ID: "envoy_cluster_upstream_cx_connect_timeout_%s", Name: "timeout", Algo: module.Incremental},
   347  		},
   348  	}
   349  	clusterUpstreamTrafficRateChartTmpl = module.Chart{
   350  		ID:       "cluster_upstream_cx_bytes_total_%s",
   351  		Title:    "Cluster upstream connection traffic",
   352  		Units:    "bytes/s",
   353  		Fam:      "upstream traffic",
   354  		Ctx:      "envoy.cluster_upstream_cx_bytes_rate",
   355  		Priority: prioClusterUpstreamTrafficRate,
   356  		Dims: module.Dims{
   357  			{ID: "envoy_cluster_upstream_cx_rx_bytes_total_%s", Name: "received", Algo: module.Incremental},
   358  			{ID: "envoy_cluster_upstream_cx_tx_bytes_total_%s", Name: "sent", Algo: module.Incremental},
   359  		},
   360  	}
   361  	clusterUpstreamBufferedSizeChartTmpl = module.Chart{
   362  		ID:       "cluster_upstream_cx_bytes_buffered_%s",
   363  		Title:    "Cluster upstream current connection buffered size",
   364  		Units:    "bytes",
   365  		Fam:      "upstream traffic",
   366  		Ctx:      "envoy.cluster_upstream_cx_bytes_buffered_size",
   367  		Priority: prioClusterUpstreamBufferedSize,
   368  		Dims: module.Dims{
   369  			{ID: "envoy_cluster_upstream_cx_rx_bytes_buffered_%s", Name: "received"},
   370  			{ID: "envoy_cluster_upstream_cx_tx_bytes_buffered_%s", Name: "send"},
   371  		},
   372  	}
   373  
   374  	clusterUpstreamActiveRequestsCountChartTmpl = module.Chart{
   375  		ID:       "cluster_upstream_rq_active_%s",
   376  		Title:    "Cluster upstream current active requests",
   377  		Units:    "requests",
   378  		Fam:      "upstream requests",
   379  		Ctx:      "envoy.cluster_upstream_rq_active_count",
   380  		Priority: prioClusterUpstreamActiveRequestsCount,
   381  		Dims: module.Dims{
   382  			{ID: "envoy_cluster_upstream_rq_active_%s", Name: "active"},
   383  		},
   384  	}
   385  	clusterUpstreamRequestsRateChartTmpl = module.Chart{
   386  		ID:       "cluster_upstream_rq_total_%s",
   387  		Title:    "Cluster upstream requests",
   388  		Units:    "requests/s",
   389  		Fam:      "upstream requests",
   390  		Ctx:      "envoy.cluster_upstream_rq_rate",
   391  		Priority: prioClusterUpstreamRequestsRate,
   392  		Dims: module.Dims{
   393  			{ID: "envoy_cluster_upstream_rq_total_%s", Name: "requests", Algo: module.Incremental},
   394  		},
   395  	}
   396  	clusterUpstreamFailedRequestsRateChartTmpl = module.Chart{
   397  		ID:       "cluster_upstream_rq_failed_total_%s",
   398  		Title:    "Cluster upstream failed requests",
   399  		Units:    "requests/s",
   400  		Fam:      "upstream requests",
   401  		Ctx:      "envoy.cluster_upstream_rq_failed_rate",
   402  		Priority: prioClusterUpstreamFailedRequestsRate,
   403  		Dims: module.Dims{
   404  			{ID: "envoy_cluster_upstream_rq_cancelled_%s", Name: "cancelled", Algo: module.Incremental},
   405  			{ID: "envoy_cluster_upstream_rq_maintenance_mode_%s", Name: "maintenance_mode", Algo: module.Incremental},
   406  			{ID: "envoy_cluster_upstream_rq_timeout_%s", Name: "timeout", Algo: module.Incremental},
   407  			{ID: "envoy_cluster_upstream_rq_max_duration_reached_%s", Name: "max_duration_reached", Algo: module.Incremental},
   408  			{ID: "envoy_cluster_upstream_rq_per_try_timeout_%s", Name: "per_try_timeout", Algo: module.Incremental},
   409  			{ID: "envoy_cluster_upstream_rq_rx_reset_%s", Name: "reset_local", Algo: module.Incremental},
   410  			{ID: "envoy_cluster_upstream_rq_tx_reset_%s", Name: "reset_remote", Algo: module.Incremental},
   411  		},
   412  	}
   413  	clusterUpstreamActivePendingRequestsCountChartTmpl = module.Chart{
   414  		ID:       "cluster_upstream_rq_pending_active_%s",
   415  		Title:    "Cluster upstream current active pending requests",
   416  		Units:    "requests",
   417  		Fam:      "upstream requests",
   418  		Ctx:      "envoy.cluster_upstream_rq_pending_active_count",
   419  		Priority: prioClusterUpstreamActivePendingRequestsCount,
   420  		Dims: module.Dims{
   421  			{ID: "envoy_cluster_upstream_rq_pending_active_%s", Name: "active_pending"},
   422  		},
   423  	}
   424  	clusterUpstreamPendingRequestsRateChartTmpl = module.Chart{
   425  		ID:       "cluster_upstream_rq_pending_total_%s",
   426  		Title:    "Cluster upstream pending requests",
   427  		Units:    "requests/s",
   428  		Fam:      "upstream requests",
   429  		Ctx:      "envoy.cluster_upstream_rq_pending_rate",
   430  		Priority: prioClusterUpstreamPendingRequestsRate,
   431  		Dims: module.Dims{
   432  			{ID: "envoy_cluster_upstream_rq_pending_total_%s", Name: "pending", Algo: module.Incremental},
   433  		},
   434  	}
   435  	clusterUpstreamPendingFailedRequestsRateChartTmpl = module.Chart{
   436  		ID:       "cluster_upstream_rq_pending_failed_total_%s",
   437  		Title:    "Cluster upstream failed pending requests",
   438  		Units:    "requests/s",
   439  		Fam:      "upstream requests",
   440  		Ctx:      "envoy.cluster_upstream_rq_pending_failed_rate",
   441  		Priority: prioClusterUpstreamPendingFailedRequestsRate,
   442  		Dims: module.Dims{
   443  			{ID: "envoy_cluster_upstream_rq_pending_overflow_%s", Name: "overflow", Algo: module.Incremental},
   444  			{ID: "envoy_cluster_upstream_rq_pending_failure_eject_%s", Name: "failure_eject", Algo: module.Incremental},
   445  		},
   446  	}
   447  	clusterUpstreamRequestRetriesRateChartTmpl = module.Chart{
   448  		ID:       "cluster_upstream_rq_retry_%s",
   449  		Title:    "Cluster upstream request retries",
   450  		Units:    "retries/s",
   451  		Fam:      "upstream requests",
   452  		Ctx:      "envoy.cluster_upstream_rq_retry_rate",
   453  		Priority: prioClusterUpstreamRequestRetriesRate,
   454  		Dims: module.Dims{
   455  			{ID: "envoy_cluster_upstream_rq_retry_%s", Name: "request", Algo: module.Incremental},
   456  		},
   457  	}
   458  	clusterUpstreamRequestSuccessRetriesRateChartTmpl = module.Chart{
   459  		ID:       "cluster_upstream_rq_retry_success_%s",
   460  		Title:    "Cluster upstream request successful retries",
   461  		Units:    "retries/s",
   462  		Fam:      "upstream requests",
   463  		Ctx:      "envoy.cluster_upstream_rq_retry_success_rate",
   464  		Priority: prioClusterUpstreamRequestSuccessRetriesRate,
   465  		Dims: module.Dims{
   466  			{ID: "envoy_cluster_upstream_rq_retry_success_%s", Name: "success", Algo: module.Incremental},
   467  		},
   468  	}
   469  	clusterUpstreamRequestRetriesBackoffRateChartTmpl = module.Chart{
   470  		ID:       "cluster_upstream_rq_retry_backoff_%s",
   471  		Title:    "Cluster upstream request backoff retries",
   472  		Units:    "retries/s",
   473  		Fam:      "upstream requests",
   474  		Ctx:      "envoy.cluster_upstream_rq_retry_backoff_rate",
   475  		Priority: prioClusterUpstreamRequestBackoffRetriesRate,
   476  		Dims: module.Dims{
   477  			{ID: "envoy_cluster_upstream_rq_retry_backoff_exponential_%s", Name: "exponential", Algo: module.Incremental},
   478  			{ID: "envoy_cluster_upstream_rq_retry_backoff_ratelimited_%s", Name: "ratelimited", Algo: module.Incremental},
   479  		},
   480  	}
   481  
   482  	clusterMembershipEndpointsCountChartTmpl = module.Chart{
   483  		ID:       "cluster_membership_endpoints_count_%s",
   484  		Title:    "Cluster membership current endpoints",
   485  		Units:    "endpoints",
   486  		Fam:      "cluster membership",
   487  		Ctx:      "envoy.cluster_membership_endpoints_count",
   488  		Priority: prioClusterMembershipEndpointsCount,
   489  		Dims: module.Dims{
   490  			{ID: "envoy_cluster_membership_healthy_%s", Name: "healthy"},
   491  			{ID: "envoy_cluster_membership_degraded_%s", Name: "degraded"},
   492  			{ID: "envoy_cluster_membership_excluded_%s", Name: "excluded"},
   493  		},
   494  	}
   495  	clusterMembershipChangesRateChartTmpl = module.Chart{
   496  		ID:       "cluster_membership_change_%s",
   497  		Title:    "Cluster membership changes",
   498  		Units:    "changes/s",
   499  		Fam:      "cluster membership",
   500  		Ctx:      "envoy.cluster_membership_changes_rate",
   501  		Priority: prioClusterMembershipChangesRate,
   502  		Dims: module.Dims{
   503  			{ID: "envoy_cluster_membership_change_%s", Name: "membership", Algo: module.Incremental},
   504  		},
   505  	}
   506  	clusterMembershipUpdatesRateChartTmpl = module.Chart{
   507  		ID:       "cluster_membership_updates_%s",
   508  		Title:    "Cluster membership updates",
   509  		Units:    "updates/s",
   510  		Fam:      "cluster membership",
   511  		Ctx:      "envoy.cluster_membership_updates_rate",
   512  		Priority: prioClusterMembershipUpdatesRate,
   513  		Dims: module.Dims{
   514  			{ID: "envoy_cluster_update_success_%s", Name: "success", Algo: module.Incremental},
   515  			{ID: "envoy_cluster_update_failure_%s", Name: "failure", Algo: module.Incremental},
   516  			{ID: "envoy_cluster_update_empty_%s", Name: "empty", Algo: module.Incremental},
   517  			{ID: "envoy_cluster_update_no_rebuild_%s", Name: "no_rebuild", Algo: module.Incremental},
   518  		},
   519  	}
   520  )
   521  
   522  var (
   523  	listenerManagerChartsTmpl = module.Charts{
   524  		listenerManagerListenersByStateCountChartTmpl.Copy(),
   525  		listenerManagerListenerChangesRateChartTmpl.Copy(),
   526  		listenerManagerListenerObjectEventsRateChartTmpl.Copy(),
   527  	}
   528  	listenerManagerListenersByStateCountChartTmpl = module.Chart{
   529  		ID:       "listener_manager_listeners_count_%s",
   530  		Title:    "Listener manager current listeners",
   531  		Units:    "listeners",
   532  		Fam:      "downstream mgr",
   533  		Ctx:      "envoy.listener_manager_listeners_count",
   534  		Priority: prioListenerManagerListenerCount,
   535  		Dims: module.Dims{
   536  			{ID: "envoy_listener_manager_total_listeners_active_%s", Name: "active"},
   537  			{ID: "envoy_listener_manager_total_listeners_warming_%s", Name: "warming"},
   538  			{ID: "envoy_listener_manager_total_listeners_draining_%s", Name: "draining"},
   539  		},
   540  	}
   541  	listenerManagerListenerChangesRateChartTmpl = module.Chart{
   542  		ID:       "listener_manager_listener_changes_%s",
   543  		Title:    "Listener manager listener changes",
   544  		Units:    "listeners/s",
   545  		Fam:      "downstream mgr",
   546  		Ctx:      "envoy.listener_manager_listener_changes_rate",
   547  		Priority: prioListenerManagerListenerChangesRate,
   548  		Dims: module.Dims{
   549  			{ID: "envoy_listener_manager_listener_added_%s", Name: "added", Algo: module.Incremental},
   550  			{ID: "envoy_listener_manager_listener_modified_%s", Name: "modified", Algo: module.Incremental},
   551  			{ID: "envoy_listener_manager_listener_removed_%s", Name: "removed", Algo: module.Incremental},
   552  			{ID: "envoy_listener_manager_listener_stopped_%s", Name: "stopped", Algo: module.Incremental},
   553  		},
   554  	}
   555  	listenerManagerListenerObjectEventsRateChartTmpl = module.Chart{
   556  		ID:       "listener_manager_listener_object_events_%s",
   557  		Title:    "Listener manager listener object events",
   558  		Units:    "objects/s",
   559  		Fam:      "downstream mgr",
   560  		Ctx:      "envoy.listener_manager_listener_object_events_rate",
   561  		Priority: prioListenerManagerListenerObjectEventsRate,
   562  		Dims: module.Dims{
   563  			{ID: "envoy_listener_manager_listener_create_success_%s", Name: "create_success", Algo: module.Incremental},
   564  			{ID: "envoy_listener_manager_listener_create_failure_%s", Name: "create_failure", Algo: module.Incremental},
   565  			{ID: "envoy_listener_manager_listener_in_place_updated_%s", Name: "in_place_updated", Algo: module.Incremental},
   566  		},
   567  	}
   568  )
   569  
   570  var (
   571  	listenerAdminDownstreamChartsTmpl = module.Charts{
   572  		listenerAdminDownstreamActiveConnectionsCountChartTmpl.Copy(),
   573  		listenerAdminDownstreamConnectionsRateChartTmpl.Copy(),
   574  		listenerAdminDownstreamDestroyedConnectionsRateChartTmpl.Copy(),
   575  		listenerAdminDownstreamTimedOutConnectionsRateChartTmpl.Copy(),
   576  		listenerAdminDownstreamRejectedConnectionsRateChartTmpl.Copy(),
   577  		listenerAdminDownstreamFilterClosedByRemoteConnectionsRateChartTmpl.Copy(),
   578  		listenerAdminDownstreamFilterReadErrorsRateChartTmpl.Copy(),
   579  
   580  		listenerAdminDownstreamActiveSocketsCountChartTmpl.Copy(),
   581  		listenerAdminDownstreamTimedOutSocketsRateChartTmpl.Copy(),
   582  	}
   583  
   584  	listenerAdminDownstreamActiveConnectionsCountChartTmpl = module.Chart{
   585  		ID:       "listener_admin_downstream_cx_active_%s",
   586  		Title:    "Listener admin downstream current active connections",
   587  		Units:    "connections",
   588  		Fam:      "downstream adm conns",
   589  		Ctx:      "envoy.listener_admin_downstream_cx_active_count",
   590  		Priority: prioListenerAdminDownstreamActiveConnectionsCount,
   591  		Dims: module.Dims{
   592  			{ID: "envoy_listener_admin_downstream_cx_active_%s", Name: "active"},
   593  		},
   594  	}
   595  	listenerAdminDownstreamConnectionsRateChartTmpl = module.Chart{
   596  		ID:       "listener_admin_downstream_cx_total_%s",
   597  		Title:    "Listener admin downstream connections",
   598  		Units:    "connections/s",
   599  		Fam:      "downstream adm conns",
   600  		Ctx:      "envoy.listener_admin_downstream_cx_rate",
   601  		Priority: prioListenerAdminDownstreamConnectionsRate,
   602  		Dims: module.Dims{
   603  			{ID: "envoy_listener_admin_downstream_cx_total_%s", Name: "created", Algo: module.Incremental},
   604  		},
   605  	}
   606  	listenerAdminDownstreamDestroyedConnectionsRateChartTmpl = module.Chart{
   607  		ID:       "listener_admin_downstream_cx_destroy_%s",
   608  		Title:    "Listener admin downstream destroyed connections",
   609  		Units:    "connections/s",
   610  		Fam:      "downstream adm conns",
   611  		Ctx:      "envoy.listener_admin_downstream_cx_destroy_rate",
   612  		Priority: prioListenerAdminDownstreamDestroyedConnectionsRate,
   613  		Dims: module.Dims{
   614  			{ID: "envoy_listener_admin_downstream_cx_destroy_%s", Name: "destroyed", Algo: module.Incremental},
   615  		},
   616  	}
   617  	listenerAdminDownstreamTimedOutConnectionsRateChartTmpl = module.Chart{
   618  		ID:       "listener_admin_downstream_cx_transport_socket_connect_timeout_%s",
   619  		Title:    "Listener admin downstream timed out connections",
   620  		Units:    "connections/s",
   621  		Fam:      "downstream adm conns",
   622  		Ctx:      "envoy.listener_admin_downstream_cx_transport_socket_connect_timeout_rate",
   623  		Priority: prioListenerAdminDownstreamTimedOutConnectionsRate,
   624  		Dims: module.Dims{
   625  			{ID: "envoy_listener_admin_downstream_cx_transport_socket_connect_timeout_%s", Name: "timeout", Algo: module.Incremental},
   626  		},
   627  	}
   628  	listenerAdminDownstreamRejectedConnectionsRateChartTmpl = module.Chart{
   629  		ID:       "listener_admin_downstream_cx_rejected_%s",
   630  		Title:    "Listener admin downstream rejected connections",
   631  		Units:    "connections/s",
   632  		Fam:      "downstream adm conns",
   633  		Ctx:      "envoy.listener_admin_downstream_cx_rejected_rate",
   634  		Priority: prioListenerAdminDownstreamRejectedConnectionsRate,
   635  		Dims: module.Dims{
   636  			{ID: "envoy_listener_admin_downstream_cx_overflow_%s", Name: "overflow", Algo: module.Incremental},
   637  			{ID: "envoy_listener_admin_downstream_cx_overload_reject_%s", Name: "overload", Algo: module.Incremental},
   638  			{ID: "envoy_listener_admin_downstream_global_cx_overflow_%s", Name: "global_overflow", Algo: module.Incremental},
   639  		},
   640  	}
   641  	listenerAdminDownstreamFilterClosedByRemoteConnectionsRateChartTmpl = module.Chart{
   642  		ID:       "listener_admin_downstream_listener_filter_remote_close_%s",
   643  		Title:    "Listener admin downstream connections closed by remote when peek data for listener filters",
   644  		Units:    "connections/s",
   645  		Fam:      "downstream adm conns",
   646  		Ctx:      "envoy.listener_admin_downstream_listener_filter_remote_close_rate",
   647  		Priority: prioListenerAdminDownstreamFilterClosedByRemoteConnectionsRate,
   648  		Dims: module.Dims{
   649  			{ID: "envoy_listener_admin_downstream_listener_filter_remote_close_%s", Name: "closed", Algo: module.Incremental},
   650  		},
   651  	}
   652  	listenerAdminDownstreamFilterReadErrorsRateChartTmpl = module.Chart{
   653  		ID:       "listener_admin_downstream_listener_filter_error_%s",
   654  		Title:    "Listener admin downstream read errors when peeking data for listener filters",
   655  		Units:    "errors/s",
   656  		Fam:      "downstream adm conns",
   657  		Ctx:      "envoy.listener_admin_downstream_listener_filter_error_rate",
   658  		Priority: prioListenerAdminDownstreamFilterReadErrorsRate,
   659  		Dims: module.Dims{
   660  			{ID: "envoy_listener_admin_downstream_listener_filter_error_%s", Name: "read", Algo: module.Incremental},
   661  		},
   662  	}
   663  
   664  	listenerAdminDownstreamActiveSocketsCountChartTmpl = module.Chart{
   665  		ID:       "listener_admin_downstream_pre_cx_active_%s",
   666  		Title:    "Listener admin downstream current active sockets",
   667  		Units:    "sockets",
   668  		Fam:      "downstream adm sockets",
   669  		Ctx:      "envoy.listener_admin_downstream_pre_cx_active_count",
   670  		Priority: prioListenerAdminDownstreamActiveSocketsCount,
   671  		Dims: module.Dims{
   672  			{ID: "envoy_listener_admin_downstream_pre_cx_active_%s", Name: "active"},
   673  		},
   674  	}
   675  	listenerAdminDownstreamTimedOutSocketsRateChartTmpl = module.Chart{
   676  		ID:       "listener_admin_downstream_pre_cx_timeout_%s",
   677  		Title:    "Listener admin downstream timed out sockets",
   678  		Units:    "sockets/s",
   679  		Fam:      "downstream adm sockets",
   680  		Ctx:      "envoy.listener_admin_downstream_pre_cx_timeout_rate",
   681  		Priority: prioListenerAdminDownstreamTimedOutSocketsRate,
   682  		Dims: module.Dims{
   683  			{ID: "envoy_listener_admin_downstream_pre_cx_timeout_%s", Name: "timeout", Algo: module.Incremental},
   684  		},
   685  	}
   686  )
   687  
   688  var (
   689  	listenerDownstreamChartsTmpl = module.Charts{
   690  		listenerDownstreamActiveConnectionsCountChartTmpl.Copy(),
   691  		listenerDownstreamConnectionsRateChartTmpl.Copy(),
   692  		listenerDownstreamDestroyedConnectionsRateChartTmpl.Copy(),
   693  		listenerDownstreamTimedOutConnectionsRateChartTmpl.Copy(),
   694  		listenerDownstreamRejectedConnectionsRateChartTmpl.Copy(),
   695  		listenerDownstreamFilterClosedByRemoteConnectionsRateChartTmpl.Copy(),
   696  		listenerDownstreamFilterReadErrorsRateChartTmpl.Copy(),
   697  
   698  		listenerDownstreamActiveSocketsCountChartTmpl.Copy(),
   699  		listenerDownstreamTimedOutSocketsRateChartTmpl.Copy(),
   700  	}
   701  
   702  	listenerDownstreamActiveConnectionsCountChartTmpl = module.Chart{
   703  		ID:       "listener_downstream_cx_active_%s",
   704  		Title:    "Listener downstream current active connections",
   705  		Units:    "connections",
   706  		Fam:      "downstream conns",
   707  		Ctx:      "envoy.listener_downstream_cx_active_count",
   708  		Priority: prioListenerDownstreamActiveConnectionsCount,
   709  		Dims: module.Dims{
   710  			{ID: "envoy_listener_downstream_cx_active_%s", Name: "active"},
   711  		},
   712  	}
   713  	listenerDownstreamConnectionsRateChartTmpl = module.Chart{
   714  		ID:       "listener_downstream_cx_total_%s",
   715  		Title:    "Listener downstream connections",
   716  		Units:    "connections/s",
   717  		Fam:      "downstream conns",
   718  		Ctx:      "envoy.listener_downstream_cx_rate",
   719  		Priority: prioListenerDownstreamConnectionsRate,
   720  		Dims: module.Dims{
   721  			{ID: "envoy_listener_downstream_cx_total_%s", Name: "created", Algo: module.Incremental},
   722  		},
   723  	}
   724  	listenerDownstreamDestroyedConnectionsRateChartTmpl = module.Chart{
   725  		ID:       "listener_downstream_cx_destroy_%s",
   726  		Title:    "Listener downstream destroyed connections",
   727  		Units:    "connections/s",
   728  		Fam:      "downstream conns",
   729  		Ctx:      "envoy.listener_downstream_cx_destroy_rate",
   730  		Priority: prioListenerDownstreamDestroyedConnectionsRate,
   731  		Dims: module.Dims{
   732  			{ID: "envoy_listener_downstream_cx_destroy_%s", Name: "destroyed", Algo: module.Incremental},
   733  		},
   734  	}
   735  	listenerDownstreamTimedOutConnectionsRateChartTmpl = module.Chart{
   736  		ID:       "listener_downstream_cx_transport_socket_connect_timeout_%s",
   737  		Title:    "Listener downstream timed out connections",
   738  		Units:    "connections/s",
   739  		Fam:      "downstream conns",
   740  		Ctx:      "envoy.listener_downstream_cx_transport_socket_connect_timeout_rate",
   741  		Priority: prioListenerDownstreamTimedOutConnectionsRate,
   742  		Dims: module.Dims{
   743  			{ID: "envoy_listener_downstream_cx_transport_socket_connect_timeout_%s", Name: "timeout", Algo: module.Incremental},
   744  		},
   745  	}
   746  	listenerDownstreamRejectedConnectionsRateChartTmpl = module.Chart{
   747  		ID:       "listener_downstream_cx_rejected_%s",
   748  		Title:    "Listener downstream rejected connections",
   749  		Units:    "connections/s",
   750  		Fam:      "downstream conns",
   751  		Ctx:      "envoy.listener_downstream_cx_rejected_rate",
   752  		Priority: prioListenerDownstreamRejectedConnectionsRate,
   753  		Dims: module.Dims{
   754  			{ID: "envoy_listener_downstream_cx_overflow_%s", Name: "overflow", Algo: module.Incremental},
   755  			{ID: "envoy_listener_downstream_cx_overload_reject_%s", Name: "overload", Algo: module.Incremental},
   756  			{ID: "envoy_listener_downstream_global_cx_overflow_%s", Name: "global_overflow", Algo: module.Incremental},
   757  		},
   758  	}
   759  	listenerDownstreamFilterClosedByRemoteConnectionsRateChartTmpl = module.Chart{
   760  		ID:       "listener_downstream_listener_filter_remote_close_%s",
   761  		Title:    "Listener downstream connections closed by remote when peek data for listener filters",
   762  		Units:    "connections/s",
   763  		Fam:      "downstream conns",
   764  		Ctx:      "envoy.listener_downstream_listener_filter_remote_close_rate",
   765  		Priority: prioListenerDownstreamFilterClosedByRemoteConnectionsRate,
   766  		Dims: module.Dims{
   767  			{ID: "envoy_listener_downstream_listener_filter_remote_close_%s", Name: "closed", Algo: module.Incremental},
   768  		},
   769  	}
   770  	listenerDownstreamFilterReadErrorsRateChartTmpl = module.Chart{
   771  		ID:       "listener_downstream_listener_filter_error_%s",
   772  		Title:    "Listener downstream read errors when peeking data for listener filters",
   773  		Units:    "errors/s",
   774  		Fam:      "downstream conns",
   775  		Ctx:      "envoy.listener_downstream_listener_filter_error_rate",
   776  		Priority: prioListenerDownstreamFilterReadErrorsRate,
   777  		Dims: module.Dims{
   778  			{ID: "envoy_listener_downstream_listener_filter_error_%s", Name: "read", Algo: module.Incremental},
   779  		},
   780  	}
   781  
   782  	listenerDownstreamActiveSocketsCountChartTmpl = module.Chart{
   783  		ID:       "listener_downstream_pre_cx_active_%s",
   784  		Title:    "Listener downstream current active sockets",
   785  		Units:    "sockets",
   786  		Fam:      "downstream sockets",
   787  		Ctx:      "envoy.listener_downstream_pre_cx_active_count",
   788  		Priority: prioListenerDownstreamActiveSocketsCount,
   789  		Dims: module.Dims{
   790  			{ID: "envoy_listener_downstream_pre_cx_active_%s", Name: "active"},
   791  		},
   792  	}
   793  	listenerDownstreamTimedOutSocketsRateChartTmpl = module.Chart{
   794  		ID:       "listener_downstream_pre_cx_timeout_%s",
   795  		Title:    "Listener downstream timed out sockets",
   796  		Units:    "sockets/s",
   797  		Fam:      "downstream sockets",
   798  		Ctx:      "envoy.listener_downstream_pre_cx_timeout_rate",
   799  		Priority: prioListenerDownstreamTimedOutSocketsRate,
   800  		Dims: module.Dims{
   801  			{ID: "envoy_listener_downstream_pre_cx_timeout_%s", Name: "timeout", Algo: module.Incremental},
   802  		},
   803  	}
   804  )
   805  
   806  func (e *Envoy) addServerCharts(id string, labels labels.Labels) {
   807  	e.addCharts(serverChartsTmpl.Copy(), id, labels)
   808  }
   809  
   810  func (e *Envoy) addClusterManagerCharts(id string, labels labels.Labels) {
   811  	e.addCharts(clusterManagerChartsTmpl.Copy(), id, labels)
   812  }
   813  
   814  func (e *Envoy) addClusterUpstreamCharts(id string, labels labels.Labels) {
   815  	e.addCharts(clusterUpstreamChartsTmpl.Copy(), id, labels)
   816  }
   817  
   818  func (e *Envoy) addListenerManagerCharts(id string, labels labels.Labels) {
   819  	e.addCharts(listenerManagerChartsTmpl.Copy(), id, labels)
   820  }
   821  
   822  func (e *Envoy) addListenerAdminDownstreamCharts(id string, labels labels.Labels) {
   823  	e.addCharts(listenerAdminDownstreamChartsTmpl.Copy(), id, labels)
   824  }
   825  
   826  func (e *Envoy) addListenerDownstreamCharts(id string, labels labels.Labels) {
   827  	e.addCharts(listenerDownstreamChartsTmpl.Copy(), id, labels)
   828  }
   829  
   830  func (e *Envoy) addCharts(charts *module.Charts, id string, labels labels.Labels) {
   831  	charts = charts.Copy()
   832  
   833  	for _, chart := range *charts {
   834  		if id == "" {
   835  			chart.ID = strings.Replace(chart.ID, "_%s", "", 1)
   836  			for _, dim := range chart.Dims {
   837  				dim.ID = strings.Replace(dim.ID, "_%s", "", 1)
   838  			}
   839  		} else {
   840  			chart.ID = fmt.Sprintf(chart.ID, dotReplacer.Replace(id))
   841  			for _, dim := range chart.Dims {
   842  				dim.ID = fmt.Sprintf(dim.ID, id)
   843  			}
   844  		}
   845  
   846  		for _, lbl := range labels {
   847  			chart.Labels = append(chart.Labels, module.Label{Key: lbl.Name, Value: lbl.Value})
   848  		}
   849  	}
   850  
   851  	if err := e.Charts().Add(*charts...); err != nil {
   852  		e.Warning(err)
   853  	}
   854  }
   855  
   856  func (e *Envoy) removeCharts(id string) {
   857  	if id == "" {
   858  		return
   859  	}
   860  
   861  	id = dotReplacer.Replace(id)
   862  	for _, chart := range *e.Charts() {
   863  		if strings.HasSuffix(chart.ID, id) {
   864  			chart.MarkRemove()
   865  			chart.MarkNotCreated()
   866  		}
   867  	}
   868  }
   869  
   870  var dotReplacer = strings.NewReplacer(".", "_")