This is an automated email from the ASF dual-hosted git repository. hanahmily pushed a commit to branch test/replication in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
commit 183f119de619ec5515f1eb1b596c3170d8dc1df8 Merge: bc3cc7e0d ae3de0997 Author: Hongtao Gao <[email protected]> AuthorDate: Wed Apr 8 06:54:05 2026 +0000 Merge remote-tracking branch 'origin/main' into test/replication # Conflicts: # pkg/meter/prom/prom.go .github/workflows/e2e.yml | 24 +- AGENTS.md | 17 - CHANGES.md | 23 + api/proto/banyandb/fodc/v1/rpc.proto | 45 ++ banyand/backup/lifecycle/steps.go | 3 +- .../internal/sidx/collect_tags_for_filter_test.go | 122 ++++ banyand/internal/sidx/sidx.go | 60 +- banyand/internal/storage/disk_monitor_test.go | 2 + banyand/internal/storage/index.go | 11 +- banyand/internal/storage/rotation_test.go | 21 + banyand/internal/storage/storage.go | 4 +- banyand/internal/storage/tsdb.go | 37 +- banyand/internal/storage/tsdb_test.go | 50 ++ banyand/internal/wqueue/wqueue.go | 16 +- banyand/liaison/grpc/server.go | 6 + banyand/measure/metadata.go | 29 +- banyand/measure/metrics.go | 7 +- banyand/measure/query.go | 6 +- banyand/measure/snapshot.go | 13 +- banyand/measure/snapshot_test.go | 40 ++ banyand/metadata/client.go | 96 +-- banyand/metadata/schema/property/client.go | 189 ++++-- banyand/metadata/schema/property/client_test.go | 118 +++- banyand/observability/bypass.go | 2 + banyand/observability/services/factory.go | 9 + banyand/observability/type.go | 1 + banyand/queue/local.go | 4 + banyand/queue/pub/pub.go | 2 +- banyand/queue/queue.go | 2 + banyand/queue/sub/group_lifecycle.go | 69 ++ banyand/queue/sub/group_lifecycle_test.go | 210 +++++++ banyand/queue/sub/server.go | 22 +- banyand/stream/metadata.go | 4 +- banyand/stream/metrics.go | 4 +- banyand/stream/snapshot.go | 24 +- banyand/stream/snapshot_test.go | 41 ++ banyand/stream/tag_filter_test.go | 44 ++ banyand/stream/tag_metadata.go | 8 + banyand/trace/metadata.go | 4 +- banyand/trace/metrics.go | 4 +- banyand/trace/snapshot.go | 26 +- banyand/trace/snapshot_test.go | 46 ++ bydbctl/internal/cmd/rest.go | 11 +- bydbctl/internal/cmd/rest_test.go | 124 ++++ dist/LICENSE | 210 +++---- .../license-github.com-montanaflynn-stats.txt | 2 +- .../mcp-licenses/license--types-node-fetch.txt | 21 - dist/licenses/mcp-licenses/license--types-node.txt | 21 - .../mcp-licenses/license-agentkeepalive.txt | 23 - dist/licenses/mcp-licenses/license-asynckit.txt | 21 - .../mcp-licenses/license-combined-stream.txt | 19 - .../mcp-licenses/license-delayed-stream.txt | 19 - .../mcp-licenses/license-es-set-tostringtag.txt | 21 - .../mcp-licenses/license-event-target-shim.txt | 22 - .../mcp-licenses/license-form-data-encoder.txt | 21 - .../license-form-data-node-modules-mime-db.txt | 23 - .../license-form-data-node-modules-mime-types.txt | 23 - dist/licenses/mcp-licenses/license-form-data.txt | 19 - .../mcp-licenses/license-formdata-node.txt | 21 - .../mcp-licenses/license-has-tostringtag.txt | 21 - dist/licenses/mcp-licenses/license-humanize-ms.txt | 17 - .../mcp-licenses/license-node-domexception.txt | 21 - dist/licenses/mcp-licenses/license-node-fetch.txt | 22 - .../license-openai-node-modules--types-node.txt | 21 - .../license-openai-node-modules-undici-types.txt | 0 dist/licenses/mcp-licenses/license-openai.txt | 201 ------ dist/licenses/mcp-licenses/license-tr46.txt | 0 .../licenses/mcp-licenses/license-undici-types.txt | 21 - .../mcp-licenses/license-web-streams-polyfill.txt | 22 - .../mcp-licenses/license-webidl-conversions.txt | 12 - dist/licenses/mcp-licenses/license-whatwg-url.txt | 21 - .../license-vue-component-type-helpers.txt} | 2 +- docs/api-reference.md | 127 ++++ docs/clients.md | 7 +- docs/concept/clustering.md | 10 +- docs/concept/data-model.md | 230 ++++--- docs/concept/rotation.md | 39 +- docs/concept/tsdb.md | 28 +- docs/installation/kubernetes.md | 35 +- docs/interacting/bydbctl/analyze.md | 6 +- docs/interacting/bydbctl/bydbctl.md | 8 +- docs/interacting/bydbctl/query/filter-operation.md | 10 +- docs/interacting/bydbctl/query/stream.md | 31 +- docs/interacting/bydbctl/query/trace.md | 208 +++++++ docs/interacting/bydbctl/schema/group.md | 3 +- .../bydbctl/schema/index-rule-binding.md | 14 +- docs/interacting/bydbctl/schema/index-rule.md | 7 +- docs/interacting/bydbctl/schema/measure.md | 4 +- docs/interacting/bydbctl/schema/stream.md | 13 +- .../bydbctl/schema/top-n-aggregation.md | 12 +- docs/interacting/bydbctl/schema/trace.md | 145 +++++ docs/interacting/bydbql.md | 304 ++++----- docs/interacting/data-lifecycle.md | 13 +- docs/menu.yml | 4 + docs/operation/cluster.md | 12 +- docs/operation/configuration.md | 21 +- docs/operation/fodc/apis.md | 55 ++ docs/operation/lifecycle.md | 79 +-- docs/operation/mcp/build.md | 86 ++- docs/operation/mcp/inspector.md | 67 +- docs/operation/mcp/setup.md | 151 ++++- docs/operation/observability.md | 24 +- docs/operation/troubleshooting/crash.md | 2 +- docs/operation/troubleshooting/no-data.md | 2 +- docs/operation/troubleshooting/overhead.md | 2 +- docs/operation/troubleshooting/query.md | 20 +- fodc/agent/internal/cmd/root.go | 18 +- .../integration/basic_metrics_buffering_test.go | 16 +- fodc/agent/internal/lifecycle/collector.go | 188 ++++++ fodc/agent/internal/lifecycle/collector_test.go | 182 ++++++ fodc/agent/internal/proxy/client.go | 184 +++++- fodc/agent/internal/proxy/client_test.go | 136 ++-- fodc/agent/testhelper/flightrecorder.go | 38 +- fodc/proxy/cmd/proxy/main.go | 7 +- fodc/proxy/internal/api/server.go | 23 + fodc/proxy/internal/api/server_test.go | 96 ++- fodc/proxy/internal/grpc/server_test.go | 8 +- fodc/proxy/internal/grpc/service.go | 125 ++++ fodc/proxy/internal/grpc/service_test.go | 295 ++++++++- .../integration/agent_reconnection_test.go | 6 +- .../agent_registration_metrics_flow_test.go | 5 +- .../cluster_topology_integration_test.go | 6 +- .../internal/integration/failure_scenarios_test.go | 7 +- .../integration/full_proxy_workflow_test.go | 7 +- .../high_availability_scalability_test.go | 6 +- ...ation_test.go => lifecycle_integration_test.go} | 150 ++--- .../integration/metrics_time_window_test.go | 6 +- .../integration/multiple_agents_roles_test.go | 7 +- .../integration/prometheus_integration_test.go | 5 +- fodc/proxy/internal/lifecycle/manager.go | 264 ++++++++ fodc/proxy/internal/lifecycle/manager_test.go | 379 +++++++++++ go.mod | 122 ++-- go.sum | 252 ++++---- mcp/Dockerfile | 1 - mcp/LICENSE | 39 +- mcp/example-config.json | 8 +- mcp/package-lock.json | 693 ++++++--------------- mcp/package.json | 2 +- mcp/src/client/{banyandb-client.ts => index.ts} | 106 ++-- mcp/src/config.ts | 43 ++ mcp/src/index.ts | 367 +---------- mcp/src/query/context.ts | 76 +++ mcp/src/query/llm-prompt.ts | 14 +- mcp/src/query/pattern-matcher.ts | 622 ------------------ mcp/src/query/query-generator.ts | 299 --------- mcp/src/query/validation.ts | 175 ++++++ mcp/src/server/http.ts | 196 ++++++ mcp/src/server/mcp.ts | 341 ++++++++++ mcp/src/utils/http.ts | 12 +- pkg/cmdsetup/liaison.go | 1 + pkg/grpchelper/connmanager.go | 74 ++- pkg/grpchelper/connmanager_test.go | 208 +++++++ pkg/grpchelper/helpers_test.go | 21 + pkg/index/inverted/inverted_series.go | 94 +-- pkg/index/inverted/inverted_series_test.go | 59 ++ pkg/meter/meter.go | 1 + pkg/meter/native/provider.go | 3 + pkg/meter/prom/prom.go | 34 +- pkg/query/logical/trace/index_filter.go | 21 +- pkg/query/logical/trace/index_filter_test.go | 67 ++ pkg/query/logical/trace/trace_plan_tag_filter.go | 5 + pkg/test/setup/setup.go | 37 ++ scripts/build/version.mk | 2 +- skills/README.md | 50 ++ skills/compiling/SKILL.md | 41 ++ skills/gh-pull-request/SKILL.md | 108 ++++ skills/vendor-update/SKILL.md | 71 +++ test/cases/measure/measure.go | 11 +- test/cases/property/property.go | 11 +- test/cases/stream/stream.go | 19 +- test/cases/topn/topn.go | 14 +- ...ce_instance_and_endpoint_order_timestamp_asc.ql | 26 +- ...e_instance_and_endpoint_order_timestamp_asc.yml | 45 +- ..._duration_range_and_ids_order_timestamp_desc.ql | 32 +- ...duration_range_and_ids_order_timestamp_desc.yml | 81 +++ ...e_instance_and_endpoint_order_timestamp_asc.yml | 58 ++ ...duration_range_and_ids_order_timestamp_desc.yml | 41 +- test/cases/trace/trace.go | 22 +- test/e2e-v2/cases/cluster/e2e-etcd.yaml | 14 + test/e2e-v2/cases/cluster/e2e-property.yaml | 14 + test/e2e-v2/cases/event/banyandb/e2e-etcd.yaml | 14 + test/e2e-v2/cases/event/banyandb/e2e-property.yaml | 14 + .../lifecycle/data-generator/docker-compose.yml | 4 +- test/e2e-v2/cases/lifecycle/data-generator/gen.sh | 6 +- test/e2e-v2/cases/lifecycle/docker-compose.yml | 97 +-- test/e2e-v2/cases/lifecycle/e2e.yaml | 60 +- .../metrics-has-value.yml => lifecycle/nodes.yaml} | 28 +- .../banyandb}/docker-compose.yml | 39 +- .../e2e-v2/cases/{zipkin => log}/banyandb/e2e.yaml | 36 +- .../expected/logs.yml} | 46 +- .../expected/metrics-has-value.yml | 2 +- .../expected/service-endpoint.yml} | 23 +- .../e2e-v2/cases/log/expected/service-instance.yml | 46 +- .../expected/service.yml} | 28 +- .../banyandb/e2e-property.yaml => log/lal.yaml} | 42 +- .../log-base-compose.yml} | 37 +- test/e2e-v2/cases/log/log-mal.yaml | 36 ++ .../cases/profiling/trace/banyandb/e2e-etcd.yaml | 14 + .../profiling/trace/banyandb/e2e-property.yaml | 14 + .../rover/process/istio/banyandb/e2e-banyandb.yaml | 23 + test/e2e-v2/cases/storage/banyandb/e2e-etcd.yaml | 14 + .../cases/storage/banyandb/e2e-property.yaml | 14 + .../expected/metrics-has-value-percentile.yml | 4 +- .../cases/storage/expected/metrics-has-value.yml | 2 +- test/e2e-v2/cases/zipkin/banyandb/e2e.yaml | 16 +- test/e2e-v2/script/env | 2 +- test/integration/distributed/deletion/common.go | 432 +++++++++++++ .../distributed/deletion/deletion_suite_test.go | 313 ---------- .../deletion}/etcd/suite_test.go | 42 +- .../deletion}/property/suite_test.go | 44 +- test/integration/standalone/deletion/common.go | 414 ++++++++++++ .../standalone/deletion/deletion_suite_test.go | 225 ------- .../{query_ondisk => deletion}/etcd/suite_test.go | 35 +- .../etcd => deletion/property}/suite_test.go | 24 +- .../standalone/multi_segments/common.go | 4 + .../standalone/multi_segments/etcd/suite_test.go | 24 +- .../multi_segments/property/suite_test.go | 21 +- .../standalone/multi_segments/round2.go | 61 ++ test/integration/standalone/query/common.go | 4 + .../standalone/query/etcd/suite_test.go | 28 +- .../standalone/query/property/suite_test.go | 21 +- test/integration/standalone/query/round2.go | 64 ++ test/integration/standalone/query_ondisk/common.go | 103 --- test_table | Bin 0 -> 2254768 bytes ui/.licenserc.yaml | 1 + ui/LICENSE | 49 +- ui/package-lock.json | 459 +++++++------- ui/src/components/CodeMirror/bydbql-mode.js | 9 + ui/src/components/Property/PropertyRead.vue | 36 +- ui/src/components/Read/index.vue | 14 +- 230 files changed, 9069 insertions(+), 5082 deletions(-) diff --cc pkg/meter/prom/prom.go index 00443bbd8,f3fb88af8..c98031fac --- a/pkg/meter/prom/prom.go +++ b/pkg/meter/prom/prom.go @@@ -46,7 -46,10 +47,10 @@@ func (p *provider) Counter(name string Name: p.scope.GetNamespace() + "_" + name, Help: p.scope.GetNamespace() + "_" + name, ConstLabels: convertLabels(p.scope.GetLabels()), - }, labels))} + }, labels) - p.reg.MustRegister(vec) - p.collectors = append(p.collectors, vec) - return &counter{counter: vec} ++ collected := registerCollector(p.reg, vec) ++ p.collectors = append(p.collectors, collected) ++ return &counter{counter: collected} } // Gauge returns a prometheus gauge. @@@ -55,7 -58,10 +59,10 @@@ func (p *provider) Gauge(name string, l Name: p.scope.GetNamespace() + "_" + name, Help: p.scope.GetNamespace() + "_" + name, ConstLabels: convertLabels(p.scope.GetLabels()), - }, labels))} + }, labels) - p.reg.MustRegister(vec) - p.collectors = append(p.collectors, vec) - return &gauge{gauge: vec} ++ collected := registerCollector(p.reg, vec) ++ p.collectors = append(p.collectors, collected) ++ return &gauge{gauge: collected} } // Histogram returns a prometheus histogram. @@@ -65,22 -71,20 +72,33 @@@ func (p *provider) Histogram(name strin Help: p.scope.GetNamespace() + "_" + name, ConstLabels: convertLabels(p.scope.GetLabels()), Buckets: buckets, - }, labels))} + }, labels) - p.reg.MustRegister(vec) - p.collectors = append(p.collectors, vec) - return &histogram{histogram: vec} ++ collected := registerCollector(p.reg, vec) ++ p.collectors = append(p.collectors, collected) ++ return &histogram{histogram: collected} +} + +func registerCollector[T prometheus.Collector](reg prometheus.Registerer, c T) T { + if regErr := reg.Register(c); regErr != nil { + var are prometheus.AlreadyRegisteredError + if errors.As(regErr, &are) { + if existing, ok := are.ExistingCollector.(T); ok { + return existing + } + } + panic(regErr) + } + return c } + // Close unregisters all collectors from the prometheus registry. + func (p *provider) Close() { + for _, c := range p.collectors { + p.reg.Unregister(c) + } + p.collectors = nil + } + // convertLabels converts a map of labels to a prometheus.Labels. func convertLabels(labels meter.LabelPairs) prometheus.Labels { if labels == nil {
