Skip to content

Commit 74714c1

Browse files
committed
Fix OpenSearch 3.4.0+ API compatibility and enhance test infrastructure
This commit resolves compatibility issues discovered during integration testing with OpenSearch 3.4.0+, ensuring the Go client works seamlessly with the latest OpenSearch versions. - **Nodes Stats API**: Add warmer fields to merges section with proper _count/_millis suffixes; add status_counter field with doc_status subfields - **Indices Stats API**: Add warmer fields to IndicesStatsMerges struct with proper _count/_millis suffixes - **Cat Thread Pool API**: Add parallelism field for thread pool metrics - **Cat APIs** (indices, shards, nodes): Add comprehensive merges warmer fields matching flattened JSON structure from OpenSearch responses - Fix Cat APIs JSON unmarshaling by changing byte fields from *int to *string to properly handle OpenSearch 3.4.0+ values like "0b" - Remove incorrect ,string JSON tags from string fields - Ensures compatibility with OpenSearch's mixed data type responses - Correctly implement different naming patterns across API families: - Cat APIs: total_invocations, total_time - Stats APIs: total_invocations_count, total_time_millis Signed-off-by: Sean Chittenden <sean.chittenden@crowdstrike.com>
1 parent 33e7fa0 commit 74714c1

6 files changed

Lines changed: 283 additions & 211 deletions

File tree

opensearchapi/api_cat-indices.go

