// SPDX-License-Identifier: GPL-3.0-or-later package envoy import ( "fmt" "strings" "github.com/netdata/netdata/go/go.d.plugin/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(".", "_")