Skip to content

Commit 7779241

Browse files
committed
Fix cat indices API field naming compatibility across OpenSearch versions
OpenSearch 3.2.0+ changed startree query field names from: - pri.search.startree.query_current -> pri.startree.query_current - pri.search.startree.query_time -> pri.startree.query_time - pri.search.startree.query_total -> pri.startree.query_total This breaks backward compatibility as applications using the client API would need to change when the server changes field names. Solution: Implement field consolidation that maintains stable API fields by consolidating data from version-specific JSON fields into consistent API fields that applications can rely on. - Add version-specific fields (V31/V32) for JSON unmarshaling - Add consolidateFields() method to fan-in data to stable API fields - Call consolidation after JSON unmarshaling in catClient.Indices() This ensures applications can use PrimaryStartreeQueryCurrent, PrimaryStartreeQueryTime, and PrimaryStartreeQueryTotal consistently regardless of which OpenSearch server version is running. Signed-off-by: Sean Chittenden <sean.chittenden@crowdstrike.com>
1 parent 432e36a commit 7779241

4 files changed

Lines changed: 42 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
2020
- Fix nodes stats API compatibility with OpenSearch 3.2.0+ by adding max_last_index_request_timestamp and startree query fields
2121
- Fix indices stats API compatibility with OpenSearch 3.2.0+ by adding max_last_index_request_timestamp and startree query fields
2222
- Fix cat APIs compatibility with OpenSearch 3.2.0+ by adding indexing timestamp and startree query fields
23+
- Fix cat indices API field naming compatibility across OpenSearch versions by implementing field consolidation for startree query fields that changed naming format between 3.1.x and 3.2.0+
2324
- Fix floating point precision loss in nodes stats concurrent_avg_slice_count field by changing from float32 to float64
2425
- Fix security plugin health API compatibility with OpenSearch 3.2.0+ by adding settings field
2526
- Fix nodes stats API compatibility with OpenSearch 3.3.0+ by adding neural_search breaker, query_failed and startree_query_failed search fields, and search pipeline system_generated fields