Lines changed: 119 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -58,108 +58,125 @@ type CatIndexResp struct {
5858
CreationDate int `json:"creation.date,string"`
5959
CreationDateString string `json:"creation.date.string"`
6060
// Pointer as newly created indices can return null
61-
StoreSize *string `json:"store.size"`
62-
PrimaryStoreSize *string `json:"pri.store.size"`
63-
CompletionSize *string `json:"completion.size"`
64-
PrimaryCompletionSize *string `json:"pri.completion.size"`
65-
FieldDataMemorySize *string `json:"fielddata.memory_size"`
66-
PrimaryFieldDataMemorySize *string `json:"pri.fielddata.memory_size"`
67-
FieldDataEvictions *int `json:"fielddata.evictions,string"`
68-
PrimaryFieldDataEvictions *int `json:"pri.fielddata.evictions,string"`
69-
QueryCacheMemorySize *string `json:"query_cache.memory_size"`
70-
PrimaryQueryCacheMemorySize *string `json:"pri.query_cache.memory_size"`
71-
QueryCacheEvictions *int `json:"query_cache.evictions,string"`
72-
PrimaryQueryCacheEvictions *int `json:"pri.query_cache.evictions,string"`
73-
RequestCacheMemorySize *string `json:"request_cache.memory_size"`
74-
PrimaryRequestCacheMemorySize *string `json:"pri.request_cache.memory_size"`
75-
RequestCacheEvictions *int `json:"request_cache.evictions,string"`
76-
PrimaryRequestCacheEvictions *int `json:"pri.request_cache.evictions,string"`
77-
RequestCacheHitCount *int `json:"request_cache.hit_count,string"`
78-
PrimaryRequestCacheHitCount *int `json:"pri.request_cache.hit_count,string"`
79-
RequestCacheMissCount *int `json:"request_cache.miss_count,string"`
80-
PrimaryRequestCacheMissCount *int `json:"pri.request_cache.miss_count,string"`
81-
FlushTotal *int `json:"flush.total,string"`
82-
PrimaryFlushTotal *int `json:"pri.flush.total,string"`
83-
FlushTime *string `json:"flush.total_time"`
84-
PrimaryFlushTime *string `json:"pri.flush.total_time"`
85-
GetCurrent *int `json:"get.current,string"`
86-
PrimaryGetCurrent *int `json:"pri.get.current,string"`
87-
GetTime *string `json:"get.time"`
88-
PrimaryGetTime *string `json:"pri.get.time"`
89-
GetTotal *int `json:"get.total,string"`
90-
PrimaryGetTotal *int `json:"pri.get.total,string"`
91-
GetExistsTime *string `json:"get.exists_time"`
92-
PrimaryGetExistsTime *string `json:"pri.get.exists_time"`
93-
GetExistsTotal *int `json:"get.exists_total,string"`
94-
PrimaryGetExistsTotal *int `json:"pri.get.exists_total,string"`
95-
GetMissingTime *string `json:"get.missing_time"`
96-
PrimaryGetMissingTime *string `json:"pri.get.missing_time"`
97-
GetMissingTotal *int `json:"get.missing_total,string"`
98-
PrimaryGetMissingTotal *int `json:"pri.get.missing_total,string"`
99-
IndexingDeleteCurrent *int `json:"indexing.delete_current,string"`
100-
PrimaryIndexingDeleteCurrent *int `json:"pri.indexing.delete_current,string"`
101-
IndexingDeleteTime *string `json:"indexing.delete_time"`
102-
PrimaryIndexingDeleteTime *string `json:"pri.indexing.delete_time"`
103-
IndexingDeleteTotal *int `json:"indexing.delete_total,string"`
104-
PrimaryIndexingDeleteTotal *int `json:"pri.indexing.delete_total,string"`
105-
IndexingIndexCurrent *int `json:"indexing.index_current,string"`
106-
PrimaryIndexingIndexCurrent *int `json:"pri.indexing.index_current,string"`
107-
IndexingIndexTime *string `json:"indexing.index_time"`
108-
PrimaryIndexingIndexTime *string `json:"pri.indexing.index_time"`
109-
IndexingIndexTotal *int `json:"indexing.index_total,string"`
110-
PrimaryIndexingIndexTotal *int `json:"pri.indexing.index_total,string"`
111-
IndexingIndexFailed *int `json:"indexing.index_failed,string"`
112-
PrimaryIndexingIndexFailed *int `json:"pri.indexing.index_failed,string"`
113-
MergesCurrent *int `json:"merges.current,string"`
114-
PrimaryMergesCurrent *int `json:"pri.merges.current,string"`
115-
MergesCurrentDocs *int `json:"merges.current_docs,string"`
116-
PrimaryMergesCurrentDocs *int `json:"pri.merges.current_docs,string"`
117-
MergesCurrentSize *string `json:"merges.current_size"`
118-
PrimaryMergesCurrentSize *string `json:"pri.merges.current_size"`
119-
MergesTotal *int `json:"merges.total,string"`
120-
PrimaryMergesTotal *int `json:"pri.merges.total,string"`
121-
MergesTotalDocs *int `json:"merges.total_docs,string"`
122-
PrimaryMergesTotalDocs *int `json:"pri.merges.total_docs,string"`
123-
MergesTotalSize *string `json:"merges.total_size"`
124-
PrimaryMergesTotalSize *string `json:"pri.merges.total_size"`
125-
MergesTotalTime *string `json:"merges.total_time"`
126-
PrimaryMergesTotalTime *string `json:"pri.merges.total_time"`
127-
RefreshTotal *int `json:"refresh.total,string"`
128-
PrimaryRefreshTotal *int `json:"pri.refresh.total,string"`
129-
RefreshTime *string `json:"refresh.time"`
130-
PrimaryRefreshTime *string `json:"pri.refresh.time"`
131-
RefreshExternalTotal *int `json:"refresh.external_total,string"`
132-
PrimaryRefreshExternalTotal *int `json:"pri.refresh.external_total,string"`
133-
RefreshExternalTime *string `json:"refresh.external_time"`
134-
PrimaryRefreshExternalTime *string `json:"pri.refresh.external_time"`
135-
RefreshListeners *int `json:"refresh.listeners,string"`
136-
PrimaryRefreshListeners *int `json:"pri.refresh.listeners,string"`
137-
SearchFetchCurrent *int `json:"search.fetch_current,string"`
138-
PrimarySearchFetchCurrent *int `json:"pri.search.fetch_current,string"`
139-
SearchFetchTime *string `json:"search.fetch_time"`
140-
PrimarySearchFetchTime *string `json:"pri.search.fetch_time"`
141-
SearchFetchTotal *int `json:"search.fetch_total,string"`
142-
PrimarySearchFetchTotal *int `json:"pri.search.fetch_total,string"`
143-
SearchOpenContexts *int `json:"search.open_contexts,string"`
144-
PrimarySearchOpenContexts *int `json:"pri.search.open_contexts,string"`
145-
SearchQueryCurrent *int `json:"search.query_current,string"`
146-
PrimarySearchQueryCurrent *int `json:"pri.search.query_current,string"`
147-
SearchQueryTime *string `json:"search.query_time"`
148-
PrimarySearchQueryTime *string `json:"pri.search.query_time"`
149-
SearchQueryTotal *int `json:"search.query_total,string"`
150-
PrimarySearchQueryTotal *int `json:"pri.search.query_total,string"`
151-
SearchQueryFailed *int `json:"search.query_failed,string"` // Available in OpenSearch 3.3.0+
152-
PrimarySearchQueryFailed *int `json:"pri.search.query_failed,string"` // Available in OpenSearch 3.3.0+
153-
SearchConcurrentQueryCurrent *int `json:"search.concurrent_query_current,string"`
154-
PrimarySearchConcurrentQueryCurrent *int `json:"pri.search.concurrent_query_current,string"`
155-
SearchConcurrentQueryTime *string `json:"search.concurrent_query_time"`
156-
PrimarySearchConcurrentQueryTime *string `json:"pri.search.concurrent_query_time"`
157-
SearchConcurrentQueryTotal *int `json:"search.concurrent_query_total,string"`
158-
PrimarySearchConcurrentQueryTotal *int `json:"pri.search.concurrent_query_total,string"`
159-
SearchConcurrentAvgSliceCount *string `json:"search.concurrent_avg_slice_count"`
160-
PrimarySearchConcurrentAvgSliceCount *string `json:"pri.search.concurrent_avg_slice_count"`
161-
SearchStartreeQueryCurrent *int `json:"search.startree_query_current,string"` // Available in OpenSearch 3.2.0+
162-
PrimarySearchStartreeQueryCurrent *int `json:"pri.search.startree.query_current,string"`
61+
StoreSize *string `json:"store.size"`
62+
PrimaryStoreSize *string `json:"pri.store.size"`
63+
CompletionSize *string `json:"completion.size"`
64+
PrimaryCompletionSize *string `json:"pri.completion.size"`
65+
FieldDataMemorySize *string `json:"fielddata.memory_size"`
66+
PrimaryFieldDataMemorySize *string `json:"pri.fielddata.memory_size"`
67+
FieldDataEvictions *int `json:"fielddata.evictions,string"`
68+
PrimaryFieldDataEvictions *int `json:"pri.fielddata.evictions,string"`
69+
QueryCacheMemorySize *string `json:"query_cache.memory_size"`
70+
PrimaryQueryCacheMemorySize *string `json:"pri.query_cache.memory_size"`
71+
QueryCacheEvictions *int `json:"query_cache.evictions,string"`
72+
PrimaryQueryCacheEvictions *int `json:"pri.query_cache.evictions,string"`
73+
RequestCacheMemorySize *string `json:"request_cache.memory_size"`
74+
PrimaryRequestCacheMemorySize *string `json:"pri.request_cache.memory_size"`
75+
RequestCacheEvictions *int `json:"request_cache.evictions,string"`
76+
PrimaryRequestCacheEvictions *int `json:"pri.request_cache.evictions,string"`
77+
RequestCacheHitCount *int `json:"request_cache.hit_count,string"`
78+
PrimaryRequestCacheHitCount *int `json:"pri.request_cache.hit_count,string"`
79+
RequestCacheMissCount *int `json:"request_cache.miss_count,string"`
80+
PrimaryRequestCacheMissCount *int `json:"pri.request_cache.miss_count,string"`
81+
FlushTotal *int `json:"flush.total,string"`
82+
PrimaryFlushTotal *int `json:"pri.flush.total,string"`
83+
FlushTime *string `json:"flush.total_time"`
84+
PrimaryFlushTime *string `json:"pri.flush.total_time"`
85+
GetCurrent *int `json:"get.current,string"`
86+
PrimaryGetCurrent *int `json:"pri.get.current,string"`
87+
GetTime *string `json:"get.time"`
88+
PrimaryGetTime *string `json:"pri.get.time"`
89+
GetTotal *int `json:"get.total,string"`
90+
PrimaryGetTotal *int `json:"pri.get.total,string"`
91+
GetExistsTime *string `json:"get.exists_time"`
92+
PrimaryGetExistsTime *string `json:"pri.get.exists_time"`
93+
GetExistsTotal *int `json:"get.exists_total,string"`
94+
PrimaryGetExistsTotal *int `json:"pri.get.exists_total,string"`
95+
GetMissingTime *string `json:"get.missing_time"`
96+
PrimaryGetMissingTime *string `json:"pri.get.missing_time"`
97+
GetMissingTotal *int `json:"get.missing_total,string"`
98+
PrimaryGetMissingTotal *int `json:"pri.get.missing_total,string"`
99+
IndexingDeleteCurrent *int `json:"indexing.delete_current,string"`
100+
PrimaryIndexingDeleteCurrent *int `json:"pri.indexing.delete_current,string"`
101+
IndexingDeleteTime *string `json:"indexing.delete_time"`
102+
PrimaryIndexingDeleteTime *string `json:"pri.indexing.delete_time"`
103+
IndexingDeleteTotal *int `json:"indexing.delete_total,string"`
104+
PrimaryIndexingDeleteTotal *int `json:"pri.indexing.delete_total,string"`
105+
IndexingIndexCurrent *int `json:"indexing.index_current,string"`
106+
PrimaryIndexingIndexCurrent *int `json:"pri.indexing.index_current,string"`
107+
IndexingIndexTime *string `json:"indexing.index_time"`
108+
PrimaryIndexingIndexTime *string `json:"pri.indexing.index_time"`
109+
IndexingIndexTotal *int `json:"indexing.index_total,string"`
110+
PrimaryIndexingIndexTotal *int `json:"pri.indexing.index_total,string"`
111+
IndexingIndexFailed *int `json:"indexing.index_failed,string"`
112+
PrimaryIndexingIndexFailed *int `json:"pri.indexing.index_failed,string"`
113+
MergesCurrent *int `json:"merges.current,string"`
114+
PrimaryMergesCurrent *int `json:"pri.merges.current,string"`
115+
MergesCurrentDocs *int `json:"merges.current_docs,string"`
116+
PrimaryMergesCurrentDocs *int `json:"pri.merges.current_docs,string"`
117+
MergesCurrentSize *string `json:"merges.current_size"`
118+
PrimaryMergesCurrentSize *string `json:"pri.merges.current_size"`
119+
MergesTotal *int `json:"merges.total,string"`
120+
PrimaryMergesTotal *int `json:"pri.merges.total,string"`
121+
MergesTotalDocs *int `json:"merges.total_docs,string"`
122+
PrimaryMergesTotalDocs *int `json:"pri.merges.total_docs,string"`
123+
MergesTotalSize *string `json:"merges.total_size"`
124+
PrimaryMergesTotalSize *string `json:"pri.merges.total_size"`
125+
MergesTotalTime *string `json:"merges.total_time"`
126+
PrimaryMergesTotalTime *string `json:"pri.merges.total_time"`
127+
// Merges warmer fields added in OpenSearch 3.4.0+
128+
MergesWarmerOngoingCount *int `json:"merges.warmer.ongoing_count,string"`
129+
PrimaryMergesWarmerOngoingCount *int `json:"pri.merges.warmer.ongoing_count,string"`
130+
MergesWarmerTotalInvocations *int `json:"merges.warmer.total_invocations,string"`
131+
PrimaryMergesWarmerTotalInvocations *int `json:"pri.merges.warmer.total_invocations,string"`
132+
MergesWarmerTotalTime *string `json:"merges.warmer.total_time"`
133+
PrimaryMergesWarmerTotalTime *string `json:"pri.merges.warmer.total_time"`
134+
MergesWarmerTotalFailureCount *int `json:"merges.warmer.total_failure_count,string"`
135+
PrimaryMergesWarmerTotalFailureCount *int `json:"pri.merges.warmer.total_failure_count,string"`
136+
MergesWarmerTotalBytesSent *string `json:"merges.warmer.total_bytes_sent"`
137+
PrimaryMergesWarmerTotalBytesSent *string `json:"pri.merges.warmer.total_bytes_sent"`
138+
MergesWarmerTotalBytesReceived *string `json:"merges.warmer.total_bytes_received"`
139+
PrimaryMergesWarmerTotalBytesReceived *string `json:"pri.merges.warmer.total_bytes_received"`
140+
MergesWarmerTotalSendTime *string `json:"merges.warmer.total_send_time"`
141+
PrimaryMergesWarmerTotalSendTime *string `json:"pri.merges.warmer.total_send_time"`
142+
MergesWarmerTotalReceiveTime *string `json:"merges.warmer.total_receive_time"`
143+
PrimaryMergesWarmerTotalReceiveTime *string `json:"pri.merges.warmer.total_receive_time"`
144+
RefreshTotal *int `json:"refresh.total,string"`
145+
PrimaryRefreshTotal *int `json:"pri.refresh.total,string"`
146+
RefreshTime *string `json:"refresh.time"`
147+
PrimaryRefreshTime *string `json:"pri.refresh.time"`
148+
RefreshExternalTotal *int `json:"refresh.external_total,string"`
149+
PrimaryRefreshExternalTotal *int `json:"pri.refresh.external_total,string"`
150+
RefreshExternalTime *string `json:"refresh.external_time"`
151+
PrimaryRefreshExternalTime *string `json:"pri.refresh.external_time"`
152+
RefreshListeners *int `json:"refresh.listeners,string"`
153+
PrimaryRefreshListeners *int `json:"pri.refresh.listeners,string"`
154+
SearchFetchCurrent *int `json:"search.fetch_current,string"`
155+
PrimarySearchFetchCurrent *int `json:"pri.search.fetch_current,string"`
156+
SearchFetchTime *string `json:"search.fetch_time"`
157+
PrimarySearchFetchTime *string `json:"pri.search.fetch_time"`
158+
SearchFetchTotal *int `json:"search.fetch_total,string"`
159+
PrimarySearchFetchTotal *int `json:"pri.search.fetch_total,string"`
160+
SearchOpenContexts *int `json:"search.open_contexts,string"`
161+
PrimarySearchOpenContexts *int `json:"pri.search.open_contexts,string"`
162+
SearchQueryCurrent *int `json:"search.query_current,string"`
163+
PrimarySearchQueryCurrent *int `json:"pri.search.query_current,string"`
164+
SearchQueryTime *string `json:"search.query_time"`
165+
PrimarySearchQueryTime *string `json:"pri.search.query_time"`
166+
SearchQueryTotal *int `json:"search.query_total,string"`
167+
PrimarySearchQueryTotal *int `json:"pri.search.query_total,string"`
168+
SearchQueryFailed *int `json:"search.query_failed,string"` // Available in OpenSearch 3.3.0+
169+
PrimarySearchQueryFailed *int `json:"pri.search.query_failed,string"` // Available in OpenSearch 3.3.0+
170+
SearchConcurrentQueryCurrent *int `json:"search.concurrent_query_current,string"`
171+
PrimarySearchConcurrentQueryCurrent *int `json:"pri.search.concurrent_query_current,string"`
172+
SearchConcurrentQueryTime *string `json:"search.concurrent_query_time"`
173+
PrimarySearchConcurrentQueryTime *string `json:"pri.search.concurrent_query_time"`
174+
SearchConcurrentQueryTotal *int `json:"search.concurrent_query_total,string"`
175+
PrimarySearchConcurrentQueryTotal *int `json:"pri.search.concurrent_query_total,string"`
176+
SearchConcurrentAvgSliceCount *string `json:"search.concurrent_avg_slice_count"`
177+
PrimarySearchConcurrentAvgSliceCount *string `json:"pri.search.concurrent_avg_slice_count"`
178+
SearchStartreeQueryCurrent *int `json:"search.startree_query_current,string"` // Available in OpenSearch 3.2.0+
179+
PrimarySearchStartreeQueryCurrent *int `json:"pri.search.startree.query_current,string"`
163180
// COMPATIBILITY: OpenSearch 3.2.0 used different field naming (pri.startree.* instead of pri.search.startree.*).
164181
// This field can be removed when 3.2.0 support is dropped, along with the consolidateV320StatsFields() fallback logic.
165182
PrimarySearchStartreeQueryCurrentV32 *int `json:"pri.startree.query_current,string"`

0 commit comments

Comments
 (0)