| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package elasticsearch |
| 4 | |
| 5 | // https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html |
| 6 | |
| 7 | type esMetrics struct { |
| 8 | // https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-stats.html |
| 9 | NodesStats *esNodesStats |
| 10 | // https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html |
| 11 | ClusterHealth *esClusterHealth |
| 12 | // https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-stats.html |
| 13 | ClusterStats *esClusterStats |
| 14 | // https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-indices.html |
| 15 | LocalIndicesStats []esIndexStats |
| 16 | } |
| 17 | |
| 18 | func (m esMetrics) empty() bool { |
| 19 | switch { |
| 20 | case m.hasNodesStats(), m.hasClusterHealth(), m.hasClusterStats(), m.hasLocalIndicesStats(): |
| 21 | return false |
| 22 | } |
| 23 | return true |
| 24 | } |
| 25 | |
| 26 | func (m esMetrics) hasNodesStats() bool { return m.NodesStats != nil && len(m.NodesStats.Nodes) > 0 } |
| 27 | func (m esMetrics) hasClusterHealth() bool { return m.ClusterHealth != nil } |
| 28 | func (m esMetrics) hasClusterStats() bool { return m.ClusterStats != nil } |
| 29 | func (m esMetrics) hasLocalIndicesStats() bool { return len(m.LocalIndicesStats) > 0 } |
| 30 | |
| 31 | type ( |
| 32 | esNodesStats struct { |
| 33 | ClusterName string `json:"cluster_name"` |
| 34 | Nodes map[string]*esNodeStats `json:"nodes"` |
| 35 | } |
| 36 | esNodeStats struct { |
| 37 | Name string |
| 38 | Host string |
| 39 | Indices struct { |
| 40 | Indexing struct { |
| 41 | IndexTotal float64 `stm:"index_total" json:"index_total"` |
| 42 | IndexCurrent float64 `stm:"index_current" json:"index_current"` |
| 43 | IndexTimeInMillis float64 `stm:"index_time_in_millis" json:"index_time_in_millis"` |
| 44 | } `stm:"indexing"` |
| 45 | Search struct { |
| 46 | FetchTotal float64 `stm:"fetch_total" json:"fetch_total"` |
| 47 | FetchCurrent float64 `stm:"fetch_current" json:"fetch_current"` |
| 48 | FetchTimeInMillis float64 `stm:"fetch_time_in_millis" json:"fetch_time_in_millis"` |
| 49 | QueryTotal float64 `stm:"query_total" json:"query_total"` |
| 50 | QueryCurrent float64 `stm:"query_current" json:"query_current"` |
| 51 | QueryTimeInMillis float64 `stm:"query_time_in_millis" json:"query_time_in_millis"` |
| 52 | } `stm:"search"` |
| 53 | Refresh struct { |
| 54 | Total float64 `stm:"total"` |
| 55 | TimeInMillis float64 `stm:"total_time_in_millis" json:"total_time_in_millis"` |
| 56 | } `stm:"refresh"` |
| 57 | Flush struct { |
| 58 | Total float64 `stm:"total"` |
| 59 | TimeInMillis float64 `stm:"total_time_in_millis" json:"total_time_in_millis"` |
| 60 | } `stm:"flush"` |
| 61 | FieldData struct { |
| 62 | MemorySizeInBytes float64 `stm:"memory_size_in_bytes" json:"memory_size_in_bytes"` |
| 63 | Evictions float64 `stm:"evictions"` |
| 64 | } `stm:"fielddata"` |
| 65 | Segments struct { |
| 66 | Count float64 `stm:"count" json:"count"` |
| 67 | MemoryInBytes float64 `stm:"memory_in_bytes" json:"memory_in_bytes"` |
| 68 | TermsMemoryInBytes float64 `stm:"terms_memory_in_bytes" json:"terms_memory_in_bytes"` |
| 69 | StoredFieldsMemoryInBytes float64 `stm:"stored_fields_memory_in_bytes" json:"stored_fields_memory_in_bytes"` |
| 70 | TermVectorsMemoryInBytes float64 `stm:"term_vectors_memory_in_bytes" json:"term_vectors_memory_in_bytes"` |
| 71 | NormsMemoryInBytes float64 `stm:"norms_memory_in_bytes" json:"norms_memory_in_bytes"` |
| 72 | PointsMemoryInBytes float64 `stm:"points_memory_in_bytes" json:"points_memory_in_bytes"` |
| 73 | DocValuesMemoryInBytes float64 `stm:"doc_values_memory_in_bytes" json:"doc_values_memory_in_bytes"` |
| 74 | IndexWriterMemoryInBytes float64 `stm:"index_writer_memory_in_bytes" json:"index_writer_memory_in_bytes"` |
| 75 | VersionMapMemoryInBytes float64 `stm:"version_map_memory_in_bytes" json:"version_map_memory_in_bytes"` |
| 76 | FixedBitSetMemoryInBytes float64 `stm:"fixed_bit_set_memory_in_bytes" json:"fixed_bit_set_memory_in_bytes"` |
| 77 | } `stm:"segments"` |
| 78 | Translog struct { |
| 79 | Operations float64 `stm:"operations"` |
| 80 | SizeInBytes float64 `stm:"size_in_bytes" json:"size_in_bytes"` |
| 81 | UncommittedOperations float64 `stm:"uncommitted_operations" json:"uncommitted_operations"` |
| 82 | UncommittedSizeInBytes float64 `stm:"uncommitted_size_in_bytes" json:"uncommitted_size_in_bytes"` |
| 83 | } `stm:"translog"` |
| 84 | } `stm:"indices"` |
| 85 | Process struct { |
| 86 | OpenFileDescriptors float64 `stm:"open_file_descriptors" json:"open_file_descriptors"` |
| 87 | MaxFileDescriptors float64 `stm:"max_file_descriptors" json:"max_file_descriptors"` |
| 88 | } `stm:"process"` |
| 89 | JVM struct { |
| 90 | Mem struct { |
| 91 | HeapUsedPercent float64 `stm:"heap_used_percent" json:"heap_used_percent"` |
| 92 | HeapUsedInBytes float64 `stm:"heap_used_in_bytes" json:"heap_used_in_bytes"` |
| 93 | HeapCommittedInBytes float64 `stm:"heap_committed_in_bytes" json:"heap_committed_in_bytes"` |
| 94 | } `stm:"mem"` |
| 95 | GC struct { |
| 96 | Collectors struct { |
| 97 | Young struct { |
| 98 | CollectionCount float64 `stm:"collection_count" json:"collection_count"` |
| 99 | CollectionTimeInMillis float64 `stm:"collection_time_in_millis" json:"collection_time_in_millis"` |
| 100 | } `stm:"young"` |
| 101 | Old struct { |
| 102 | CollectionCount float64 `stm:"collection_count" json:"collection_count"` |
| 103 | CollectionTimeInMillis float64 `stm:"collection_time_in_millis" json:"collection_time_in_millis"` |
| 104 | } `stm:"old"` |
| 105 | } `stm:"collectors"` |
| 106 | } `stm:"gc"` |
| 107 | BufferPools struct { |
| 108 | Mapped struct { |
| 109 | Count float64 `stm:"count"` |
| 110 | UsedInBytes float64 `stm:"used_in_bytes" json:"used_in_bytes"` |
| 111 | TotalCapacityInBytes float64 `stm:"total_capacity_in_bytes" json:"total_capacity_in_bytes"` |
| 112 | } `stm:"mapped"` |
| 113 | Direct struct { |
| 114 | Count float64 `stm:"count"` |
| 115 | UsedInBytes float64 `stm:"used_in_bytes" json:"used_in_bytes"` |
| 116 | TotalCapacityInBytes float64 `stm:"total_capacity_in_bytes" json:"total_capacity_in_bytes"` |
| 117 | } `stm:"direct"` |
| 118 | } `stm:"buffer_pools" json:"buffer_pools"` |
| 119 | } `stm:"jvm"` |
| 120 | // https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html |
| 121 | ThreadPool struct { |
| 122 | Generic struct { |
| 123 | Queue float64 `stm:"queue"` |
| 124 | Rejected float64 `stm:"rejected"` |
| 125 | } `stm:"generic"` |
| 126 | Search struct { |
| 127 | Queue float64 `stm:"queue"` |
| 128 | Rejected float64 `stm:"rejected"` |
| 129 | } `stm:"search"` |
| 130 | SearchThrottled struct { |
| 131 | Queue float64 `stm:"queue"` |
| 132 | Rejected float64 `stm:"rejected"` |
| 133 | } `stm:"search_throttled" json:"search_throttled"` |
| 134 | Get struct { |
| 135 | Queue float64 `stm:"queue"` |
| 136 | Rejected float64 `stm:"rejected"` |
| 137 | } `stm:"get"` |
| 138 | Analyze struct { |
| 139 | Queue float64 `stm:"queue"` |
| 140 | Rejected float64 `stm:"rejected"` |
| 141 | } `stm:"analyze"` |
| 142 | Write struct { |
| 143 | Queue float64 `stm:"queue"` |
| 144 | Rejected float64 `stm:"rejected"` |
| 145 | } `stm:"write"` |
| 146 | Snapshot struct { |
| 147 | Queue float64 `stm:"queue"` |
| 148 | Rejected float64 `stm:"rejected"` |
| 149 | } `stm:"snapshot"` |
| 150 | Warmer struct { |
| 151 | Queue float64 `stm:"queue"` |
| 152 | Rejected float64 `stm:"rejected"` |
| 153 | } `stm:"warmer"` |
| 154 | Refresh struct { |
| 155 | Queue float64 `stm:"queue"` |
| 156 | Rejected float64 `stm:"rejected"` |
| 157 | } `stm:"refresh"` |
| 158 | Listener struct { |
| 159 | Queue float64 `stm:"queue"` |
| 160 | Rejected float64 `stm:"rejected"` |
| 161 | } `stm:"listener"` |
| 162 | FetchShardStarted struct { |
| 163 | Queue float64 `stm:"queue"` |
| 164 | Rejected float64 `stm:"rejected"` |
| 165 | } `stm:"fetch_shard_started" json:"fetch_shard_started"` |
| 166 | FetchShardStore struct { |
| 167 | Queue float64 `stm:"queue"` |
| 168 | Rejected float64 `stm:"rejected"` |
| 169 | } `stm:"fetch_shard_store" json:"fetch_shard_store"` |
| 170 | Flush struct { |
| 171 | Queue float64 `stm:"queue"` |
| 172 | Rejected float64 `stm:"rejected"` |
| 173 | } `stm:"flush"` |
| 174 | ForceMerge struct { |
| 175 | Queue float64 `stm:"queue"` |
| 176 | Rejected float64 `stm:"rejected"` |
| 177 | } `stm:"force_merge" json:"force_merge"` |
| 178 | Management struct { |
| 179 | Queue float64 `stm:"queue"` |
| 180 | Rejected float64 `stm:"rejected"` |
| 181 | } `stm:"management"` |
| 182 | } `stm:"thread_pool" json:"thread_pool"` |
| 183 | Transport struct { |
| 184 | RxCount float64 `stm:"rx_count" json:"rx_count"` |
| 185 | RxSizeInBytes float64 `stm:"rx_size_in_bytes" json:"rx_size_in_bytes"` |
| 186 | TxCount float64 `stm:"tx_count" json:"tx_count"` |
| 187 | TxSizeInBytes float64 `stm:"tx_size_in_bytes" json:"tx_size_in_bytes"` |
| 188 | } `stm:"transport"` |
| 189 | HTTP struct { |
| 190 | CurrentOpen float64 `stm:"current_open" json:"current_open"` |
| 191 | } `stm:"http"` |
| 192 | Breakers struct { |
| 193 | Request struct { |
| 194 | Tripped float64 `stm:"tripped"` |
| 195 | } `stm:"request"` |
| 196 | FieldData struct { |
| 197 | Tripped float64 `stm:"tripped"` |
| 198 | } `stm:"fielddata"` |
| 199 | InFlightRequests struct { |
| 200 | Tripped float64 `stm:"tripped"` |
| 201 | } `stm:"in_flight_requests" json:"in_flight_requests"` |
| 202 | ModelInference struct { |
| 203 | Tripped float64 `stm:"tripped"` |
| 204 | } `stm:"model_inference" json:"model_inference"` |
| 205 | Accounting struct { |
| 206 | Tripped float64 `stm:"tripped"` |
| 207 | } `stm:"accounting"` |
| 208 | Parent struct { |
| 209 | Tripped float64 `stm:"tripped"` |
| 210 | } `stm:"parent"` |
| 211 | } `stm:"breakers"` |
| 212 | } |
| 213 | ) |
| 214 | |
| 215 | type esClusterHealth struct { |
| 216 | ClusterName string `json:"cluster_name"` |
| 217 | Status string |
| 218 | NumOfNodes float64 `stm:"number_of_nodes" json:"number_of_nodes"` |
| 219 | NumOfDataNodes float64 `stm:"number_of_data_nodes" json:"number_of_data_nodes"` |
| 220 | ActivePrimaryShards float64 `stm:"active_primary_shards" json:"active_primary_shards"` |
| 221 | ActiveShards float64 `stm:"active_shards" json:"active_shards"` |
| 222 | RelocatingShards float64 `stm:"relocating_shards" json:"relocating_shards"` |
| 223 | InitializingShards float64 `stm:"initializing_shards" json:"initializing_shards"` |
| 224 | UnassignedShards float64 `stm:"unassigned_shards" json:"unassigned_shards"` |
| 225 | DelayedUnassignedShards float64 `stm:"delayed_unassigned_shards" json:"delayed_unassigned_shards"` |
| 226 | NumOfPendingTasks float64 `stm:"number_of_pending_tasks" json:"number_of_pending_tasks"` |
| 227 | NumOfInFlightFetch float64 `stm:"number_of_in_flight_fetch" json:"number_of_in_flight_fetch"` |
| 228 | ActiveShardsPercentAsNumber float64 `stm:"active_shards_percent_as_number" json:"active_shards_percent_as_number"` |
| 229 | } |
| 230 | |
| 231 | type esClusterStats struct { |
| 232 | ClusterName string `json:"cluster_name"` |
| 233 | Nodes struct { |
| 234 | Count struct { |
| 235 | Total float64 `stm:"total"` |
| 236 | CoordinatingOnly float64 `stm:"coordinating_only" json:"coordinating_only"` |
| 237 | Data float64 `stm:"data"` |
| 238 | DataCold float64 `stm:"data_cold" json:"data_cold"` |
| 239 | DataContent float64 `stm:"data_content" json:"data_content"` |
| 240 | DataFrozen float64 `stm:"data_frozen" json:"data_frozen"` |
| 241 | DataHot float64 `stm:"data_hot" json:"data_hot"` |
| 242 | DataWarm float64 `stm:"data_warm" json:"data_warm"` |
| 243 | Ingest float64 `stm:"ingest"` |
| 244 | Master float64 `stm:"master"` |
| 245 | ML float64 `stm:"ml"` |
| 246 | RemoteClusterClient float64 `stm:"remote_cluster_client" json:"remote_cluster_client"` |
| 247 | Transform float64 `stm:"transform"` |
| 248 | VotingOnly float64 `stm:"voting_only" json:"voting_only"` |
| 249 | } `stm:"count"` |
| 250 | } `stm:"nodes"` |
| 251 | Indices struct { |
| 252 | Count float64 `stm:"count"` |
| 253 | Shards struct { |
| 254 | Total float64 `stm:"total"` |
| 255 | Primaries float64 `stm:"primaries"` |
| 256 | Replication float64 `stm:"replication"` |
| 257 | } `stm:"shards"` |
| 258 | Docs struct { |
| 259 | Count float64 `stm:"count"` |
| 260 | } `stm:"docs"` |
| 261 | Store struct { |
| 262 | SizeInBytes float64 `stm:"size_in_bytes" json:"size_in_bytes"` |
| 263 | } `stm:"store"` |
| 264 | QueryCache struct { |
| 265 | HitCount float64 `stm:"hit_count" json:"hit_count"` |
| 266 | MissCount float64 `stm:"miss_count" json:"miss_count"` |
| 267 | } `stm:"query_cache" json:"query_cache"` |
| 268 | } `stm:"indices"` |
| 269 | } |
| 270 | |
| 271 | type esIndexStats struct { |
| 272 | Index string |
| 273 | Health string |
| 274 | Rep string |
| 275 | DocsCount string `json:"docs.count"` |
| 276 | StoreSize string `json:"store.size"` |
| 277 | } |