diff options
Diffstat (limited to 'src/go/plugin/go.d/modules/envoy/charts.go')
-rw-r--r-- | src/go/plugin/go.d/modules/envoy/charts.go | 870 |
1 files changed, 870 insertions, 0 deletions
diff --git a/src/go/plugin/go.d/modules/envoy/charts.go b/src/go/plugin/go.d/modules/envoy/charts.go new file mode 100644 index 000000000..3abe10e42 --- /dev/null +++ b/src/go/plugin/go.d/modules/envoy/charts.go @@ -0,0 +1,870 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package envoy + +import ( + "fmt" + "strings" + + "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module" + + "github.com/prometheus/prometheus/model/labels" +) + +const ( + prioServerState = module.Priority + iota + prioServerMemoryAllocatedSize + prioServerMemoryHeapSize + prioServerMemoryPhysicalSize + prioServerConnectionsCount + prioServerParentConnectionsCount + + prioClusterManagerClustersCount + prioClusterManagerClusterChangesRate + prioClusterManagerClusterUpdatesRate + prioClusterManagerClusterUpdatesVieMergeRate + prioClusterManagerClusterUpdatesMergeCancelledRate + prioClusterManagerClusterUpdatesOufOfMergeWindowsRate + + prioClusterMembershipEndpointsCount + prioClusterMembershipChangesRate + prioClusterMembershipUpdatesRate + + prioClusterUpstreamActiveConnectionsCount + prioClusterUpstreamConnectionsRate + prioClusterUpstreamHTTPConnectionsRate + prioClusterUpstreamDestroyedConnectionsRate + prioClusterUpstreamFailedConnectionsRate + prioClusterUpstreamTimedOutConnectionsRate + prioClusterUpstreamTrafficRate + prioClusterUpstreamBufferedSize + + prioClusterUpstreamActiveRequestsCount + prioClusterUpstreamRequestsRate + prioClusterUpstreamFailedRequestsRate + prioClusterUpstreamActivePendingRequestsCount + prioClusterUpstreamPendingRequestsRate + prioClusterUpstreamPendingFailedRequestsRate + prioClusterUpstreamRequestRetriesRate + prioClusterUpstreamRequestSuccessRetriesRate + prioClusterUpstreamRequestBackoffRetriesRate + + prioListenerManagerListenerCount + prioListenerManagerListenerChangesRate + prioListenerManagerListenerObjectEventsRate + + prioListenerAdminDownstreamActiveConnectionsCount + prioListenerAdminDownstreamConnectionsRate + prioListenerAdminDownstreamDestroyedConnectionsRate + prioListenerAdminDownstreamTimedOutConnectionsRate + prioListenerAdminDownstreamRejectedConnectionsRate + prioListenerAdminDownstreamFilterClosedByRemoteConnectionsRate + prioListenerAdminDownstreamFilterReadErrorsRate + prioListenerAdminDownstreamActiveSocketsCount + prioListenerAdminDownstreamTimedOutSocketsRate + + prioListenerDownstreamActiveConnectionsCount + prioListenerDownstreamConnectionsRate + prioListenerDownstreamDestroyedConnectionsRate + prioListenerDownstreamTimedOutConnectionsRate + prioListenerDownstreamRejectedConnectionsRate + prioListenerDownstreamFilterClosedByRemoteConnectionsRate + prioListenerDownstreamFilterReadErrorsRate + prioListenerDownstreamActiveSocketsCount + prioListenerDownstreamTimedOutSocketsRate + + prioServerUptime +) + +var ( + serverChartsTmpl = module.Charts{ + serverStateChartTmpl.Copy(), + + serverMemoryAllocatedSizeChartTmpl.Copy(), + serverMemoryHeapSizeChartTmpl.Copy(), + serverMemoryPhysicalSizeChartTmpl.Copy(), + + serverConnectionsCountChartTmpl.Copy(), + serverParentConnectionsCountChartTmpl.Copy(), + + serverUptimeChartTmpl.Copy(), + } + serverStateChartTmpl = module.Chart{ + ID: "server_state_%s", + Title: "Server current state", + Units: "state", + Fam: "server", + Ctx: "envoy.server_state", + Priority: prioServerState, + Dims: module.Dims{ + {ID: "envoy_server_state_live_%s", Name: "live"}, + {ID: "envoy_server_state_draining_%s", Name: "draining"}, + {ID: "envoy_server_state_pre_initializing_%s", Name: "pre_initializing"}, + {ID: "envoy_server_state_initializing_%s", Name: "initializing"}, + }, + } + serverConnectionsCountChartTmpl = module.Chart{ + ID: "server_connections_%s", + Title: "Server current connections", + Units: "connections", + Fam: "server", + Ctx: "envoy.server_connections_count", + Priority: prioServerConnectionsCount, + Dims: module.Dims{ + {ID: "envoy_server_total_connections_%s", Name: "connections"}, + }, + } + serverParentConnectionsCountChartTmpl = module.Chart{ + ID: "server_parent_connections_%s", + Title: "Server current parent connections", + Units: "connections", + Fam: "server", + Ctx: "envoy.server_parent_connections_count", + Priority: prioServerParentConnectionsCount, + Dims: module.Dims{ + {ID: "envoy_server_parent_connections_%s", Name: "connections"}, + }, + } + serverMemoryAllocatedSizeChartTmpl = module.Chart{ + ID: "server_memory_allocated_size_%s", + Title: "Server memory allocated size", + Units: "bytes", + Fam: "server", + Ctx: "envoy.server_memory_allocated_size", + Priority: prioServerMemoryAllocatedSize, + Dims: module.Dims{ + {ID: "envoy_server_memory_allocated_%s", Name: "allocated"}, + }, + } + serverMemoryHeapSizeChartTmpl = module.Chart{ + ID: "server_memory_heap_size_%s", + Title: "Server memory heap size", + Units: "bytes", + Fam: "server", + Ctx: "envoy.server_memory_heap_size", + Priority: prioServerMemoryHeapSize, + Dims: module.Dims{ + {ID: "envoy_server_memory_heap_size_%s", Name: "heap"}, + }, + } + serverMemoryPhysicalSizeChartTmpl = module.Chart{ + ID: "server_memory_physical_size_%s", + Title: "Server memory physical size", + Units: "bytes", + Fam: "server", + Ctx: "envoy.server_memory_physical_size", + Priority: prioServerMemoryPhysicalSize, + Dims: module.Dims{ + {ID: "envoy_server_memory_physical_size_%s", Name: "physical"}, + }, + } + serverUptimeChartTmpl = module.Chart{ + ID: "server_uptime_%s", + Title: "Server uptime", + Units: "seconds", + Fam: "uptime", + Ctx: "envoy.server_uptime", + Priority: prioServerUptime, + Dims: module.Dims{ + {ID: "envoy_server_uptime_%s", Name: "uptime"}, + }, + } +) + +var ( + clusterManagerChartsTmpl = module.Charts{ + clusterManagerClusterCountChartTmpl.Copy(), + clusterManagerClusterChangesRateChartTmpl.Copy(), + clusterManagerClusterUpdatesRateChartTmpl.Copy(), + clusterManagerClusterUpdatesViaMergeRateChartTmpl.Copy(), + clusterManagerClusterUpdatesMergeCancelledRateChartTmpl.Copy(), + clusterManagerClusterUpdatesOutOfMergeWindowRateChartTmpl.Copy(), + } + clusterManagerClusterCountChartTmpl = module.Chart{ + ID: "cluster_manager_cluster_count_%s", + Title: "Cluster manager current clusters", + Units: "clusters", + Fam: "cluster mgr", + Ctx: "envoy.cluster_manager_cluster_count", + Priority: prioClusterManagerClustersCount, + Dims: module.Dims{ + {ID: "envoy_cluster_manager_active_clusters_%s", Name: "active"}, + {ID: "envoy_cluster_manager_warming_clusters_%s", Name: "not_active"}, + }, + } + clusterManagerClusterChangesRateChartTmpl = module.Chart{ + ID: "cluster_manager_cluster_changes_%s", + Title: "Cluster manager cluster changes", + Units: "clusters/s", + Fam: "cluster mgr", + Ctx: "envoy.cluster_manager_cluster_changes_rate", + Priority: prioClusterManagerClusterChangesRate, + Dims: module.Dims{ + {ID: "envoy_cluster_manager_cluster_added_%s", Name: "added", Algo: module.Incremental}, + {ID: "envoy_cluster_manager_cluster_modified_%s", Name: "modified", Algo: module.Incremental}, + {ID: "envoy_cluster_manager_cluster_removed_%s", Name: "removed", Algo: module.Incremental}, + }, + } + clusterManagerClusterUpdatesRateChartTmpl = module.Chart{ + ID: "cluster_manager_cluster_updates_%s", + Title: "Cluster manager updates", + Units: "updates/s", + Fam: "cluster mgr", + Ctx: "envoy.cluster_manager_cluster_updates_rate", + Priority: prioClusterManagerClusterUpdatesRate, + Dims: module.Dims{ + {ID: "envoy_cluster_manager_cluster_updated_%s", Name: "cluster", Algo: module.Incremental}, + }, + } + clusterManagerClusterUpdatesViaMergeRateChartTmpl = module.Chart{ + ID: "cluster_manager_cluster_updated_via_merge_%s", + Title: "Cluster manager updates applied as merged updates", + Units: "updates/s", + Fam: "cluster mgr", + Ctx: "envoy.cluster_manager_cluster_updated_via_merge_rate", + Priority: prioClusterManagerClusterUpdatesVieMergeRate, + Dims: module.Dims{ + {ID: "envoy_cluster_manager_cluster_updated_via_merge_%s", Name: "via_merge", Algo: module.Incremental}, + }, + } + clusterManagerClusterUpdatesMergeCancelledRateChartTmpl = module.Chart{ + ID: "cluster_manager_update_merge_cancelled_%s", + Title: "Cluster manager cancelled merged updates", + Units: "updates/s", + Fam: "cluster mgr", + Ctx: "envoy.cluster_manager_update_merge_cancelled_rate", + Priority: prioClusterManagerClusterUpdatesMergeCancelledRate, + Dims: module.Dims{ + {ID: "envoy_cluster_manager_update_merge_cancelled_%s", Name: "merge_cancelled", Algo: module.Incremental}, + }, + } + clusterManagerClusterUpdatesOutOfMergeWindowRateChartTmpl = module.Chart{ + ID: "cluster_manager_update_out_of_merge_window_%s", + Title: "Cluster manager out of a merge window updates", + Units: "updates/s", + Fam: "cluster mgr", + Ctx: "envoy.cluster_manager_update_out_of_merge_window_rate", + Priority: prioClusterManagerClusterUpdatesOufOfMergeWindowsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_manager_update_out_of_merge_window_%s", Name: "out_of_merge_window", Algo: module.Incremental}, + }, + } +) + +var ( + clusterUpstreamChartsTmpl = module.Charts{ + clusterUpstreamActiveConnectionsCountChartTmpl.Copy(), + clusterUpstreamConnectionsRateChartTmpl.Copy(), + clusterUpstreamHTTPConnectionsRateChartTmpl.Copy(), + clusterUpstreamDestroyedConnectionsRateChartTmpl.Copy(), + clusterUpstreamFailedConnectionsRateChartTmpl.Copy(), + clusterUpstreamTimedOutConnectionsRateChartTmpl.Copy(), + clusterUpstreamTrafficRateChartTmpl.Copy(), + clusterUpstreamBufferedSizeChartTmpl.Copy(), + + clusterUpstreamActiveRequestsCountChartTmpl.Copy(), + clusterUpstreamRequestsRateChartTmpl.Copy(), + clusterUpstreamFailedRequestsRateChartTmpl.Copy(), + clusterUpstreamActivePendingRequestsCountChartTmpl.Copy(), + clusterUpstreamPendingRequestsRateChartTmpl.Copy(), + clusterUpstreamPendingFailedRequestsRateChartTmpl.Copy(), + clusterUpstreamRequestRetriesRateChartTmpl.Copy(), + clusterUpstreamRequestSuccessRetriesRateChartTmpl.Copy(), + clusterUpstreamRequestRetriesBackoffRateChartTmpl.Copy(), + + clusterMembershipEndpointsCountChartTmpl.Copy(), + clusterMembershipChangesRateChartTmpl.Copy(), + clusterMembershipUpdatesRateChartTmpl.Copy(), + } + + clusterUpstreamActiveConnectionsCountChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_active_%s", + Title: "Cluster upstream current active connections", + Units: "connections", + Fam: "upstream conns", + Ctx: "envoy.cluster_upstream_cx_active_count", + Priority: prioClusterUpstreamActiveConnectionsCount, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_active_%s", Name: "active"}, + }, + } + clusterUpstreamConnectionsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_total_%s", + Title: "Cluster upstream connections", + Units: "connections/s", + Fam: "upstream conns", + Ctx: "envoy.cluster_upstream_cx_rate", + Priority: prioClusterUpstreamConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_total_%s", Name: "created", Algo: module.Incremental}, + }, + } + clusterUpstreamHTTPConnectionsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_http_total_%s", + Title: "Cluster upstream connections by HTTP version", + Units: "connections/s", + Fam: "upstream conns", + Ctx: "envoy.cluster_upstream_cx_http_rate", + Priority: prioClusterUpstreamHTTPConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_http1_total_%s", Name: "http1", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_cx_http2_total_%s", Name: "http2", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_cx_http3_total_%s", Name: "http3", Algo: module.Incremental}, + }, + } + clusterUpstreamDestroyedConnectionsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_destroy_%s", + Title: "Cluster upstream destroyed connections", + Units: "connections/s", + Fam: "upstream conns", + Ctx: "envoy.cluster_upstream_cx_destroy_rate", + Priority: prioClusterUpstreamDestroyedConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_destroy_local_%s", Name: "local", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_cx_destroy_remote_%s", Name: "remote", Algo: module.Incremental}, + }, + } + clusterUpstreamFailedConnectionsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_connect_fail_%s", + Title: "Cluster upstream failed connections", + Units: "connections/s", + Fam: "upstream conns", + Ctx: "envoy.cluster_upstream_cx_connect_fail_rate", + Priority: prioClusterUpstreamFailedConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_connect_fail_%s", Name: "failed", Algo: module.Incremental}, + }, + } + clusterUpstreamTimedOutConnectionsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_connect_timeout_%s", + Title: "Cluster upstream timed out connections", + Units: "connections/s", + Fam: "upstream conns", + Ctx: "envoy.cluster_upstream_cx_connect_timeout_rate", + Priority: prioClusterUpstreamTimedOutConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_connect_timeout_%s", Name: "timeout", Algo: module.Incremental}, + }, + } + clusterUpstreamTrafficRateChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_bytes_total_%s", + Title: "Cluster upstream connection traffic", + Units: "bytes/s", + Fam: "upstream traffic", + Ctx: "envoy.cluster_upstream_cx_bytes_rate", + Priority: prioClusterUpstreamTrafficRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_rx_bytes_total_%s", Name: "received", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_cx_tx_bytes_total_%s", Name: "sent", Algo: module.Incremental}, + }, + } + clusterUpstreamBufferedSizeChartTmpl = module.Chart{ + ID: "cluster_upstream_cx_bytes_buffered_%s", + Title: "Cluster upstream current connection buffered size", + Units: "bytes", + Fam: "upstream traffic", + Ctx: "envoy.cluster_upstream_cx_bytes_buffered_size", + Priority: prioClusterUpstreamBufferedSize, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_cx_rx_bytes_buffered_%s", Name: "received"}, + {ID: "envoy_cluster_upstream_cx_tx_bytes_buffered_%s", Name: "send"}, + }, + } + + clusterUpstreamActiveRequestsCountChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_active_%s", + Title: "Cluster upstream current active requests", + Units: "requests", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_active_count", + Priority: prioClusterUpstreamActiveRequestsCount, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_active_%s", Name: "active"}, + }, + } + clusterUpstreamRequestsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_total_%s", + Title: "Cluster upstream requests", + Units: "requests/s", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_rate", + Priority: prioClusterUpstreamRequestsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_total_%s", Name: "requests", Algo: module.Incremental}, + }, + } + clusterUpstreamFailedRequestsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_failed_total_%s", + Title: "Cluster upstream failed requests", + Units: "requests/s", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_failed_rate", + Priority: prioClusterUpstreamFailedRequestsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_cancelled_%s", Name: "cancelled", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_maintenance_mode_%s", Name: "maintenance_mode", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_timeout_%s", Name: "timeout", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_max_duration_reached_%s", Name: "max_duration_reached", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_per_try_timeout_%s", Name: "per_try_timeout", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_rx_reset_%s", Name: "reset_local", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_tx_reset_%s", Name: "reset_remote", Algo: module.Incremental}, + }, + } + clusterUpstreamActivePendingRequestsCountChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_pending_active_%s", + Title: "Cluster upstream current active pending requests", + Units: "requests", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_pending_active_count", + Priority: prioClusterUpstreamActivePendingRequestsCount, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_pending_active_%s", Name: "active_pending"}, + }, + } + clusterUpstreamPendingRequestsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_pending_total_%s", + Title: "Cluster upstream pending requests", + Units: "requests/s", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_pending_rate", + Priority: prioClusterUpstreamPendingRequestsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_pending_total_%s", Name: "pending", Algo: module.Incremental}, + }, + } + clusterUpstreamPendingFailedRequestsRateChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_pending_failed_total_%s", + Title: "Cluster upstream failed pending requests", + Units: "requests/s", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_pending_failed_rate", + Priority: prioClusterUpstreamPendingFailedRequestsRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_pending_overflow_%s", Name: "overflow", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_pending_failure_eject_%s", Name: "failure_eject", Algo: module.Incremental}, + }, + } + clusterUpstreamRequestRetriesRateChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_retry_%s", + Title: "Cluster upstream request retries", + Units: "retries/s", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_retry_rate", + Priority: prioClusterUpstreamRequestRetriesRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_retry_%s", Name: "request", Algo: module.Incremental}, + }, + } + clusterUpstreamRequestSuccessRetriesRateChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_retry_success_%s", + Title: "Cluster upstream request successful retries", + Units: "retries/s", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_retry_success_rate", + Priority: prioClusterUpstreamRequestSuccessRetriesRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_retry_success_%s", Name: "success", Algo: module.Incremental}, + }, + } + clusterUpstreamRequestRetriesBackoffRateChartTmpl = module.Chart{ + ID: "cluster_upstream_rq_retry_backoff_%s", + Title: "Cluster upstream request backoff retries", + Units: "retries/s", + Fam: "upstream requests", + Ctx: "envoy.cluster_upstream_rq_retry_backoff_rate", + Priority: prioClusterUpstreamRequestBackoffRetriesRate, + Dims: module.Dims{ + {ID: "envoy_cluster_upstream_rq_retry_backoff_exponential_%s", Name: "exponential", Algo: module.Incremental}, + {ID: "envoy_cluster_upstream_rq_retry_backoff_ratelimited_%s", Name: "ratelimited", Algo: module.Incremental}, + }, + } + + clusterMembershipEndpointsCountChartTmpl = module.Chart{ + ID: "cluster_membership_endpoints_count_%s", + Title: "Cluster membership current endpoints", + Units: "endpoints", + Fam: "cluster membership", + Ctx: "envoy.cluster_membership_endpoints_count", + Priority: prioClusterMembershipEndpointsCount, + Dims: module.Dims{ + {ID: "envoy_cluster_membership_healthy_%s", Name: "healthy"}, + {ID: "envoy_cluster_membership_degraded_%s", Name: "degraded"}, + {ID: "envoy_cluster_membership_excluded_%s", Name: "excluded"}, + }, + } + clusterMembershipChangesRateChartTmpl = module.Chart{ + ID: "cluster_membership_change_%s", + Title: "Cluster membership changes", + Units: "changes/s", + Fam: "cluster membership", + Ctx: "envoy.cluster_membership_changes_rate", + Priority: prioClusterMembershipChangesRate, + Dims: module.Dims{ + {ID: "envoy_cluster_membership_change_%s", Name: "membership", Algo: module.Incremental}, + }, + } + clusterMembershipUpdatesRateChartTmpl = module.Chart{ + ID: "cluster_membership_updates_%s", + Title: "Cluster membership updates", + Units: "updates/s", + Fam: "cluster membership", + Ctx: "envoy.cluster_membership_updates_rate", + Priority: prioClusterMembershipUpdatesRate, + Dims: module.Dims{ + {ID: "envoy_cluster_update_success_%s", Name: "success", Algo: module.Incremental}, + {ID: "envoy_cluster_update_failure_%s", Name: "failure", Algo: module.Incremental}, + {ID: "envoy_cluster_update_empty_%s", Name: "empty", Algo: module.Incremental}, + {ID: "envoy_cluster_update_no_rebuild_%s", Name: "no_rebuild", Algo: module.Incremental}, + }, + } +) + +var ( + listenerManagerChartsTmpl = module.Charts{ + listenerManagerListenersByStateCountChartTmpl.Copy(), + listenerManagerListenerChangesRateChartTmpl.Copy(), + listenerManagerListenerObjectEventsRateChartTmpl.Copy(), + } + listenerManagerListenersByStateCountChartTmpl = module.Chart{ + ID: "listener_manager_listeners_count_%s", + Title: "Listener manager current listeners", + Units: "listeners", + Fam: "downstream mgr", + Ctx: "envoy.listener_manager_listeners_count", + Priority: prioListenerManagerListenerCount, + Dims: module.Dims{ + {ID: "envoy_listener_manager_total_listeners_active_%s", Name: "active"}, + {ID: "envoy_listener_manager_total_listeners_warming_%s", Name: "warming"}, + {ID: "envoy_listener_manager_total_listeners_draining_%s", Name: "draining"}, + }, + } + listenerManagerListenerChangesRateChartTmpl = module.Chart{ + ID: "listener_manager_listener_changes_%s", + Title: "Listener manager listener changes", + Units: "listeners/s", + Fam: "downstream mgr", + Ctx: "envoy.listener_manager_listener_changes_rate", + Priority: prioListenerManagerListenerChangesRate, + Dims: module.Dims{ + {ID: "envoy_listener_manager_listener_added_%s", Name: "added", Algo: module.Incremental}, + {ID: "envoy_listener_manager_listener_modified_%s", Name: "modified", Algo: module.Incremental}, + {ID: "envoy_listener_manager_listener_removed_%s", Name: "removed", Algo: module.Incremental}, + {ID: "envoy_listener_manager_listener_stopped_%s", Name: "stopped", Algo: module.Incremental}, + }, + } + listenerManagerListenerObjectEventsRateChartTmpl = module.Chart{ + ID: "listener_manager_listener_object_events_%s", + Title: "Listener manager listener object events", + Units: "objects/s", + Fam: "downstream mgr", + Ctx: "envoy.listener_manager_listener_object_events_rate", + Priority: prioListenerManagerListenerObjectEventsRate, + Dims: module.Dims{ + {ID: "envoy_listener_manager_listener_create_success_%s", Name: "create_success", Algo: module.Incremental}, + {ID: "envoy_listener_manager_listener_create_failure_%s", Name: "create_failure", Algo: module.Incremental}, + {ID: "envoy_listener_manager_listener_in_place_updated_%s", Name: "in_place_updated", Algo: module.Incremental}, + }, + } +) + +var ( + listenerAdminDownstreamChartsTmpl = module.Charts{ + listenerAdminDownstreamActiveConnectionsCountChartTmpl.Copy(), + listenerAdminDownstreamConnectionsRateChartTmpl.Copy(), + listenerAdminDownstreamDestroyedConnectionsRateChartTmpl.Copy(), + listenerAdminDownstreamTimedOutConnectionsRateChartTmpl.Copy(), + listenerAdminDownstreamRejectedConnectionsRateChartTmpl.Copy(), + listenerAdminDownstreamFilterClosedByRemoteConnectionsRateChartTmpl.Copy(), + listenerAdminDownstreamFilterReadErrorsRateChartTmpl.Copy(), + + listenerAdminDownstreamActiveSocketsCountChartTmpl.Copy(), + listenerAdminDownstreamTimedOutSocketsRateChartTmpl.Copy(), + } + + listenerAdminDownstreamActiveConnectionsCountChartTmpl = module.Chart{ + ID: "listener_admin_downstream_cx_active_%s", + Title: "Listener admin downstream current active connections", + Units: "connections", + Fam: "downstream adm conns", + Ctx: "envoy.listener_admin_downstream_cx_active_count", + Priority: prioListenerAdminDownstreamActiveConnectionsCount, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_cx_active_%s", Name: "active"}, + }, + } + listenerAdminDownstreamConnectionsRateChartTmpl = module.Chart{ + ID: "listener_admin_downstream_cx_total_%s", + Title: "Listener admin downstream connections", + Units: "connections/s", + Fam: "downstream adm conns", + Ctx: "envoy.listener_admin_downstream_cx_rate", + Priority: prioListenerAdminDownstreamConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_cx_total_%s", Name: "created", Algo: module.Incremental}, + }, + } + listenerAdminDownstreamDestroyedConnectionsRateChartTmpl = module.Chart{ + ID: "listener_admin_downstream_cx_destroy_%s", + Title: "Listener admin downstream destroyed connections", + Units: "connections/s", + Fam: "downstream adm conns", + Ctx: "envoy.listener_admin_downstream_cx_destroy_rate", + Priority: prioListenerAdminDownstreamDestroyedConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_cx_destroy_%s", Name: "destroyed", Algo: module.Incremental}, + }, + } + listenerAdminDownstreamTimedOutConnectionsRateChartTmpl = module.Chart{ + ID: "listener_admin_downstream_cx_transport_socket_connect_timeout_%s", + Title: "Listener admin downstream timed out connections", + Units: "connections/s", + Fam: "downstream adm conns", + Ctx: "envoy.listener_admin_downstream_cx_transport_socket_connect_timeout_rate", + Priority: prioListenerAdminDownstreamTimedOutConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_cx_transport_socket_connect_timeout_%s", Name: "timeout", Algo: module.Incremental}, + }, + } + listenerAdminDownstreamRejectedConnectionsRateChartTmpl = module.Chart{ + ID: "listener_admin_downstream_cx_rejected_%s", + Title: "Listener admin downstream rejected connections", + Units: "connections/s", + Fam: "downstream adm conns", + Ctx: "envoy.listener_admin_downstream_cx_rejected_rate", + Priority: prioListenerAdminDownstreamRejectedConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_cx_overflow_%s", Name: "overflow", Algo: module.Incremental}, + {ID: "envoy_listener_admin_downstream_cx_overload_reject_%s", Name: "overload", Algo: module.Incremental}, + {ID: "envoy_listener_admin_downstream_global_cx_overflow_%s", Name: "global_overflow", Algo: module.Incremental}, + }, + } + listenerAdminDownstreamFilterClosedByRemoteConnectionsRateChartTmpl = module.Chart{ + ID: "listener_admin_downstream_listener_filter_remote_close_%s", + Title: "Listener admin downstream connections closed by remote when peek data for listener filters", + Units: "connections/s", + Fam: "downstream adm conns", + Ctx: "envoy.listener_admin_downstream_listener_filter_remote_close_rate", + Priority: prioListenerAdminDownstreamFilterClosedByRemoteConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_listener_filter_remote_close_%s", Name: "closed", Algo: module.Incremental}, + }, + } + listenerAdminDownstreamFilterReadErrorsRateChartTmpl = module.Chart{ + ID: "listener_admin_downstream_listener_filter_error_%s", + Title: "Listener admin downstream read errors when peeking data for listener filters", + Units: "errors/s", + Fam: "downstream adm conns", + Ctx: "envoy.listener_admin_downstream_listener_filter_error_rate", + Priority: prioListenerAdminDownstreamFilterReadErrorsRate, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_listener_filter_error_%s", Name: "read", Algo: module.Incremental}, + }, + } + + listenerAdminDownstreamActiveSocketsCountChartTmpl = module.Chart{ + ID: "listener_admin_downstream_pre_cx_active_%s", + Title: "Listener admin downstream current active sockets", + Units: "sockets", + Fam: "downstream adm sockets", + Ctx: "envoy.listener_admin_downstream_pre_cx_active_count", + Priority: prioListenerAdminDownstreamActiveSocketsCount, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_pre_cx_active_%s", Name: "active"}, + }, + } + listenerAdminDownstreamTimedOutSocketsRateChartTmpl = module.Chart{ + ID: "listener_admin_downstream_pre_cx_timeout_%s", + Title: "Listener admin downstream timed out sockets", + Units: "sockets/s", + Fam: "downstream adm sockets", + Ctx: "envoy.listener_admin_downstream_pre_cx_timeout_rate", + Priority: prioListenerAdminDownstreamTimedOutSocketsRate, + Dims: module.Dims{ + {ID: "envoy_listener_admin_downstream_pre_cx_timeout_%s", Name: "timeout", Algo: module.Incremental}, + }, + } +) + +var ( + listenerDownstreamChartsTmpl = module.Charts{ + listenerDownstreamActiveConnectionsCountChartTmpl.Copy(), + listenerDownstreamConnectionsRateChartTmpl.Copy(), + listenerDownstreamDestroyedConnectionsRateChartTmpl.Copy(), + listenerDownstreamTimedOutConnectionsRateChartTmpl.Copy(), + listenerDownstreamRejectedConnectionsRateChartTmpl.Copy(), + listenerDownstreamFilterClosedByRemoteConnectionsRateChartTmpl.Copy(), + listenerDownstreamFilterReadErrorsRateChartTmpl.Copy(), + + listenerDownstreamActiveSocketsCountChartTmpl.Copy(), + listenerDownstreamTimedOutSocketsRateChartTmpl.Copy(), + } + + listenerDownstreamActiveConnectionsCountChartTmpl = module.Chart{ + ID: "listener_downstream_cx_active_%s", + Title: "Listener downstream current active connections", + Units: "connections", + Fam: "downstream conns", + Ctx: "envoy.listener_downstream_cx_active_count", + Priority: prioListenerDownstreamActiveConnectionsCount, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_cx_active_%s", Name: "active"}, + }, + } + listenerDownstreamConnectionsRateChartTmpl = module.Chart{ + ID: "listener_downstream_cx_total_%s", + Title: "Listener downstream connections", + Units: "connections/s", + Fam: "downstream conns", + Ctx: "envoy.listener_downstream_cx_rate", + Priority: prioListenerDownstreamConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_cx_total_%s", Name: "created", Algo: module.Incremental}, + }, + } + listenerDownstreamDestroyedConnectionsRateChartTmpl = module.Chart{ + ID: "listener_downstream_cx_destroy_%s", + Title: "Listener downstream destroyed connections", + Units: "connections/s", + Fam: "downstream conns", + Ctx: "envoy.listener_downstream_cx_destroy_rate", + Priority: prioListenerDownstreamDestroyedConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_cx_destroy_%s", Name: "destroyed", Algo: module.Incremental}, + }, + } + listenerDownstreamTimedOutConnectionsRateChartTmpl = module.Chart{ + ID: "listener_downstream_cx_transport_socket_connect_timeout_%s", + Title: "Listener downstream timed out connections", + Units: "connections/s", + Fam: "downstream conns", + Ctx: "envoy.listener_downstream_cx_transport_socket_connect_timeout_rate", + Priority: prioListenerDownstreamTimedOutConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_cx_transport_socket_connect_timeout_%s", Name: "timeout", Algo: module.Incremental}, + }, + } + listenerDownstreamRejectedConnectionsRateChartTmpl = module.Chart{ + ID: "listener_downstream_cx_rejected_%s", + Title: "Listener downstream rejected connections", + Units: "connections/s", + Fam: "downstream conns", + Ctx: "envoy.listener_downstream_cx_rejected_rate", + Priority: prioListenerDownstreamRejectedConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_cx_overflow_%s", Name: "overflow", Algo: module.Incremental}, + {ID: "envoy_listener_downstream_cx_overload_reject_%s", Name: "overload", Algo: module.Incremental}, + {ID: "envoy_listener_downstream_global_cx_overflow_%s", Name: "global_overflow", Algo: module.Incremental}, + }, + } + listenerDownstreamFilterClosedByRemoteConnectionsRateChartTmpl = module.Chart{ + ID: "listener_downstream_listener_filter_remote_close_%s", + Title: "Listener downstream connections closed by remote when peek data for listener filters", + Units: "connections/s", + Fam: "downstream conns", + Ctx: "envoy.listener_downstream_listener_filter_remote_close_rate", + Priority: prioListenerDownstreamFilterClosedByRemoteConnectionsRate, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_listener_filter_remote_close_%s", Name: "closed", Algo: module.Incremental}, + }, + } + listenerDownstreamFilterReadErrorsRateChartTmpl = module.Chart{ + ID: "listener_downstream_listener_filter_error_%s", + Title: "Listener downstream read errors when peeking data for listener filters", + Units: "errors/s", + Fam: "downstream conns", + Ctx: "envoy.listener_downstream_listener_filter_error_rate", + Priority: prioListenerDownstreamFilterReadErrorsRate, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_listener_filter_error_%s", Name: "read", Algo: module.Incremental}, + }, + } + + listenerDownstreamActiveSocketsCountChartTmpl = module.Chart{ + ID: "listener_downstream_pre_cx_active_%s", + Title: "Listener downstream current active sockets", + Units: "sockets", + Fam: "downstream sockets", + Ctx: "envoy.listener_downstream_pre_cx_active_count", + Priority: prioListenerDownstreamActiveSocketsCount, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_pre_cx_active_%s", Name: "active"}, + }, + } + listenerDownstreamTimedOutSocketsRateChartTmpl = module.Chart{ + ID: "listener_downstream_pre_cx_timeout_%s", + Title: "Listener downstream timed out sockets", + Units: "sockets/s", + Fam: "downstream sockets", + Ctx: "envoy.listener_downstream_pre_cx_timeout_rate", + Priority: prioListenerDownstreamTimedOutSocketsRate, + Dims: module.Dims{ + {ID: "envoy_listener_downstream_pre_cx_timeout_%s", Name: "timeout", Algo: module.Incremental}, + }, + } +) + +func (e *Envoy) addServerCharts(id string, labels labels.Labels) { + e.addCharts(serverChartsTmpl.Copy(), id, labels) +} + +func (e *Envoy) addClusterManagerCharts(id string, labels labels.Labels) { + e.addCharts(clusterManagerChartsTmpl.Copy(), id, labels) +} + +func (e *Envoy) addClusterUpstreamCharts(id string, labels labels.Labels) { + e.addCharts(clusterUpstreamChartsTmpl.Copy(), id, labels) +} + +func (e *Envoy) addListenerManagerCharts(id string, labels labels.Labels) { + e.addCharts(listenerManagerChartsTmpl.Copy(), id, labels) +} + +func (e *Envoy) addListenerAdminDownstreamCharts(id string, labels labels.Labels) { + e.addCharts(listenerAdminDownstreamChartsTmpl.Copy(), id, labels) +} + +func (e *Envoy) addListenerDownstreamCharts(id string, labels labels.Labels) { + e.addCharts(listenerDownstreamChartsTmpl.Copy(), id, labels) +} + +func (e *Envoy) addCharts(charts *module.Charts, id string, labels labels.Labels) { + charts = charts.Copy() + + for _, chart := range *charts { + if id == "" { + chart.ID = strings.Replace(chart.ID, "_%s", "", 1) + for _, dim := range chart.Dims { + dim.ID = strings.Replace(dim.ID, "_%s", "", 1) + } + } else { + chart.ID = fmt.Sprintf(chart.ID, dotReplacer.Replace(id)) + for _, dim := range chart.Dims { + dim.ID = fmt.Sprintf(dim.ID, id) + } + } + + for _, lbl := range labels { + chart.Labels = append(chart.Labels, module.Label{Key: lbl.Name, Value: lbl.Value}) + } + } + + if err := e.Charts().Add(*charts...); err != nil { + e.Warning(err) + } +} + +func (e *Envoy) removeCharts(id string) { + if id == "" { + return + } + + id = dotReplacer.Replace(id) + for _, chart := range *e.Charts() { + if strings.HasSuffix(chart.ID, id) { + chart.MarkRemove() + chart.MarkNotCreated() + } + } +} + +var dotReplacer = strings.NewReplacer(".", "_") |