Inspired from Keep a Changelog
- Enrich
opensearchtransport.RequestEventwith request identity for observers:RouteName(the classified operation, e.g."search"/"doc_index", suitable as a low-cardinality metric label;"other"when unclassified),Index(target index extracted from the path; now populated where it was previously documented but always empty), andPoolName(the pool that served the final attempt).Pathbecomes the raw URL-escaped caller input (req.URL.EscapedPath()) captured before the URL is rewritten to the selected backend, with a corrected doc comment (it is raw and high-cardinality, not templated). Identity is captured once per request, pre-rewrite, and only when an observer is registered, so the no-observer path stays allocation-free.RouteNameis derived from a process-wideOperationClassifier; callers routing non-standard paths can override it via the newConfig.OperationClassifier(affects the label only, never routing). Route the previously-unrouted system/admin endpoints (cluster state,_cat/*,_nodes/*,_tasks/*,_snapshot/*, index/mapping/alias/template management, data streams) to their correct node role, adding a cluster-manager routing target (split read/write pools) so cluster-state operations prefercluster_managernodes with a data-node fallback; because the router and the operation classifier share the route table, these routes also give each operation a meaningfulRouteName. Name everyOperationID.String()label as a constant, and add explicit labels for the admin operations (cat/nodes/tasks/snapshot/script/dangling/data-stream) that previously fell through to the numericadmin_Nfallback. Rework theospromandosotelregistries around an event-sinkObserver(two-methodOnRequestResponse/OnStreamResponseplus connection-lifecycle hooks, receiving the full transport event so sinks can label by route/index/pool;RequestSampleis removed), dispatched by a pool of workers (GOMAXPROCS/2by default,WithWorkersto override). Ship RED+USE defaults out of the box:RequestObserver(rate, errors, duration -- with aWithStatusClassifieroption to control thestatuslabel; the default maps to the per-hundred bucket2xx/3xx/4xx/5xx,errorfor no response, orunknown) andPoolObserver(connection-pool utilization, saturation, and errors from lifecycle events). AddWithRequestFilter/WithStreamFilter(skip events before enqueue) andWithOverflowHandler/WithStreamOverflowHandler(invoked on buffer overflow with the queue length -- at most the buffer size -- and the dropped event, in addition to the existing dropped counter) (#999) cmd/osgen: emit enum-likeoneOf-of-{type: string, const: X}schemas as named Go string types with one exported const per value (e.g.type NodeRole stringwithNodeRoleData,NodeRoleSearch,NodeRoleWarm, ...), instead of collapsing them to a plainstring. The type is permissive: backed bystring,encoding/jsonround-trips any value, so an unknown value a newer server or plugin introduces decodes cleanly rather than erroring (unlike the closed int-backedRestStatusenum, whoseUnmarshalJSONrejects unknown values). No custom(Un)MarshalJSONis generated; the consts add discoverability, compile-time typo protection, and spec-driven drift detection. Detection is default-on for the const-oneOfshape (deny-list to opt out); branches are version-filtered, then reduced to values yielding a valid, unique Go const identifier and deduplicated by generated const name (collapsingNodeRole's duplicatesearchacross a version boundary andTranslogDurability'sASYNC/asynccasing collision, reporting a dropped distinct value to stderr). Query parameters whose schema is a const-oneOfare typed too. Also bundles thesearchandwarmnode roles into the vendored spec (#998)- Export the
opensearchapiand plugin sub-client types (documentClient->DocumentClient,catClient->CatClient, pluginroleClient->RoleClient, etc.), so each sub-client renders its own godoc page with a navigable method list instead of being an unexported type reachable only through aClientfield. The change is additive and non-breaking: field access (client.Doc.Get) is unchanged, theapiClient/clientback-pointer stays unexported so external populated construction remains impossible, and each generated type carries a doc comment noting it must be obtained viaNewClient(the zero value is not usable). Adds a receiver-to-sub-client map to theopensearchapipackage doc and generated package docs to the plugin packages that have sub-clients (#989) - Add
VerifyDeadAfter(opensearch.Config/opensearchtransport.Config, env overrideOPENSEARCH_GO_VERIFY_DEAD_AFTER): bounds how long a connection proven reachable may still be blindly resurrected as a last-resort "zombie" while dead. Each discovery cycle clears the viability mark on any non-seed connection that has been dead longer than the window, so a node that never recovers stops absorbing requests and must health-check clean again before it is routed to; seed connections are exempt. The env var accepts a boolean (trueselects the 15m default,falsedisables the expiry) or atime.ParseDurationstring; theConfigfield follows the0= default,<0= disabled,>0= explicit convention. Seeguides/transport-routing.md(Zombie Connection Resurrection and Connection Viability) andguides/config-envvars.md - Add response observer events to
opensearchtransport.ConnectionObserver:OnRequestResponse(RequestResponseEvent)fired once per request byTransport.Request(full-read duration, exact response-byte count) andOnStreamResponse(StreamResponseEvent)fired byTransport.Stream(time-to-first-byte, Content-Length header). Both events are flat value types passed by value, so the fire path is allocation-free and a nil observer costs nothing;BaseConnectionObservergains no-op defaults so existing observers are unaffected. Addsopensearchtransport.Transport.Request(and anopensearch.Client.Requestpassthrough) as the buffered counterpart toStream, through whichopensearch.Execute[T]now routes - Add the
osprommodule (a separate Go module, sogithub.com/prometheus/client_golangstays out of the core dependency graph): anosprom.Registryis the singleConnectionObserverwired into a transport, into which callers wire a Prometheus registerer and an arbitrary set ofObserverbundles. The Registry copies each event into a pooled envelope and fans it out to the wired observers on a background goroutine (New+Run(ctx)+Close), so recording metrics never blocks or allocates on the request hot path; a full buffer drops events and incrementsopensearch_client_observer_dropped_totalrather than adding latency. ShipsNewRequestObserver, a bundle recording request-duration and response-size histograms labeled by method, status class, and mode. Seeosprom/README.mdandguides/transport-observer_metrics.md - Add the
osotelmodule, the OpenTelemetry counterpart toospromwith the sameRegistry+Observermodel and async pooled pipeline (a separate Go module, so the OpenTelemetry libraries stay out of the core dependency graph). Callers wire an OpenTelemetrymetric.Meterand an arbitrary set ofObserverbundles intoosotel.New; the shippedNewRequestObserverrecordsopensearch.client.request.durationandopensearch.client.response.sizehistograms attributed by method, status class, and mode, and the Registry recordsopensearch.client.observer.dropped. Seeosotel/README.md opensearchtransportRouteEventnow reuses a pooled[]RouteCandidatebacking array across routing decisions, reference-counted so an observer that retains the event pastOnRoute(for example, for async processing) callsevent.Retain()thenevent.Release()when done; synchronous observers are unaffected and the dispatch path allocates zero candidates per routecmd/osapilint: add the v2 -> v3 hop, so a v2 module can be migrated through to v5. The v2 -> v3 boundary is the largest in the project's history and mostly not mechanizable: theopensearchapipackage was redesigned from a function-based API into a typed sub-client API, so of 182 exported v2 structs only 16 survive by name and 166 (the entireopensearchapi.*Requestfamily) are removed outright. The hop bumps import paths (the only mechanical change), rules the 51 removed root-opensearch.ClientAPI method fields MANUAL with actionable migration guidance, and relies on the linter's removed-type diagnostic to surface any reference to a removedopensearchapi.*Requesttype. It best-effort rewrites the two seed opsPingandIndices.Exists(the call, its raw-responseStatus()/Warningshandling, and theConfig/NewClientclient lifecycle) into compiling v3; where a transform is not mechanically certain it plants an_OSAPILINT_RESOLVEmarker so the build breaks at that spot instead of emitting a wrong value. The two consumer idioms and the raw-Response-to-typed-Resperror-model change are reported as semantic followups. The removed-type diagnostic runs on every hop rather than only v2 -> v3, so a reference to a type deleted across any transition (for example the manyopensearchapitypes dropped in v5) is reported as aMANUALworklist item instead of being silently dropped; it fires only when a consumer actually references the removed type. Seecmd/osapilint/README.md(#951)- Add
cmd/osapilint, a tool that migrates a Go module across opensearch-go major versions.osapilint rewrite -w ./...detects the source major from the module's imports and rewrites old-major API shapes (type renames, field dispositions, method regroups) into the target's; the pass is purely syntactic (go/parser + astutil + go/printer), so it runs before the code compiles against the target, and writes are sandboxed to the target module directory viaos.Root.osapilint vet -fix ./...then runs go/analysis analyzers that catch runtime type-assertion hazards -- the target's precise*int64/*stringtypes flowing intoanysinks such as testify'sEqual, which compile cleanly but panic at run time. Each adjacent version transition is a hand-authoredHopkeyed against two committed API surfaces (surface_vN.json); a migration resolves to the ordered list of hops between source and target, and new hops (v2 -> v3) are added as data without linter changes. Ships the v3 -> v4 and v4 -> v5 hops, chainable to migrate v3 -> v5 directly. Seecmd/osapilint/README.md(#933) - Add
Close()toopensearch.Clientandopensearchapi.Clientfor explicit teardown of background goroutines (node discovery, health/stats pollers, DNS refresh) and idle connections, without type-asserting the transport. Cache implicitly-constructed default clients (opensearch.NewDefaultClient,opensearchapi.NewDefaultClient, and the clientopensearchutil.NewBulkIndexerbuilds when none is supplied) in a process-wide, refcounted, idle-TTL cache keyed by config hash, so identical default clients share one transport instead of leaking one set of goroutines and its connection pool per construction. User-builtopensearch.NewClient/opensearchapi.NewClientclients never enter the cache.opensearchutil.NewBulkIndexernow closes the client it implicitly creates when the indexer is closed. Tune the idle eviction window withOPENSEARCH_GO_DEFAULT_CLIENT_TTL(default16m;0= never evict; a negative value disables caching so every call builds a fresh client) (#893) - Add client-side DNS caching, enabled by default on the built-in transport. Resolved addresses are cached and re-resolved on an interval (default 60s, mirroring the TTL AWS publishes for managed OpenSearch Service endpoints). When the resolver becomes briefly unreachable, the last-known-good address continues to be served until the resolver recovers, so transient resolver outages (e.g. a node-local DNS blip producing
dial tcp: lookup ...: i/o timeout) no longer fail requests for already-resolved hosts. Tune or disable via theDNSCacheRefresh,DNSDialTimeout,DNSKeepAlive, andDNSTimeoutfields onopensearch.Config(orOPENSEARCH_GO_DNS_CACHE_REFRESH,OPENSEARCH_GO_DNS_DIAL_TIMEOUT,OPENSEARCH_GO_DNS_KEEP_ALIVE,OPENSEARCH_GO_DNS_TIMEOUT); each follows the 0 = default, <0 = disable, >0 = explicit convention. Caching is installed only when no customTransportis supplied; a caller-providedTransportis never modified. A host that resolves to multiple addresses races up to three of them concurrently (random start offset per connection) and takes the first to connect, spreading load and tolerating a dead address. Refresh re-resolves cached hosts sequentially, soDNSTimeout(default 10s) bounds each lookup to keep one hung resolution from stalling a refresh tick. The refresh goroutine is bound to the client's root context, so it is reclaimed both whenCloseis called and whenNewreturns an error after the context is created. Because Go's resolver does not expose record TTLs, the refresh interval is a re-resolution cadence, not a per-record TTL. ExposesDNSLookups,DNSCacheMisses, andDNSLookupErrorscounters viaTransport.Metrics() cmd/osgen: guardjson.RawMessagein generated request/response types behind a checked-in allowlist (cmd/osgen/rawmessage_allowlist.txt). Because ajson.RawMessageis the symptom of a type the generator could not resolve, a generator bug can silently widen the raw-JSON surface of the public API; generation now fails (non-zero exit) when anyjson.RawMessageuse is not listed, including nested forms such as[]json.RawMessage,map[string]json.RawMessage, and[][]json.RawMessage(the leaf is detected at any wrapper depth). Entries are keyedGoTypeName/jsonFieldName(whole-response raw bodies use<Prefix>Resp/-, and map/array responses whose element type is unresolved use<Prefix>Resp/[entries]and<Prefix>Resp/[records]). Add-update-raw-message-allowlistto regenerate the allowlist from current output (sorted and grouped for minimal diffs), and-allow-unlisted-raw-messageto downgrade the check to a warning (#890)cmd/osgen: emit int-backed (constiota) enum types for string fields carrying anx-enum-namemarker alongside anenum:constraint. Each enum generates a named int type with a zero-value<Name>Unknownsentinel, name<->value lookup maps,String(),MarshalJSON, and a closed-setUnmarshalJSONthat rejects unknown wire values via a typed*Unknown<Name>Error(recoverable througherrors.As). The marker is shared, so a single enum type is registered once and reused across every referencing field; a marker reused with a conflicting value set fails generation rather than silently merging. Applied to the securitystatusfield, which becomes a typedRestStatusenum (#890)- Add
OPENSEARCH_GO_POLICY_DUMPenvironment variable: when set withOPENSEARCH_GO_DEBUG=true, dumps the router's policy tree (the dot-delimited node paths thatOPENSEARCH_GO_POLICY_*matchers target, each labeled with its pool or role) to the debug logger at client initialization. The dump walks the structural tree so router wrappers that share an inner policy instance are each rendered in full. (#883) - Add a
build-samplesMakefile target and a CI job that compiles and vets every_samples/*.goprogram, so example breakage is caught (the_samplesdirectory is excluded fromgo build ./...because Go ignores_-prefixed paths) - Group document operations under a
client.Docsub-client and point-in-time operations underclient.PIT(Create/Delete/GetAll/DeleteAll);client.Documentandclient.PointInTimeremain as field aliases. The indices sub-client's canonical field isclient.Index, withclient.Indicesandclient.Indexesas aliases.cmd/osgengains--emit-v4-compat(default true) to emit backward-compatibility forwarders so top-levelclient.Bulk/MGet/Update,client.Document.Source, andclient.PointInTime.Getkeep working (client.Indexis not forwarded -- it is the indices sub-client field; useclient.Doc.Index), and--emit-v4-deprecation(default false) to mark those forwarders deprecated - Add
cmd/osgencode generator for typed path builders and API consumer files from the OpenAPI spec - The built-in transport builds
opensearchtransport.NewDefaultRouterwhenConfig.Routeris nil, andopensearch.NewClientenables on-start discovery under the same condition, so a client routes across discovered nodes by default.OPENSEARCH_GO_ROUTERcontrols it:=false/=0suppresses both the default router and on-start discovery; unset or any other value builds the router and enables discovery. (#816) - Add
envvars.Falsy(name), which tells "explicitly opted out" apart from "unset" (Truthy treats both as false). The default-router rule in the transport andopensearch.NewClientuse it. - Add the code-generated
opensearchapi/package: API surface produced bycmd/osgenfrom the OpenAPI spec. Fully typed Req/Resp/Params structs, sub-clients matching OpenSearch namespaces (client.Cat,client.Cluster,client.Indices, etc.), and aplugins/subtree for ML/k-NN/security/ISM/etc. Replaces the hand-written v4 package (previewed in the v4 line atv5preview/opensearchapi/); seeopensearchapi/README.mdfor usage andUPGRADING.mdfor migration guidance (#650) - Add
primary_terms_mapandsplit_shards_metadatafields to ClusterState index metadata for OpenSearch >=3.6.0 compatibility - Add address resolver handler to rewrite discovered node addresses before they enter the connection pool (#822)
- Add
InsecureSkipVerifyconfig option to disable TLS certificate verification without constructing a customhttp.Transport, preservingDefaultTransportconnection pooling, HTTP/2, and timeout defaults (#786) - Add
(*opensearchtransport.Transport).Stream(*http.Request) (*http.Response, error)and a(*opensearch.Client).Streampassthrough for raw byte forwarding (incremental/streaming use cases). Stream returns the unbuffered response body fromRoundTrip; the caller owns reading and closingres.Body. Pairs withopensearch.Execute[T]for typed, decoded results (the SDK owns the body) (#786) - Add per-attempt
RequestTimeoutto bound individual HTTP round-trips, preventing indefinite hangs on stalled connections (#786) - Add
opensearchutil/shardhashpackage with exportedHashandForRoutingfunctions for computing OpenSearch shard routing - Enhanced cluster readiness checking for improved test reliability:
testutil.NewClient()now includes readiness validation (health + cluster state + nodes info) - Add
Statusfield (json.RawMessage) toTasksGetResp,TasksListTask, andTaskCancelInfofor polymorphic task status data; add typed status structs matching the OpenSearch API specification:BulkByScrollTaskStatus,ReplicationTaskStatus,ResyncTaskStatus,PersistentTaskStatus; addParse*helpers andBulkByScrollTaskStatusOrExceptionfor sliced task status (#788) - Test parallelization support via TEST_PARALLEL environment variable (default: CPU cores - 1, minimum 1)
- Add
cmd/osgen/emit.TestPerOpErrorTypeName_CatalogConsistencyto pin the catalog <-> switch coupling betweenemit.PerOpErrorTypeNameanderrwrap.OperationWrappers. Asserts three directions: every group naming a per-op aggregator type has 2+ wrappers in the catalog, every catalog entry with 2+ wrappers names a per-op aggregator type, and every group named by the switch is present in the catalog. Does not pin the runtimeemittableWrappers/resolveErrorWrapperspaths; today those sets coincide for the only 2+-wrapper groups (msearch/msearch_template) (#857) - opensearchapi/testutil package with test suite, client helpers, and JSON comparison utilities
- Add typed path builders in
internal/path/generated from the OpenAPI spec viacmd/osgenfor compile-time URL construction safety (#617, #650)sync.Pool-backed[]bytebuffers eliminate per-request allocation churn; buffers over 4 KiB are discarded to bound pool growth
- opensearchtransport/testutil package with PollUntil helper for eventual consistency testing (ISM policies, index readiness, cluster state changes)
- Configuration option
IncludeDedicatedClusterManagersfor controlling cluster manager node routing (#765) - Policy-based routing system for improved request routing and service availability (#771)
Policyinterface for composable routing strategies with lifecycle managementRouterinterface withRoute()method for request-based connection selectionNewPolicy()implementing chain-of-responsibility pattern for composable routing strategiesNewIfEnabledPolicy()for conditional routing with runtime evaluationNewMuxPolicy()for trie-based HTTP pattern matching with zero-allocation route lookupNewRolePolicy()for role-based node selectionNewRoundRobinRouter()with coordinating node preference and round-robin fallbackNewMuxRouter()providing role-based request routing with graceful fallback- Automatic routing of bulk, streaming bulk, and reindex operations to ingest nodes
- Automatic routing of search operations (search, msearch, count, by-query operations, scroll, PIT, validate, rank eval) to search/data nodes
- Automatic routing of document retrieval operations (get, mget, source, explain, termvectors, mtermvectors) to search/data nodes for read locality
- Automatic routing of template operations (search template, msearch template) and search shards to search/data nodes
- Automatic routing of field capabilities to search/data nodes
- Automatic routing of shard maintenance operations (refresh, flush, synced flush, forcemerge, cache clear, segments) to data nodes
- Automatic routing of single-document writes (index, create, update, delete) to data nodes
- Automatic routing of shard diagnostics (recovery, shard stores, stats) and rethrottle operations to data nodes
NewDefaultRouter()extending role-based routing with per-index node affinity (recommended for most users)
- Add consistent hash routing with per-index node affinity for cache locality and AZ-aware load distribution (#786)
- Rendezvous hashing selects a stable subset of nodes per index, preserving OS page cache and query cache locality
- RTT-bucketed scoring naturally prefers AZ-local nodes and overflows to remote AZs under load
- Per-pool congestion window (cwnd) routing using TCP-style AIMD congestion control for capacity-aware connection scoring
- Thread pool discovery via
/_nodes/_local/http,os,thread_poolprovides per-pool capacity ceiling (maxCwnd) - Thread pool stats polling via
/_nodes/_local/stats/jvm,breaker,thread_pooldrives AIMD window adjustments - Scoring formula:
RTTBucket * (InFlight + 1) / Cwnd * ShardCostMultiplier-- nearest node with most headroom wins - In-flight request tracking per node per pool with atomic add/release bracketing each RoundTrip
- AIMD slow start (double cwnd) transitions to congestion avoidance (additive increase) at ssthresh
- Multiplicative decrease on congestion signals:
total_wait_time_in_nanosfor RESIZABLE pools, queue saturation fallback for others - Pool overload detection:
delta(rejected) > 0or HTTP 429 marks pool overloaded, cleared only by stats poller - HTTP 429 handling: TryLock + set overloaded + halve cwnd + retry on different node
- Quorum gating: pre-quorum uses
4 * defaultServerCoreCount(= 32) as synthetic cwnd, post-discovery uses4 * allocatedProcessors, post-quorum uses real pool cwnd - Asymmetric scale-up/scale-down thresholds with hysteresis band for stable active pool sizing
- Dynamic per-index fan-out driven by shard placement (
/_cat/shards) and request rate RouterOptionfunctional options:WithMinFanOut,WithMaxFanOut,WithIndexFanOut,WithIdleEvictionTTL,WithDecayFactor,WithFanOutPerRequest
- Add environment variable escape hatches (
OPENSEARCH_GO_POLICY_*) to disable specific routing policies at startup (#786) - Add failure-triggered shard map invalidation for faster routing recovery (#786)
lcNeedsCatUpdatelifecycle bit excludes failed connections from routing candidate sets until/_cat/shardsrefresh- Connections remain available for general routing (round-robin, zombie tryouts) while excluded from scored routing
- Dedicated
discoverCatTimerschedules lightweight/_cat/shards-only refresh (no full node discovery) - Refresh urgency scales with cluster impact:
interval = discoverNodesInterval * (1 - flaggedFraction), clamped to 5s floor OnShardMapInvalidationobserver event for monitoring invalidation triggersNeedsCatUpdatefield inConnectionMetricfor observability
- Add routing observability: observer events, metrics snapshot, connection inspection (#786)
OnRouteobserver event with full scoring breakdown (RouteEvent,RouteCandidate)RouterSnapshotinClient.Metrics()exposes per-index cache state (fan-out, shard nodes, request rate, idle-since)Connection.RTTMedian(),Connection.RTTBucket(),Connection.EstLoad()for per-connection inspectionConnectionMetricenriched withrtt_bucket,rtt_median,est_loadfields
- Add murmur3 shard-exact routing for
?routing=and document ID requests (#786)- Client-side murmur3 x86 32-bit hash matching OpenSearch's
Murmur3HashFunction.hash(String)for shard-exact targeting - Document-level requests (
_doc,_source,_update,_explain,_termvectors) use doc ID as default routing value when no explicit?routing=present, matching OpenSearch'sOperationRouting.generateShardId()behavior - Client-side murmur3 shard-exact candidate selection routes requests to nodes hosting the target shard
- Per-shard-number placement data from
/_cat/shardsmaps shard numbers to primary and replica node names - Graceful fallback to rendezvous hashing when shard map data is unavailable
RoutingValue,EffectiveRoutingKey,TargetShard,ShardExactMatchfields inRouteEventfor observability
- Client-side murmur3 x86 32-bit hash matching OpenSearch's
- Add
OPENSEARCH_GO_ROUTING_CONFIGandOPENSEARCH_GO_DISCOVERY_CONFIGenvironment variables for runtime feature control (#786)OPENSEARCH_GO_ROUTING_CONFIG: toggle shard-exact routing (-shard_exact)OPENSEARCH_GO_DISCOVERY_CONFIG: skip individual discovery server calls (-cat_shards,-routing_num_shards,-cluster_health,-node_stats)- Bitfield flags use
+/-prefix convention for explicit opt-in/out; zero-initialized = all features enabled WithShardExactRouting(bool)RouterOptionfor programmatic control (env var overrides)- Evaluated once at client init time; immutable after
- Document environment variables in
guides/transport-routing.md - Document read-after-write visibility guarantees with operation-aware routing in
guides/transport-routing.md
- Add adaptive
max_concurrent_shard_requestsderived from cluster-wide AIMD congestion window (#800) - Add partial failure error types (
PartialBulkError,PartialSearchError,ShardFailureError,MultiSearchItemError) that surface HTTP 200 partial failures as typed Go errors, controlled by a per-categoryerrmask.ErrorMaskbitfield onConfig.Errors(#816)PartialBulkErrorreturned fromBulkwhenresp.Errorsis true, carriesFailedItemsandSucceededCountPartialSearchErrorreturned fromSearch,MSearch,MSearchTemplate,SearchTemplate,Scroll.Getwhen_shards.failed > 0ShardFailureErrorreturned fromIndex,Document.Create,Document.Delete,Updatewhen replica shards failMultiSearchItemErrorreturned fromMSearch/MSearchTemplatefor per-sub-response Error envelopesMSearchErrors/MSearchTemplateErrorsper-op containers (Go 1.20+ multi-error contract viaUnwrap() []error) when 2+ wrapper categories fire on the same responsePartialFailureErrormarker interface withIsPartial() boolfor type-switching across all partial-failure typesopensearchapi.Errors(err) []errorpackage-level helper that flattens single- and multi-wrapper errors into a uniform slice; recommended call-site pattern is afor/switchover the result (noterrors.Asagainst a specific type)- Helper functions:
IsPartialFailure,ToleratePartialFailures,RequireSuccessRatefor threshold-based error tolerance - Operation constants:
OperationIndex,OperationCreate,OperationUpdate,OperationDelete - Per-Resp helper methods (
BulkItemFailures,SearchShardFailures,WriteShardFailures,MultiSearchItemFailures,PartialFailures(mask)) exist on the response types as engine machinery for the dispatch; new code should prefer afor/switchoveropensearchapi.Errors(err)rather than the per-Resp helpers, for forward compatibility Config.Errors *errmask.ErrorMaskreplaces a single boolean: each bit suppresses one wrapper category. v4 defaults toerrmask.All(mask everything, preserves pre-bitfield behavior); v5+ defaults toerrmask.Empty(report everything)OPENSEARCH_GO_ERROR_MASKenvironment variable overridesConfig.Errorsat runtime via comma-separated+/-tokens (lowercase snake_case wrapper names; unknown tokens silently dropped, debug-logged)- Both
(resp, error)are non-nil on partial failure -- response is fully populated - The generated
opensearchapiuses spec-driven types for the same model (regenerated from the OpenAPIx-error-responsesextension on everycmd/osgenrun)
- Add
OperationClassifierfor zero-allocation HTTP method+path toOperationIDmapping (#816)- Bit-packed
OperationID(int64) encoding R/W flag, category, and minor operation - Masking helpers:
IsWrite,IsRead,Category,Minor String()returns Prometheus-friendly labels (e.g.,"search","bulk","doc_get")- Reuses existing
routeTriefor O(path-segments) lookup, safe for concurrent use - Enables transparent metrics/tracing middleware at the
http.RoundTripperlayer - Transport automatically sets
max_concurrent_shard_requestsquery parameter on search requests routed through a coordinator node - Value derived from a cluster-wide aggregate of all polled nodes' search pool wait-time and completion deltas, clamped to
[floor, cap](default: 5–256) - Cluster-wide signal correctly models data-node fan-out capacity: single hot nodes are diluted by healthy peers, and MCSR only drops when aggregate cluster pressure rises
- Per-node AIMD for connection scoring remains unchanged (hot-node avoidance is handled by connection selection, not fan-out throttling)
- Falls back to per-node cwnd before the first poll cycle completes
- Respects explicit caller overrides: pre-existing
max_concurrent_shard_requestsquery parameter is never clobbered - Not applied to shard-exact routed requests (coordinator fan-out is irrelevant)
WithAdaptiveConcurrency(bool)andWithAdaptiveConcurrencyLimits(floor, cap)RouterOptionfor programmatic controlOPENSEARCH_GO_SHARD_REQUESTSenvironment variable:true/falseto enable/disable, ormin:maxto set floor and cap (e.g.,10:512)OPENSEARCH_GO_ROUTING_CONFIG=-adaptive_mcsrto disable via routing config bitfieldMaxConcurrentShardRequestsfield inRouteEventfor observability
- Bit-packed
- Add seed URL fallback as last-resort connection source when all router pools are exhausted (#786)
- Builds a dedicated
multiServerPoolfrom fresh copies of the original seed URLs at client init - Fires after the entire retry loop when all router policies and connection pools return
ErrNoConnections - On success: triggers immediate cluster rediscovery to repopulate router pools
OPENSEARCH_GO_FALLBACK=falsedisables seed fallback (enabled by default)
- Builds a dedicated
- Add consolidated environment variable reference in
guides/transport-routing.mdandUSER_GUIDE.md(#786) - Add connection pool health probes with cluster-aware resurrection timing (#786)
- Auto-discover server core count from
/_nodes/http,os,thread_poolto derive all rate-limiting and congestion window parameters (default: 8 cores) - Weighted round-robin for heterogeneous clusters: nodes with more cores get proportionally more traffic via GCD-normalized duplicate pointers in the ready list
lcNeedsHardwarelifecycle bit tracks connections needing hardware info; per-node fallback via/_nodes/_local/http,os,thread_poolduring health checks- Capacity model dynamically recalculated on each discovery cycle from minimum
allocatedProcessorsacross all nodes - TLS-aware rate limiting prevents overwhelming recovering servers during outages
- Three-input timeout formula:
max(healthTimeout, rateLimitedTimeout, minimumFloor) + jitter - Shuffle ready connection list on add/resurrect to prevent round-robin hot-spotting
- Two-phase readiness health check:
GET /thenGET /_cluster/health?local=truewithinitializing_shardsgate to prevent routing to recovering nodes - Store cluster health metrics (
ClusterHealthLocal) on each connection for observability - Periodic cluster health refresh for ready connections keeps
ClusterHealthLocaldata current for load-shedding and routing decisions- Refresh interval scales with cluster size:
clamp(liveNodes * clientsPerServer / healthCheckRate, 5s, 5min) - Single-node clusters skip refresh entirely (no routing benefit)
- Refresh interval scales with cluster size:
- Node stats polling with load shedding via
NodeStatsIntervalconfiguration- Polls
GET /_nodes/_local/stats/jvm,breaker,thread_poolto detect overloaded nodes and update congestion windows - Per-pool AIMD congestion control adjusts cwnd based on thread pool wait time and queue saturation
- Overloaded nodes are demoted from the ready list to the standby partition
- Overload detection: JVM heap threshold (
OverloadedHeapThreshold, default 85%), circuit breaker size ratio (OverloadedBreakerRatio, default 0.90), breaker trip delta, and cluster status red
- Polls
- Auto-discover server core count from
- Add heterogeneous Docker cluster targets for integration-testing weighted routing and role-based request routing
cluster.heterogeneous.cpu.1andcluster.heterogeneous.cpu.2set per-node CPU limits via Docker Compose overridescluster.heterogeneous.rolesassigns distinct node roles (cluster_manager+ingest, data+ingest, data)cluster.homogeneousremoves all overrides to reset to default configurationcluster.statusnow shows per-node roles and allocated processors via_nodes/http,os
- Add request routing guide (
guides/transport-routing.md) consolidating routing architecture, connection scoring, pool lifecycle, cost model, and configuration reference (#786) - Add per-item
Errorfield toMGetResp,MTermvectorsResp, andMSearchRespfor detecting partial failures in multi-document operations (#797) - Add
DocumentErrortype for structured per-item error information in multi-document responses - Add
BulkByScrollFailuretype for structured failure information in_delete_by_query,_update_by_query, and_reindexresponses - Add
RoutingandFieldstoMGetResp.Docsto match the full OpenSearch_mgetresponse format - Add
ForcedRefreshfield toIndexResp,DocumentDeleteResp, andUpdateRespfor consistency withDocumentCreateResp - Add
StatusandPrimaryfields toResponseShardsFailurefor shard failure diagnostics - Add
guides/config-envvars.mdas the canonical reference for everyOPENSEARCH_GO_*environment variable — accepted values, defaults, parsing rules, and the exhaustiveOPENSEARCH_GO_ERROR_MASKtoken list. FixOPENSEARCH_GO_ROUTERdefault intransport-routing.mdfrom incorrectfalseto correcttrue. (#883)
- BREAKING:
cmd/osgennow types enum-likeoneOf-of-const fields and query parameters acrossopensearchapiand the plugin packages, so fields and params that werestringchange to named enum types (e.g.Roles []string->Roles []NodeRole,Result string->Result Result, thecattimeparamstring->TimeUnit, and similarlyOpType,SearchType,VersionType, ...). Values still assign and compare as strings through the named type, so most call sites are unaffected; only type-strict comparisons against untyped string literals need the const (e.g.require.Equal(t, opensearchapi.ResultUpdated, resp.Result)instead of"updated"). (#998) cmd/osapilint: map the v4 -> v5 partial-failure type renames fromopensearchapi/UPGRADING_V4_TO_V5.mdin the v4 -> v5 hop, so code walking the per-shard failure slice migrates instead of silently breaking.ResponseShards->ShardStatisticsandResponseShardsFailure->ShardSearchFailure(dropping the removedPrimary/Statusfields) are rewritten;DocumentError->ErrorRespBaseis reported as a manual semantic followup because the two types share no fields. (#963)- Add a first-class container-provider abstraction to the test harness
Makefile.CONTAINER_PROVIDERis auto-detected by CLI presence in the order Colima -> Rancher Desktop (rdctl) -> Docker, and overridable withCONTAINER_PROVIDER=colima|rancher|docker. Selecting a provider pins the docker context (colima/rancher-desktop; the Docker provider leaves the active context alone, and a pre-setDOCKER_CONTEXTin the environment is respected), resolves the CLI runtime$(CTR)(nowdockerby default for every provider, withCONTAINER_RUNTIME=nerdctlas an advanced override), ensures the backing VM/daemon is running via the newcluster.provider.ensuretarget (wired intocluster.start), and setsvm.max_map_countthrough the provider's VM (colima ssh/rdctl shell) or a privileged helper container. Previously$(CTR)preferrednerdctlwhenever it was onPATH, so a Rancher-installednerdctlcould hijack a Colima session.make cluster.runtimenow reports the detected provider, docker context, and runtime - BREAKING: Per-request transport metrics (
requests,failures, responses-by-status) are now always collected via lock-free atomics, independent ofEnableMetrics.EnableMetricsnow gates only the detailed-metrics snapshot (per-connection, per-policy, and router state returned byMetrics()). The responses-by-status counter moved from a mutex-guarded map to a lock-free atomic array.Metrics()no longer returns an error when metrics are disabled -- it always returns the per-request counters (callers that branched onif err != nilfor the disabled case should drop that check). SeeUPGRADING_V5.mdfor migration. (#891) - Make the detailed-metrics snapshot path lock-free at call time. The per-connection
deadSince/overloadedAttimestamps moved fromConnection.mu-guardedtime.Timefields to lock-free atomic Unix-nanosecond values, soMetrics()enumerates connections without taking each connection's mutex. Under concurrent request load this was the dominant lock-contention site (a mutex profile attributed ~3.85% of total contention delay to the snapshot reader taking a write lock merely to read two fields); the conversion drops that to ~0.1%. Writes still occur underConnection.muso the resurrection/standby read-modify-write decisions stay serialized. Benchmarks (BenchmarkMetrics,BenchmarkMetricsParallel,BenchmarkMetricsUnderLoad) confirm the always-on detailed path is acceptable. (#892) - BREAKING: Implicitly-created default clients are now cached and shared. Two
opensearch.NewDefaultClient(oropensearchapi.NewDefaultClient) calls with identical config resolve to one shared transport instead of two independent ones, so they share goroutine and connection-pool lifecycle and theirMetrics()counters are aggregated across all holders rather than per-client. A caller that built multiple default clients to read separate metrics will now see combined counts. To keep independent transports, build withopensearch.NewClient/opensearchapi.NewClient(never cached) or setOPENSEARCH_GO_DEFAULT_CLIENT_TTLto a negative value to disable caching. SeeUPGRADING_V5.mdfor migration. (#893) - Reorganize the documentation. Split
UPGRADING.mdinto a version-history index plus per-major-version guides (UPGRADING_V5.mdthroughUPGRADING_V2.md) and renameopensearchapi/MIGRATING.mdtoopensearchapi/UPGRADING_V4_TO_V5.md. Group theguides/and_samples/files by subsystem (transport-,indexing-,usage-,config-) and add aguides/README.mdindex. Makeguides/usage-error_handling.mdthe single source for partial-error handling andguides/transport-retry_backoff.mdthe single source for resurrection-timeout config, replacing the duplicated copies inopensearchapi/README.mdandguides/transport-routing.mdwith links. Add package documentation (doc.go) foropensearchapi,plugins,signer, andsigner/awsv2. - Trim the CI compatibility matrix to the currently-patched OpenSearch set (2.19.x and 3.x) per the 12-month support policy; older lines (1.3.x - 2.18.x) are no longer part of the tested matrix and the 4.x client remains their supported path. No client code change (#856)
- BREAKING: Module path is now
github.com/opensearch-project/opensearch-go/v5. Update import paths from/v4to/v5; the in-sourceopensearchapi.Xpackage qualifier is unchanged - BREAKING: The code-generated API package is now the canonical
opensearchapi/, replacing the hand-written v4 package (formerly previewed atv5preview/opensearchapi/). Req/Resp/Params types are fully typed and generated from the OpenAPI spec. Seeopensearchapi/UPGRADING_V4_TO_V5.mdfor the field-level delta (DocumentID->ID, optionalParamsbecoming*Params, shared parameters moving into embeddedTimeoutParams/DebugParams,BulkResp.Itemsbecoming[]BulkItem) (#650) - BREAKING: The default Router is now on by default.
opensearchapi.NewClient/NewDefaultClient,opensearch.NewClient, andopensearchtransport.Newinjectopensearchtransport.NewDefaultRouter(and enable on-start discovery) unlessOPENSEARCH_GO_ROUTER=false. In v4 the router was opt-in viaOPENSEARCH_GO_ROUTER=true(#816) - BREAKING: Partial-failure errors are now reported by default.
Config.Errors == nilresolves toerrmask.Empty(report every partial-failure category) instead of v4'serrmask.All(mask everything). SetErrors: errmask.New(errmask.All)orOPENSEARCH_GO_ERROR_MASKto restore v4-style masking (#816) - BREAKING:
cmd/osgennow treats the OpenSearch plugin acronymsISM,KNN,LTR,ML,PPL,SM,UBI, andWLMas initialisms, so generated identifiers are all-uppercase per Go convention (matching the existingAPI,HTTP,JSON, etc. handling). Renames every affected*_gen.gotype, path builder, and method, e.g.IsmPolicy->ISMPolicy,KnnStats->KNNStats,SmPolicy->SMPolicy. Update any direct references to the renamed identifiers; the lowercase plugin package names (ism,knn, ...) are unchanged (#863) cmd/osgenrecognizes more acronyms as initialisms, extending the set from #863. AddsBM25,CJK,CSV,DFI,DFR,FS,GC,HDR,HTML,IB,ICU,IDs,JVM,LMD,LMJ,MMap,NIO,PITs,SMTP,SNS,TFIDF,UAX,WKT, andXYto the generator's acronym table, so generated identifiers use idiomatic Go capitalization (e.g.IndicesIndexSettingsSimilarityBM25,CommonAnalysisCJKAnalyzer,CommonQueryDSLIDsQuery,GetAllPITsReq,NodesStatsLastGC,ClusterStatsClusterJVM). Plural acronyms keep a lowercases(IDs,PITs) per Go convention; the memory-map and NIO store types followMMap/NIO. JSON wire tags are unchanged (#961)cmd/osgenderives clearer names foroneOf/anyOfunion branches. Aggregation-result branches that the spec titles with terse codes split into readable Go names (Lterms->LTerms,Tdigest->TDigest, and the full long/string/unsigned/unmapped/significant family), so theAs*/New*From*methods on types likeSearchResultAggregationsValueread asAsLTerms/AsTDigestPercentiles. Inline-object branches carry their spectitlewhere one exists (a hyphenated title normalizes to PascalCase,score-ranker-processor->ScoreRankerProcessor); untitled members are named from their content instead of their spec-array position, so a branch is named for its first required field or, when it declares none, for its property names (IndicesOpenRespBodyObject0/Object1->...Task/...Acknowledged,WLMQueryGroupRespResourceLimitsObject0/Object1->...Memory/...CPU,SearchBodySourceObject1->...ExcludesIncludes). The name no longer shifts when the spec reorders a union's members. Two branches with identical fields that cannot be told apart keep a positionalObjectNname. Branch accessors and constructors no longer repeat the union prefix, soNewInsightsSourceSourceFromInsightsSourceSourceObject1becomesNewInsightsSourceSourceFromExcludesIncludes(#961)- BREAKING:
opensearchtransport.ConnectionObserverinterface gained anOnAddressRewrite(AddressRewriteEvent)method for the new address resolver feature (embedders ofBaseConnectionObserverare unaffected) (#822) - BREAKING: Rename
opensearchtransport.Clienttoopensearchtransport.Transportso the type name reflects its role (HTTP round-trip concerns: connection pool, retries, node selection, discovery) rather than colliding conceptually withopensearch.Clientandopensearchapi.Client. TheClientname is removed; update references toTransport(#853) - BREAKING:
opensearch.Requestinterface signature changed fromGetRequest() (*http.Request, error)toGetRequest(method string) (*http.Request, error). The HTTP method is now caller-provided rather than hardcoded per operation, enabling correct method selection for operations that support multiple HTTP methods (e.g. search supports both GET and POST). This only affects code that implements or callsGetRequestdirectly; standard usage through client methods (e.g.client.Search(ctx, req)) is unaffected (#650) - Bump CI and developer guide OpenSearch versions: compatibility matrix to 2.19.5, default integration test version to 3.6.0 (#810)
- Include
_nodes.failuresdetail in discovery error messages for diagnosing intermittent CI failures on older OpenSearch versions (#823) - Test against Opensearch 3.6.0 (#817)
- Consolidate test utilities into two canonical packages: opensearchtransport/testutil (env helpers, polling, version comparison) and opensearchapi/testutil (client-dependent helpers, test suite, JSON comparison)
- Rename
singleConnectionPooltosingleServerPoolandstatusConnectionPooltomultiServerPoolfor clarity (#786) - Refactor Client struct to use embedded mutex pattern for improved thread safety (#775)
- Refactor metrics struct to use atomic counters for lock-free request/failure tracking (#776)
- Test against Opensearch 2.19.4, 3.1, 3.3, and 3.4 (#782)
- Migrate all test files to context-aware API calls for proper timeout and cancellation support
- Add cluster readiness validation and improve cluster error diagnostics
- Update Docker cluster management to add version-aware role detection (cluster_manager vs master)
- Generate unique document IDs in tests for parallel test execution and eliminate known test flakes
- Reduce integration test timeout from 1h to 10m per package with parallel execution support
- Refactor transport code for improved maintainability (rename ErrInvalidRole -> InvalidRoleError, add response body cleanup, simplify initialization)
- BREAKING: Change
CatTemplatesReq.TemplatesandIndexTemplateGetReq.IndexTemplatesfrom[]stringtostringto match the OpenSearch API specification, which types these path parameters as scalar name patterns (not comma-separated lists). This breakage will show up at compile time as a type mismatch and is easy to fix. Callers passing a single pattern only need to remove the slice literal (e.g.[]string{"*"}becomes"*"). Callers that relied on the old behavior of joining multiple patterns can usestrings.Join(patterns, ",")to produce the comma-separated string themselves. - BREAKING: Enhanced node discovery to match OpenSearch server behavior (#765)
- Dedicated cluster manager nodes are now excluded from client request routing by default (best practice)
- Node selection logic now matches Java client
NodeSelector.SKIP_DEDICATED_CLUSTER_MASTERSbehavior
- BREAKING: Add context support to discovery and client lifecycle management
opensearchtransport.Discoverableinterface now requirescontext.Contextparameter:DiscoverNodes(ctx context.Context) erroropensearch.Client.DiscoverNodes()andopensearchtransport.Transport.DiscoverNodes()now requirecontext.Contextparameteropensearch.Configandopensearchtransport.Confignow accept optionalContextandCancelFuncfieldsopensearchutil.BulkIndexerConfignow accepts optionalContextandCancelFuncfields- Enables proper context propagation for timeouts, cancellation, and graceful shutdown
- Role compatibility validation prevents conflicting role assignments (master+cluster_manager, warm+search)
- OpenSearch 3.0+ searchable snapshots now use
warmrole instead of deprecatedsearchrole
- BREAKING: Remove the
signer/awspackage. Usesigner/awsv2, whose name mirrors AWS's own SDK-version nomenclature. For callers on released v4 this is a full AWS SDK v1 -> v2 signer migration: the constructor input changes fromsession.Optionstoaws.Config, the return type becomes thesigner.Signerinterface, and the removedOpenSearchService/OpenSearchServerlessconstants become the"es"/"aoss"literals. See UPGRADING_V5.md and USER_GUIDE.md. - BREAKING: Replace
[]json.RawMessagewith typed[]BulkByScrollFailureforFailuresfield inDocumentDeleteByQueryResp,UpdateByQueryResp, andReindexResp(#797). This is a compile-time change only -- callers that were not accessing.Failuresare unaffected, and callers that were manually unmarshalingjson.RawMessagecan now access typed fields directly. - Replace inline
_shardsstruct withResponseShardsinIndexResp,DocumentCreateResp,DocumentDeleteResp,UpdateResp,IndicesRefreshResp, andIndicesCountRespto expose shardFailuresandSkippedfields (#797). Code accessingresp.Shards.Total,resp.Shards.Successful, orresp.Shards.Failedcompiles unchanged. - Add
omitemptyto all deprecated_typeJSON tags so empty values are omitted during marshaling - Modernize tests to use Go 1.25's
WaitGroup.Go()(#834) - Make
opensearch.Response.String()non-consuming for responses returned byClient.Do:Dobuffers the response payload intorawBody(for both success and error responses in the default buffered mode), andString()renders from those bytes without touchingBody. The receiver is a value receiver, so bothResponseand*Responsesatisfyfmt.Stringer. For an unbufferedBody(streamed responses or a hand-builtResponse),String()readsBodyonce and caches the bytes so repeat calls are consistent, but a value receiver cannot restore the caller'sBodyfield, so that single-use stream is consumed (#859)
- Mark
opensearchtransport.Transport.Performand theopensearch.Client.Performpassthrough as deprecated; both remain fully functional in v4 (still buffering the response body viaio.ReadAll+NopCloser) and will be removed in a future major version. New code should callopensearch.Do[T]for typed, decoded results oropensearchtransport.Transport.Stream/opensearch.Client.Streamfor raw byte forwarding. - Mark
Client.Do()with aDeprecateddoc annotation in favor ofopensearch.Do[T]()for compile-time pointer safety;Client.Do()remains fully functional and will not be removed, butstaticcheckSA1019 will nudge cross-package callers toward the safer generic alternative - Mark
opensearch.ToPointeras deprecated; it remains fully functional but will be removed in a future major version. Once the module's go directive moves to 1.26, callers can drop the helper entirely in favor of nativenew(value)literal syntax (e.g.new(false))
- Remove deprecated
(*opensearch.Client).Performand(*opensearchtransport.Transport).Perform;Stream(*http.Request) (*http.Response, error)is now the sole method onopensearchtransport.Interface. Custom transport implementations must implementStreaminstead ofPerform. Theopensearch.Streameropt-in interface andopensearch.ErrTransportMissingMethodStreamsentinel are removed. (#872) - BREAKING: Remove the
EnableMetricsconfig flag fromopensearch.Configandopensearchtransport.Config. The detailed-metrics snapshot (per-connection enumeration, per-policy breakdowns, and router cache state) is now always available;Metrics()returns the full snapshot unconditionally. The flag's only remaining purpose after #891 was to gate the detailed path, which now does its work lazily and lock-free at call time and so costs nothing untilMetrics()is called. Delete anyEnableMetricsfield from your config (it is a compile error otherwise); seeUPGRADING_V5.md. (#892) - Remove backport.yml and dependabot_pr.yml as we are not using backport app anymore
- Stop emitting
opensearchapi.Clientsub-client fields that have no operations routed to them.cmd/osgennow emits a sub-client only when at least one operation targets it, dropping the previously-emptyScript,ComponentTemplate,IndexTemplate,Template, andDataStreamfields. Index-template and data-stream operations are reached throughclient.Indices.*(e.g.client.Indices.PutIndexTemplate,client.Indices.CreateDataStream); stored-script operations remain top-level onClient
- Fix
cmd/osgensilently dropping typed structs on Go type-name collisions, and add a completeness guard so future collisions fail generation instead of degrading output. Two distinct spec schemas that derived the same Go name were reduced to one by the type registry, dropping the other to rawjson.RawMessage(or mis-typing a field): the searchprofilecontainer collided with the per-searchSearchProfileitem, and multiple response bodies in theflow_framework.commonandsecurity_analytics.findingsgroups all derived<Group>Resp. Colliding refs are now disambiguated via documented override tables (typeNameCollisions/respTypeNameCollisions), and a panic-guard requires any new colliding ref to be enumerated. Regenerating restores typed responses for the affected operations (e.g. flow_frameworksearch/search_state, security_analyticssearch_finding_correlations, and the search response'sprofilefield), and a response schema also referenced structurally (a search hit's_source) is now emitted as a standalone type instead of dangling (#989) - Fix plugin dispatch methods discarding the transport response, leaving
Inspect().Responsenil on every typed plugin response. The generated plugin dispatch template dropped the*opensearch.Responsereturned byrequest()(if _, err := request(...)); it now assigns it (resp.response, err = request(...)), matching the core client. Also serialize the discovery-path warmup recalculation and ready-list partitioning increateOrUpdateMultiNodePoolWithLockunder the pool write lock --recalculateWarmupParamsWithLock/getWarmupParamsWithLock(renamed to reflect the requirement) and themu.activeCountwrite touchedmu-guarded fields without holdingpool.mu, racingresurrectWithLock(follow-up to #981) (#989) - Fix node discovery hijacking the request stream with unverified, unreachable discovered nodes and masking the user-supplied seed-URL fallback. When discovered
publish_addressvalues are unroutable from the client (NAT'd or misconfigured clusters, e.g. a Kubernetes stack cluster in CI), a freshly discovered but never-health-checked node could be served to requests as a zombie -- failing every request withno route to host-- instead of returningErrNoConnectionsand cascading to the reachable seed URL. Connections are now considered available for routing only when they are a user-supplied seed (assumed reachable) or a discovered node confirmed reachable, and every routing policy and pool (round-robin, role, coordinator, index/doc router, single-server, and multi-server pools) consistently honors that gate on both the enabled-bit and connection-selection paths, so the seed fallback serves requests until a discovered node health-checks clean (#952, #954, #956) - Fix a data race on the multi-server pool's
warmupRounds,warmupSkipCount, andactiveListCapfields when two concurrentDiscoverNodescalls driveRolePolicy.DiscoveryUpdateon a shared transport.RolePolicycalledrecalculateWarmupParams(which writes those fields) without holding the pool write lock, while theroundrobinandcluster_coordinatorpolicies took the lock for the identical call.RolePolicy.DiscoveryUpdatenow computes the projected pool size and recalculates the warmup parameters underpool.Lock(), matching the other callers - Fix a data race (reported by the race detector in
TestClientCustomTransport) betweenmultiServerPool.snapshot()and node discovery:snapshot()readactiveListCapafter releasing the pool read lock, whilerecalculateWarmupParamswrites it under the write lock duringDiscoveryUpdate.activeListCap,warmupRounds, andwarmupSkipCountwere guarded by the pool lock only by convention (declared at the top level of the struct), which let the unlocked read look correct; they are now nested inside the pool's lock-guardedmustruct so every access is spelledcp.mu.<field>and the guard is structural, andsnapshot()readsactiveListCapwhile holding the read lock. For the same reasonhealthCheckis moved undermu(it is rewritten byupdateConnectionPoolon pool reuse); this also surfaced one discovery-path read ofhealthCheckthat had escaped the lock, now taken under the read lock - Cache credentials in the
signer/awsv2constructors. A rawCredentialsProvideris wrapped in anaws.CredentialsCache(an already-cached provider, such as one fromconfig.LoadDefaultConfig, is left as-is), so SigV4 signing no longer callsCredentials.Retrieveon every request. For STS-backed providers (assume-role, web identity, IRSA) the previous behavior was a per-request STS call that could exhaust the account's STS rate limits under load.signer/awsv2shipped without this in v4.6.0. - Fix
cmd/osgensilently dropping a response struct when a response schema has aoneOf/anyOffield whose parent-scoped union name collides with the parent struct's own Go name. The union registered first and the parent struct was then dropped by the type registry (its name already taken), degrading the response to rawjson.RawMessage. Such a union is now re-keyed by its referenced schema so the parent struct survives. The generator also reports any remaining Go type name collisions to stderr at generation time instead of dropping types silently. Regenerating fixes two type families:tasks.list,tasks.cancel, anddelete_by_query_rethrottlechange from rawBody json.RawMessageto typed structs (NodeFailures,TaskFailures,Nodes map[string]TasksTaskExecutingNode,Tasks *TasksTaskInfos), and the_common.mapping___DynamicTemplate.mappingfield becomes typed*CommonMappingProperty(accounting for the largeunions_gen.go/indices-put_mapping_gen.gochurn). (#890) - Fix
cmd/osgendegrading two more schema shapes to rawjson.RawMessage: an OpenAPI 3.1 nullable scalar (type: ["null", "<primitive>"]) fell through because kin-openapi'sType.Ismatches only single-element type sets, and a response whose component schema is a bare$refalias (Foo: {$ref: Bar}) missed the registry lookup under its alias key. Nullable scalars now resolve to the pointer primitive (*string/*int/*bool/*float64), clearing the CAT*Recordcluster, and alias responses follow the$refchain to the registered struct, fixing ISMadd/delete/get/remove_policy+retry_indexand the sevenml.search_*responses. (#890) - Fix
cmd/osgengenerating a phantom request body for the_sql/statsand_ppl/statsPOST operations. The server (RestSqlStatsAction/RestPPLStatsAction) ignores the request body, so the spec's body schema is a defect; removing it drops the deadSQLStatstype. The typed client no longer sends a body to these endpoints. (#890) - Fix
BulkIndexerOnFailurenil pointer dereference when readingBulkRespItem.Erroron status-only failures (e.g. HTTP 404 without anerrorobject) or transport-level flush errors by ensuring callbacks always receive a non-nilError(#679) - Generate query parameters whose value
0is meaningful as*intinstead ofintso a deliberate0reaches the wire. These params previously used the!= 0emission guard shared by all integer params, which silently dropped a deliberate0-- breaking optimistic-concurrency writes withif_seq_no=0(the sequence number of the first document written to a shard) and searchsize=0(aggregations with no hits).cmd/osgennow promotes such params to*intwith a nil guard, mirroring the existing*booltreatment. The promotion is scoped per operation (currentlyif_seq_no/if_primary_termondelete/index/updateand the plugin policy writesism.put_policy/ism.put_policies/rollups.put/sm.update_policy/transforms.put, plussizeonsearch), since the same wire name is a page-size with no meaningful0on other operations. The core_createoperation does not acceptif_seq_no/if_primary_term, so it is intentionally excluded - Fix
BulkIndexerStats.NumAddedovercounting items rejected byAdd()when the caller's context is cancelled before the item could be enqueued: incrementNumAddedonly after the queue accepts the item, and add a newBulkAddFailCountcounter for items dropped on the<-ctx.Done()branch. MigratebulkIndexerStatsfields tosync/atomic.Uint64typed values so future direct access is a compile-time error rather than a-race-only finding (#783) - Fix
opensearchtransport.Transport.setReqGlobalHeadercomparing the per-request header value against the global header name, so a request-level header never suppressed the matching global default and both were sent (#859) - Fix gzip buffer-pool nil poisoning on compress error:
gzipCompressor.compressreturned(nil, err)while the caller's deferredcollectBufferstill ran, putting a typed-nil*bytes.Bufferinto thesync.Poolthat panics on the nextGet().Reset()(#859) - Fix
opensearchtransport.Transport.Performsilently droppingio.ReadAllerrors during response buffering via:=shadowing; the read error now propagates wrapped in the newopensearchtransport.ErrResponseBodyReadsentinel, andopensearch.Client.Doclassifies the(resp != nil, err != nil)case viaerrors.Isso only genuine body-read failures are labeledErrReadBody(an unrelated transport error returned alongside a response, such as context cancellation during retry backoff, is no longer misreported as a read failure). As a consequence,opensearch.Client.Donow returns a non-nil*Responsealongside a non-nil error in this case where it previously returned(nil, err); callers detecting a hard transport failure should checkresp == nilrather thanerr != nil(#859) - Fix error-response body not being closed in
opensearch.ParseError.ParseErrornow closes the original body before re-wrapping the read bytes in aNopCloser. The generatedopensearchapido()no-decode error path no longer needs its own drain:opensearch.Doroutes through the bufferedopensearchtransport.Transport.Perform, so the returnedresp.Bodyis already an in-memoryNopCloserover the full payload and stays readable for the caller (#859) - Fix response-body lifecycle on the raw
RoundTrippaths that lackPerform's buffering safety net, where closing a partially-read body defeated HTTP keep-alive: the stats poller (cluster_health.go), discovery's/_cat/shards,/_cluster/state/metadata, and/_nodespaths, and thefetchClusterHealth/baselineHealthCheck/hardwareInfoHealthCheckpollers now drain to EOF (io.Copy(io.Discard, ...)) before close (covering both non-200 returns andjson.Decodesuccess paths that stop before EOF). The AWS v1 and v2 signers now close the request body on the read-error path inhexEncodedSha256OfRequest(#859) - Fix
Client.Doto buffer every response body intorawBody-- decoded success, error, and no-decode (nildataPointer) success alike (previously some paths, including the nil-dataPointersuccess path, were left unbuffered). Without this, a value-receiverResponse.String()(e.g.log.Printf("%s", resp)) drained the single-useBodyand left a subsequentParseErrorreading an empty payload (surfacingErrJSONUnmarshalBodyinstead of the real API error). NowString()renders fromrawBodywithout touchingBodyandParseErrorreads an intact body (#859) - Add typed response-format defaults for generated
opensearchapi/cat, list, ppl, and sql operations: when the caller leavesFormatunset, the SDK now emits the value the typed Resp struct expects (jsonfor cat/list/explain,jdbcfor ppl/sql query) instead of letting the server fall back to a default the JSON decoder cannot handle. - Replace
WaitForAllNodesReadyinlinerequire.Eventuallyloop with a layered readiness FSM (internal/test/readiness) that observes per-node progression throughLayerTCP -> LayerHTTP -> LayerClusterJoin -> LayerStatsReady, records transitions including regressions, and emits a structured per-node diagnostic with the full last cat-nodes response on timeout. Per-layer budgets are tuned for CI pessimism (cold JVM startup is the long pole); total budget forTargetClusterReadyis 6.5 minutes. (#650) - Fix bulk indexer HTML-escaping
_idandroutingvalues containing<,>, or&characters, causing OpenSearch to store escaped values (e.g.,\u003croot_account\u003estored instead of<root_account>), leading to duplicate documents, unreachable data on read-by-ID paths, and potential shard routing mismatches. Present since thejson.Marshalmigration in 2021 (commit3da59092). Replacejson.Marshalwithjson.NewEncoder+SetEscapeHTML(false)inopensearchutil.worker.writeMetaandopensearchutil.JSONReader; replace per-workeraux []bytewithsync.Pool-backed*bytes.Buffer; add table-driven test coverage forwriteMetaedge cases and refactor remainingTestBulkIndexersubtests to table-drivenrequire-based style (#824) - Fix pool replacement orphaning resurrection goroutines during node discovery, causing connections to become permanently dead with no active health checker (#786)
- Fix multi-to-single pool demotion leaking resurrection goroutines by giving each
multiServerPoolits own derived context and cancelling it on demotion (#830) - Extract
newMultiServerPoolFromClientWithLockas single source of truth for Client-to-pool settings propagation (#786) - Skip shard routing integration tests on OpenSearch < 2.2.0 with security plugin due to server-side
OptionalDataExceptionfrom non-thread-safe User serialization (opensearch-project/security#1970) - Fix URL path construction across 74
GetRequestmethods where empty path segments produced a double-slash//thathttp.NewRequestmisparsed as an RFC 3986 authority separator; replace manualstrings.Builderpaths with typed path builder structs that reject empty required segments (#617, #650) - Eliminate per-request
url.Parseoverhead by constructing*http.Requestdirectly with a coalesced struct; reduce per-request allocations from 8/2930B to 2/472B for typical operations (#650) - Fix alias, mapping, settings, and block API URL path construction when Indices is empty, which caused
http.NewRequestto misparse the double-slash as an authority separator (#650) - Fix discovery pool wipe when all cluster nodes time out during
/_nodes/httpfan-out: parse_nodesmetadata envelope and returnerrDiscoveryEmptywhensuccessful == 0, preserving the existing connection pool for retry (#821) - Skip shard routing integration tests on OpenSearch < 2.2.0 with security plugin due to server-side
OptionalDataExceptionfrom non-thread-safe User serialization (opensearch-project/security#1970) - Fix flaky
TestDefaultHealthCheck_RetryAfterMaxRetry: replace wall-clocktime.Sleep+atomic.Int64synchronization with context cancellation (ctx.Done()), and widenmaxRetryClusterHealthto 5s so the baseline HTTP round-trip cannot race past the retry interval (#787) - Skip opensearchtransport integration tests on OpenSearch < 2.2.0 with security plugin due to server-side
OptionalDataExceptionfrom non-thread-safe User serialization (opensearch-project/security#1970) - Skip shard routing integration tests on OpenSearch < 2.2.0 with security plugin due to server-side
OptionalDataExceptionfrom non-thread-safe User serialization (opensearch-project/security#1970) - Fix connection lifecycle bug in multiServerPool.OnFailure where connections were scheduled for resurrection before being moved from ready to dead list, causing potential race conditions
- Fix flaky connection integration test by replacing arbitrary sleep times with proper server readiness polling
- Fix cluster readiness checks in integration tests to handle HTTPS cold start delays (increase timeout to 15s)
- Fix GitHub Actions workflow authentication for OpenSearch 2.12.0+ password changes (admin -> myStrongPassword123!)
- Fix Docker cluster management to properly handle version-specific configurations and clean stale images/volumes
- Fix OpenSearch 2.8.0+ Tasks API compatibility by adding cancellation_time_millis field to TasksListTask struct
- Fix OpenSearch 3.1.0+ API compatibility by adding phase_results_processors field to nodes API and time_in_execution fields to cluster pending tasks API
- Fix OpenSearch 3.2.0+ API compatibility by adding max_last_index_request_timestamp and startree query fields across nodes stats, indices stats, and cat APIs, plus settings field to security plugin health API
- Fix OpenSearch 3.3.0+ API compatibility by adding neural_search breaker, query_failed and startree_query_failed search fields, search pipeline system_generated fields across multiple APIs, plus ingestion_status field to cluster state API and jwks_uri field to security config API
- Fix OpenSearch 3.4.0+ API compatibility by adding warmer fields to merges section, parallelism field to thread pool, and status_counter field across multiple APIs
- Fix cat indices API field naming compatibility across OpenSearch versions by using forward-compatible field names (PrimarySearchStartreeQuery) that match the corrected 3.3.0+ naming, with fallback support for the temporary 3.2.0 field names
- Fix cat APIs data type compatibility by changing byte fields from int to string to properly handle values like "0b"
- Fix floating point precision loss in nodes stats concurrent_avg_slice_count field by changing from float32 to float64
- Fix ISM RefreshSearchAnalyzers missing leading slash in URL path, causing HTTP/2 request failures (#686)
- Default the benchmark pprof server to an ephemeral loopback port so back-to-back
go test -benchruns no longer collide on aTIME_WAITsocket held by the prior run. The startup logic moves into aninternal/pprofutilpackage that registers the pprof handlers on a private mux (offhttp.DefaultServeMux);PPROF_ADDRpins an explicithost:portwhen needed. (#864)
- Bump golangci-lint from v2.11.2 to v2.11.4
- Bump
golang.org/x/syncfrom v0.19.0 to v0.20.0 (#831) - Bump
golang.org/x/modfrom v0.33.0 to v0.35.0 (#831) - Bump
github.com/wI2L/jsondifffrom v0.7.0 to v0.7.1 (#831) - Bump
github.com/aws/aws-sdk-go-v2from v1.41.1 to v1.41.7 (#831) - Bump
github.com/aws/aws-sdk-go-v2/configfrom v1.32.7 to v1.32.17 (#831) - Bump
github.com/aws/aws-sdk-go-v2/credentialsfrom v1.19.7 to v1.19.16 (#831) - Bump
github.com/aws/smithy-gofrom v1.24.0 to v1.25.1 (#831) - Bump
github.com/aws/aws-sdk-go-v2/configfrom 1.32.6 to 1.32.7 (#767)
- Bump
github.com/aws/aws-sdk-go-v2/configfrom 1.29.14 to 1.32.5 (#707, #711, #719, #730, #737, #761) - Bump
github.com/aws/aws-sdk-go-v2from 1.36.4 to 1.41.0 (#710, #720, #759) - Bump
github.com/stretchr/testifyfrom 1.10.0 to 1.11.1 (#728) - Bump
github.com/aws/aws-sdk-gofrom 1.55.7 to 1.55.8 (#716) - Bump go version from 1.24.0 to 1.25.9 in order to resolve certain CVEs. Details in the Pull Request (#825)
- Adds new fields for Opensearch 3.0 (#702)
- Allow users to override signing port (#721)
- Add
phase_tookfeatures supported from OpenSearch 2.12 (#722) - Adds the action to refresh the search analyzers to the ISM plugin (#686)
- Test against Opensearch 3.0 (#702)
- Add more SuggestOptions to SearchResp (#713)
- Updates Go version to 1.24 (#674)
- Replace
golang.org/x/exp/slicesusage with built-inslices(#674) - Update golangci-linter to 1.64.8 (#740)
- Change MaxScore to pointer (#740)
- Update workflow action (#760)
- Migrate to golangci-lint v2 (#760)
- Missing "caused by" information in StructError (#752)
- Add missing
ignore_unavailable,allow_no_indices, andexpand_wildcardsparams to MSearch (#757) - Fix
UpdateRespto correctly parse thegetfield when_sourceis requested in update operations. (#739)
- Bump
github.com/aws/aws-sdk-go-v2/configfrom 1.29.6 to 1.29.14 (#692) - Bump
github.com/aws/aws-sdk-gofrom 1.55.6 to 1.55.7 (#696) - Bump
github.com/wI2L/jsondifffrom 0.6.1 to 0.7.0 (#700)
- Adds DataStream field to IndicesGetResp struct (#701)
- Adds
InnerHitsfield toSearchResp(#672) - Adds
FilterPathparam (#673) - Adds
Aggregationsfield toMSearchResp(#690)
- Bump golang version to 1.22 (#691)
- Change ChangeCatRecoveryItemResp Byte fields from int to string (#691)
- Changed log formatted examples code (#694)
- Improve the error reporting of invalid body response (#699)
- Adds
Highlightfield toSearchHit(#654) - Adds
MatchedQueriesfield toSearchHit(#663) - Adds support for Opensearch 2.19 (#668)
- Bump
github.com/aws/aws-sdk-gofrom 1.55.5 to 1.55.6 (#657) - Bump
github.com/wI2L/jsondifffrom 0.6.0 to 0.6.1 (#643) - Bump
github.com/aws/aws-sdk-go-v2from 1.32.2 to 1.36.1 (#664) - Bump
github.com/stretchr/testifyfrom 1.9.0 to 1.10.0 (#644) - Bump
github.com/aws/aws-sdk-go-v2/configfrom 1.27.43 to 1.29.6 (#665)
- Fix ISM Transition to omitempty Conditions field (#609)
- Fix ISM Allocation field types (#609)
- Fix ISM Error Notification types (#612)
- Fix signer receiving drained body on retries (#620)
- Fix Bulk Index Items not executing failure callbacks on bulk request failure (#626)
- Bump
github.com/aws/aws-sdk-go-v2/configfrom 1.27.31 to 1.27.43 (#611, #630, #632) - Bump
github.com/aws/aws-sdk-go-v2from 1.32.1 to 1.32.2 (#631)
- Bump
github.com/aws/aws-sdk-go-v2/configfrom 1.27.23 to 1.27.31 (#584, #588, #593, #605) - Bump
github.com/aws/aws-sdk-gofrom 1.54.12 to 1.55.5 (#583, #590, #595, #596)
- Split SnapshotGetResp into sub structs (#603)
- Remove workflow tests against gotip (#604)
- Adds the
Routingfield in SearchHit interface. (#516) - Adds the
SearchPipelinesfield toSearchParams(#532) - Adds support for OpenSearch 2.14 (#552)
- Adds the
Cachesfield to Node stats (#572) - Adds the
SeqNoandPrimaryTermfields inSearchHit(#574) - Adds guide on configuring the client with retry and backoff (#540)
- Adds OpenSearch 2.15 to compatibility workflow test (#575)
- Security roles get response struct has its own sub structs without omitempty (#572)
- Fixes empty request body on retry with compression enabled (#543)
- Fixes
ConditionsinPolicyStateTransitionof ISM plugin (#556) - Fixes integration test response validation when response is null (#572)
- Adjust security Role struct for FLS from string to []string (#572)
- Fixes wrong response parsing for indices mapping and recovery (#572)
- Fixes wrong response parsing for security get requests (#572)
- Fixes opensearchtransport ignores request context cancellation when
retryBackoffis configured (#540) - Fixes opensearchtransport sleeps unexpectedly after the last retry (#540)
- Improves ParseError response when server response is an unknown json (#592)
- Bump
github.com/aws/aws-sdk-gofrom 1.51.21 to 1.54.12 (#534, #537, #538, #545, #554, #557, #563, #564, #570, #579) - Bump
github.com/wI2L/jsondifffrom 0.5.1 to 0.6.0 (#535, #566) - Bump
github.com/aws/aws-sdk-go-v2/configfrom 1.27.11 to 1.27.23 (#546, #553, #558, #562, #567, #571, #577) - Bump
github.com/aws/aws-sdk-go-v2from 1.27.0 to 1.30.1 (#559, #578)
- Adds GlobalIOUsage struct for nodes stats (#506)
- Adds the
Explanationfield containing the document explain details to theSearchHitstruct. (#504) - Adds new error types (#512)
- Adds handling of non json errors to ParseError (#512)
- Adds the
Failuresfield to opensearchapi structs (#510) - Adds the
Fieldsfield containing the document fields to theSearchHitstruct. (#508) - Adds security plugin (#507)
- Adds security settings to container for security testing (#507)
- Adds cluster.get-certs to copy admin certs out of the container (#507)
- Adds the
Fieldsfield containing stored fields to theDocumentGetRespstruct (#526) - Adds ism plugin (#524)
- Uses docker compose v2 instead of v1 (#506)
- Updates go version to 1.21 (#509)
- Moves Error structs from opensearchapi to opensearch package (#512)
- Moves parseError function from opensearchapi to opensearch package as ParseError (#512)
- Changes ParseError function to do type assertion to determine error type (#512)
- Removes unused structs and functions from opensearch (#517)
- Adjusts and extent opensearch tests for better coverage (#517)
- Bumps codecov action version to v4 (#517)
- Changes bulk error/reason field and some cat response fields to pointer as they can be nil (#510)
- Adjust workflows to work with security plugin (#507)
- Updates USER_GUIDE.md and add samples (#518)
- Updates opensearchtransport.Client to use pooled gzip writer and buffer (#521)
- Use go:build tags for testing (#52?)
- Fixes search request missing a slash when no indices are given (#470)
- Fixes opensearchtransport check for nil response body (#517)
- Bumps
github.com/aws/aws-sdk-go-v2from 1.25.3 to 1.26.1 - Bumps
github.com/wI2L/jsondifffrom 0.4.0 to 0.5.1 - Bumps
github.com/aws/aws-sdk-gofrom 1.50.36 to 1.51.21 - Bumps
github.com/aws/aws-sdk-go-v2/configfrom 1.27.7 to 1.27.11
- Adds new struct fields introduced in OpenSearch 2.12 (#482)
- Adds initial admin password environment variable and CI changes to support 2.12.0 release (#449)
- Adds
merge_idfield for indices segment request (#488)
- Updates workflow action versions (#488)
- Changes integration tests to work with secure and unsecure OpenSearch (#488)
- Moves functions from
opensearch/internal/testtoopensearchutil/testutilfor shared test utilities (#488) - Changes
custom_foldernamefield to pointer as it can benull(#488) - Changs cat indices Primary and Replica field to pointer as it can be
null(#488) - Replaces
ioutilwithioin examples and integration tests #495
- Fix incorrect SigV4
x-amz-content-sha256with AWS SDK v1 requests without a body (#496)
- Bumps
github.com/aws/aws-sdk-gofrom 1.48.13 to 1.50.36 - Bumps
github.com/aws/aws-sdk-go-v2/configfrom 1.25.11 to 1.27.7 - Bumps
github.com/stretchr/testifyfrom 1.8.4 to 1.9.0
- Adds
Err()function to Response for detailed errors (#246) - Adds golangci-lint as code analysis tool (#313)
- Adds govulncheck to check for go vulnerablities (#405)
- Adds opensearchapi with new client and function structure (#421)
- Adds integration tests for all opensearchapi functions (#421)
- Adds guide on making raw JSON REST requests (#399)
- Adds IPV6 support in the DiscoverNodes method (#458)
- Removes the need for double error checking (#246)
- Updates and adjusted golangci-lint, solve linting complains for signer (#352)
- Solves linting complains for opensearchtransport (#353)
- Updates Developer guide to include docker build instructions (#385)
- Tests against version 2.9.0, 2.10.0, run tests in all branches, changes integration tests to wait for OpenSearch to start (#392)
- Makefile: uses docker golangci-lint, run integration test on
.folder, change coverage generation (#392) - golangci-lint: updates rules and fail when issues are found (#421)
- go: updates to golang version 1.20 (#421)
- guids: updates to work for the new opensearchapi (#421)
- Adjusts tests to new opensearchapi functions and structs (#421)
- Changes codecov to comment code coverage to each PR (#410)
- Changes module version from v2 to v3 (#444)
- Handle unexpected non-json errors with the response body (#523)
- Deprecates legacy API
/_template(#390)
- Corrects AWSv4 signature on DataStream
Statswith no index name specified (#338) - Fixes GetSourceRequest
Sourcefield and deprecated theSourceparameter (#402) - Corrects developer guide summary with golang version 1.20 (#434)
- Bumps
github.com/aws/aws-sdk-gofrom 1.44.263 to 1.48.13 - Bumps
github.com/aws/aws-sdk-go-v2from 1.18.0 to 1.23.5 - Bumps
github.com/aws/aws-sdk-go-v2/configfrom 1.18.25 to 1.25.11 - Bumps
github.com/stretchr/testifyfrom 1.8.2 to 1.8.4 - Bumps
golang.org/x/netfrom 0.7.0 to 0.17.0 - Bumps
github.com/golangci/golangci-lint-actionfrom 1.53.3 to 1.54.2
- Adds implementation of Data Streams API (#257)
- Adds Point In Time API (#253)
- Adds InfoResp type (#253)
- Adds markdown linter (#261)
- Adds testcases to check upsert functionality (#269)
- Adds @Jakob3xD to co-maintainers (#270)
- Adds dynamic type to _source field (#285)
- Adds testcases for Document API (#285)
- Adds
index_lifecycleguide (#287) - Adds
bulkguide (#292) - Adds
searchguide (#291) - Adds
document_lifecycleguide (#290) - Adds
index_templateguide (#289) - Adds
advanced_index_actionsguide (#288) - Adds testcases to check UpdateByQuery functionality (#304)
- Adds additional timeout after cluster start (#303)
- Adds docker healthcheck to auto restart the container (#315)
- Uses
[]stringinstead ofstringinSnapshotDeleteRequest(#237) - Updates workflows to reduce CI time, consolidate OpenSearch versions, update compatibility matrix (#242)
- Moves @svencowart to emeritus maintainers (#270)
- Reads, closes and replaces the http Response Body (#300)
- Corrects curl logging to emit the correct URL destination (#101)
- Bumps
github.com/aws/aws-sdk-gofrom 1.44.180 to 1.44.263 - Bumps
github.com/aws/aws-sdk-go-v2from 1.17.4 to 1.18.0 - Bumps
github.com/aws/aws-sdk-go-v2/configfrom 1.18.8 to 1.18.25 - Bumps
github.com/stretchr/testifyfrom 1.8.1 to 1.8.2
- Adds Github workflow for changelog verification (#172)
- Adds Go Documentation link for the client (#182)
- Adds support for Amazon OpenSearch Serverless (#216)
- Removes info call before performing every request (#219)
- Renames the sequence number struct tag to if_seq_no to fix optimistic concurrency control (#166)
- Fixes
RetryOnConflicton bulk indexer (#215)
- Bumps
github.com/aws/aws-sdk-go-v2from 1.17.1 to 1.17.3 - Bumps
github.com/aws/aws-sdk-go-v2/configfrom 1.17.10 to 1.18.8 - Bumps
github.com/aws/aws-sdk-gofrom 1.44.176 to 1.44.180 - Bumps
github.com/aws/aws-sdk-gofrom 1.44.132 to 1.44.180 - Bumps
github.com/stretchr/testifyfrom 1.8.0 to 1.8.1 - Bumps
github.com/aws/aws-sdk-gofrom 1.44.45 to 1.44.132