opensearchapi/api_cat-indices.go

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,17 @@ type CatIndexResp struct {
159159
SearchConcurrentAvgSliceCount *string `json:"search.concurrent_avg_slice_count"`
160160
PrimarySearchConcurrentAvgSliceCount *string `json:"pri.search.concurrent_avg_slice_count"`
161161
SearchStartreeQueryCurrent *int `json:"search.startree_query_current,string"` // Available in OpenSearch 3.2.0+
162-
PrimaryStartreeQueryCurrent *int `json:"pri.search.startree.query_current,string"` // Available in OpenSearch 3.2.0+
162+
PrimaryStartreeQueryCurrent *int `json:"-"` // Consolidated field - populated from V31 or V32 fields
163+
PrimaryStartreeQueryCurrentV31 *int `json:"pri.search.startree.query_current,string"` // Available in OpenSearch 3.2.0+ (format used in 3.1.x)
164+
PrimaryStartreeQueryCurrentV32 *int `json:"pri.startree.query_current,string"` // Available in OpenSearch 3.2.0+ (new format in 3.2.0+)
163165
SearchStartreeQueryTime *string `json:"search.startree_query_time"` // Available in OpenSearch 3.2.0+
164-
PrimaryStartreeQueryTime *string `json:"pri.search.startree.query_time"` // Available in OpenSearch 3.2.0+
166+
PrimaryStartreeQueryTime *string `json:"-"` // Consolidated field - populated from V31 or V32 fields
167+
PrimaryStartreeQueryTimeV31 *string `json:"pri.search.startree.query_time"` // Available in OpenSearch 3.2.0+ (format used in 3.1.x)
168+
PrimaryStartreeQueryTimeV32 *string `json:"pri.startree.query_time"` // Available in OpenSearch 3.2.0+ (new format in 3.2.0+)
165169
SearchStartreeQueryTotal *string `json:"search.startree_query_total"` // Available in OpenSearch 3.2.0+
166-
PrimaryStartreeQueryTotal *string `json:"pri.search.startree.query_total"` // Available in OpenSearch 3.2.0+
170+
PrimaryStartreeQueryTotal *string `json:"-"` // Consolidated field - populated from V31 or V32 fields
171+
PrimaryStartreeQueryTotalV31 *string `json:"pri.search.startree.query_total"` // Available in OpenSearch 3.2.0+ (format used in 3.1.x)
172+
PrimaryStartreeQueryTotalV32 *string `json:"pri.startree.query_total"` // Available in OpenSearch 3.2.0+ (new format in 3.2.0+)
167173
SearchStartreeQueryFailed *int `json:"search.startree_query_failed,string"` // Available in OpenSearch 3.3.0+
168174
PrimaryStartreeQueryFailed *int `json:"pri.search.startree_query_failed,string"` // Available in OpenSearch 3.3.0+
169175
SearchScrollCurrent *int `json:"search.scroll_current,string"`
@@ -213,3 +219,31 @@ func (r CatIndicesResp) Inspect() Inspect {
213219
Response: r.response,
214220
}
215221
}
222+
223+
// consolidateFields consolidates version-specific fields for all indices in the response.
224+
// This method should be called after JSON unmarshaling to ensure backward compatibility
225+
// across different OpenSearch server versions that may use different field names.
226+
func (r *CatIndicesResp) consolidateFields() {
227+
for i := range r.Indices {
228+
// Consolidate PrimaryStartreeQueryCurrent from V31 or V32 fields
229+
if r.Indices[i].PrimaryStartreeQueryCurrentV31 != nil && *r.Indices[i].PrimaryStartreeQueryCurrentV31 != 0 {
230+
r.Indices[i].PrimaryStartreeQueryCurrent = r.Indices[i].PrimaryStartreeQueryCurrentV31
231+
} else if r.Indices[i].PrimaryStartreeQueryCurrentV32 != nil {
232+
r.Indices[i].PrimaryStartreeQueryCurrent = r.Indices[i].PrimaryStartreeQueryCurrentV32
233+
}
234+
235+
// Consolidate PrimaryStartreeQueryTime from V31 or V32 fields
236+
if r.Indices[i].PrimaryStartreeQueryTimeV31 != nil && *r.Indices[i].PrimaryStartreeQueryTimeV31 != "" {
237+
r.Indices[i].PrimaryStartreeQueryTime = r.Indices[i].PrimaryStartreeQueryTimeV31
238+
} else if r.Indices[i].PrimaryStartreeQueryTimeV32 != nil {
239+
r.Indices[i].PrimaryStartreeQueryTime = r.Indices[i].PrimaryStartreeQueryTimeV32
240+
}
241+
242+
// Consolidate PrimaryStartreeQueryTotal from V31 or V32 fields
243+
if r.Indices[i].PrimaryStartreeQueryTotalV31 != nil && *r.Indices[i].PrimaryStartreeQueryTotalV31 != "" {
244+
r.Indices[i].PrimaryStartreeQueryTotal = r.Indices[i].PrimaryStartreeQueryTotalV31
245+
} else if r.Indices[i].PrimaryStartreeQueryTotalV32 != nil {
246+
r.Indices[i].PrimaryStartreeQueryTotal = r.Indices[i].PrimaryStartreeQueryTotalV32
247+
}
248+
}
249+
}

opensearchapi/api_cat.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ func (c catClient) Indices(ctx context.Context, req *CatIndicesReq) (*CatIndices
130130
return &data, err
131131
}
132132

133+
// Consolidate version-specific fields to maintain backward compatibility
134+
data.consolidateFields()
135+
133136
return &data, nil
134137
}
135138

opensearchapi/api_cluster-pending_tasks.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,6 @@ type ClusterPendingTasksItem struct {
4848
TimeInQueueMillis int `json:"time_in_queue_millis"`
4949
TimeInQueue string `json:"time_in_queue"`
5050
TimeInExecutionMillis int `json:"time_in_execution_millis"` // Available in OpenSearch 3.1.0+
51-
TimeInExecution string `json:"time_in_execution"` // Available in OpenSearch 3.1.0+
51+
TimeInExecution string `json:"time_in_execution"` // Available in OpenSearch 3.1.0+
5252
Executing bool `json:"executing"`
5353
}

0 commit comments

Comments
 (0)