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 {

Reply via email to