This is an automated email from the ASF dual-hosted git repository.
lujiajing pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
The following commit(s) were added to refs/heads/main by this push:
new cbdb30c3 Add system information endpoint (#277)
cbdb30c3 is described below
commit cbdb30c3079bdff2b4502da0f89f967b96f3a86a
Author: Gao Hongtao <[email protected]>
AuthorDate: Thu Jun 1 13:42:22 2023 +0800
Add system information endpoint (#277)
* Add system information endpoint
* Bump node to 18.16
Signed-off-by: Gao Hongtao <[email protected]>
---
.github/workflows/ci.yml | 4 +-
.github/workflows/e2e.storage.yml | 2 +-
.github/workflows/publish-docker.yml | 2 +-
.github/workflows/test.yml | 2 +-
CHANGES.md | 4 +-
CONTRIBUTING.md | 2 +-
banyand/liaison/grpc/server.go | 1 +
banyand/liaison/http/server.go | 2 +
banyand/measure/service.go | 5 +-
banyand/metadata/schema/etcd.go | 2 +
banyand/observability/meter_noop.go | 7 -
banyand/observability/meter_prom.go | 82 +----------
.../observability/{meter_prom.go => service.go} | 49 +------
banyand/observability/system.go | 162 +++++++++++++++++++++
banyand/stream/service.go | 5 +-
dist/LICENSE | 4 +-
docs/installation.md | 2 +-
ui/LICENSE | 2 +-
ui/package-lock.json | 2 +-
ui/package.json | 2 +-
ui/vite.config.js | 5 +
21 files changed, 205 insertions(+), 143 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9b2d3999..c4754725 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -52,7 +52,7 @@ jobs:
${{ runner.os }}-check-tool-
- uses: actions/setup-node@v3
with:
- node-version: 16.15
+ node-version: 18.16
cache: 'npm'
cache-dependency-path: ui/package-lock.json
- name: Install Go
@@ -98,7 +98,7 @@ jobs:
${{ runner.os }}-build-tool-
- uses: actions/setup-node@v3
with:
- node-version: 16.15
+ node-version: 18.16
cache: 'npm'
cache-dependency-path: ui/package-lock.json
- name: Install Go
diff --git a/.github/workflows/e2e.storage.yml
b/.github/workflows/e2e.storage.yml
index 62151dc8..dec0d6ac 100644
--- a/.github/workflows/e2e.storage.yml
+++ b/.github/workflows/e2e.storage.yml
@@ -72,7 +72,7 @@ jobs:
${{ runner.os }}-build-tool-
- uses: actions/setup-node@v3
with:
- node-version: 16.15
+ node-version: 18.16
cache: 'npm'
cache-dependency-path: ui/package-lock.json
- name: Install Go
diff --git a/.github/workflows/publish-docker.yml
b/.github/workflows/publish-docker.yml
index 91bdeb4d..1024d5bb 100644
--- a/.github/workflows/publish-docker.yml
+++ b/.github/workflows/publish-docker.yml
@@ -61,7 +61,7 @@ jobs:
${{ runner.os }}-build-tool-
- uses: actions/setup-node@v3
with:
- node-version: 16.15
+ node-version: 18.16
cache: 'npm'
cache-dependency-path: ui/package-lock.json
- name: Install Go
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 81fd3c37..31b83480 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -60,7 +60,7 @@ jobs:
${{ runner.os }}-test-tool-
- uses: actions/setup-node@v3
with:
- node-version: 16.15
+ node-version: 18.16
cache: 'npm'
cache-dependency-path: ui/package-lock.json
- name: Install Go
diff --git a/CHANGES.md b/CHANGES.md
index 9fc24059..a0c5c706 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -17,7 +17,8 @@ Release Notes.
- Enhance meter performance
- Reduce logger creation frequency
- Add units to memory flags
-- Introduce TSTable to customize the block's structure
+- Introduce TSTable to customize the block's structure
+- Add `/system` endpoint to the monitoring server that displays a list of
nodes' system information.
### Bugs
@@ -30,6 +31,7 @@ Release Notes.
- Set KV's minimum memtable size to 8MB
- [docs] Fix docs crud examples error
- Modified `TestGoVersion` to check for CPU architecture and Go Version
+- Bump node to 18.16
## 0.3.1
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 72a3e75a..8855b24d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -42,7 +42,7 @@ Once we've discussed your changes and you've got your code
ready, make sure that
Users who want to build a binary from sources have to set up:
* Go 1.20
-* Node 16.15
+* Node 18.16
* Git >= 2.30
* Linux, macOS or Windows+WSL2
* GNU make
diff --git a/banyand/liaison/grpc/server.go b/banyand/liaison/grpc/server.go
index 01b1d9f5..c3cbb7ea 100644
--- a/banyand/liaison/grpc/server.go
+++ b/banyand/liaison/grpc/server.go
@@ -168,6 +168,7 @@ func (s *server) Validate() error {
if s.addr == "" {
return errNoAddr
}
+ observability.UpdateAddress("grpc", s.addr)
if !s.tls {
return nil
}
diff --git a/banyand/liaison/http/server.go b/banyand/liaison/http/server.go
index 5a8ec23d..1690c689 100644
--- a/banyand/liaison/http/server.go
+++ b/banyand/liaison/http/server.go
@@ -38,6 +38,7 @@ import (
measurev1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/measure/v1"
propertyv1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/property/v1"
streamv1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1"
+ "github.com/apache/skywalking-banyandb/banyand/observability"
"github.com/apache/skywalking-banyandb/pkg/logger"
"github.com/apache/skywalking-banyandb/pkg/run"
"github.com/apache/skywalking-banyandb/ui"
@@ -89,6 +90,7 @@ func (p *service) Validate() error {
if p.listenAddr == "" {
return errNoAddr
}
+ observability.UpdateAddress("http", p.listenAddr)
if p.grpcCert != "" {
creds, errTLS := credentials.NewClientTLSFromFile(p.grpcCert,
"")
if errTLS != nil {
diff --git a/banyand/measure/service.go b/banyand/measure/service.go
index ad7895bd..cec60cf7 100644
--- a/banyand/measure/service.go
+++ b/banyand/measure/service.go
@@ -31,6 +31,7 @@ import (
"github.com/apache/skywalking-banyandb/banyand/discovery"
"github.com/apache/skywalking-banyandb/banyand/metadata"
"github.com/apache/skywalking-banyandb/banyand/metadata/schema"
+ "github.com/apache/skywalking-banyandb/banyand/observability"
"github.com/apache/skywalking-banyandb/banyand/queue"
"github.com/apache/skywalking-banyandb/banyand/tsdb"
"github.com/apache/skywalking-banyandb/pkg/bus"
@@ -113,7 +114,9 @@ func (s *service) PreRun() error {
if err != nil {
return err
}
- s.schemaRepo = newSchemaRepo(path.Join(s.root, s.Name()), s.metadata,
s.repo, s.dbOpts,
+ path := path.Join(s.root, s.Name())
+ observability.UpdatePath(path)
+ s.schemaRepo = newSchemaRepo(path, s.metadata, s.repo, s.dbOpts,
s.l, s.pipeline, int64(s.BlockEncoderBufferSize),
int64(s.BlockBufferSize))
for _, g := range groups {
if g.Catalog != commonv1.Catalog_CATALOG_MEASURE {
diff --git a/banyand/metadata/schema/etcd.go b/banyand/metadata/schema/etcd.go
index d87512de..f66c96fc 100644
--- a/banyand/metadata/schema/etcd.go
+++ b/banyand/metadata/schema/etcd.go
@@ -35,6 +35,7 @@ import (
commonv1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
databasev1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
propertyv1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/property/v1"
+ "github.com/apache/skywalking-banyandb/banyand/observability"
"github.com/apache/skywalking-banyandb/pkg/logger"
"github.com/apache/skywalking-banyandb/pkg/run"
)
@@ -401,6 +402,7 @@ func newStandaloneEtcdConfig(config
*etcdSchemaRegistryConfig, logger *zap.Logge
cfg := embed.NewConfig()
cfg.ZapLoggerBuilder = embed.NewZapLoggerBuilder(logger)
cfg.Dir = filepath.Join(config.rootDir, "metadata")
+ observability.UpdatePath(cfg.Dir)
cURL, _ := url.Parse(config.listenerClientURL)
pURL, _ := url.Parse(config.listenerPeerURL)
diff --git a/banyand/observability/meter_noop.go
b/banyand/observability/meter_noop.go
index 29bb737d..069ec668 100644
--- a/banyand/observability/meter_noop.go
+++ b/banyand/observability/meter_noop.go
@@ -24,15 +24,8 @@ import (
"google.golang.org/grpc"
"github.com/apache/skywalking-banyandb/pkg/meter"
- "github.com/apache/skywalking-banyandb/pkg/run"
)
-// NewMetricService returns a metric service.
-func NewMetricService() run.Service {
- MetricsCollector.collect()
- return nil
-}
-
// NewMeterProvider returns a meter.Provider based on the given scope.
func NewMeterProvider(_ meter.Scope) meter.Provider {
return meter.NoopProvider{}
diff --git a/banyand/observability/meter_prom.go
b/banyand/observability/meter_prom.go
index 173bb116..e148f09a 100644
--- a/banyand/observability/meter_prom.go
+++ b/banyand/observability/meter_prom.go
@@ -21,102 +21,24 @@
package observability
import (
- "context"
- "net/http"
- "time"
-
grpcprom
"github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
- "github.com/robfig/cron/v3"
- "github.com/apache/skywalking-banyandb/pkg/logger"
"github.com/apache/skywalking-banyandb/pkg/meter"
"github.com/apache/skywalking-banyandb/pkg/meter/prom"
- "github.com/apache/skywalking-banyandb/pkg/run"
- "github.com/apache/skywalking-banyandb/pkg/timestamp"
"google.golang.org/grpc"
)
-var (
- _ run.Service = (*metricService)(nil)
- _ run.Config = (*metricService)(nil)
-
- reg = prometheus.NewRegistry()
-)
-
-// NewMetricService returns a metric service.
-func NewMetricService() run.Service {
- return &metricService{
- closer: run.NewCloser(1),
- }
-}
-
-type metricService struct {
- l *logger.Logger
- svr *http.Server
- closer *run.Closer
- listenAddr string
- scheduler *timestamp.Scheduler
-}
-
-func (p *metricService) FlagSet() *run.FlagSet {
- flagSet := run.NewFlagSet("observability")
- flagSet.StringVar(&p.listenAddr, "observability-listener-addr",
":2121", "listen addr for observability")
- return flagSet
-}
-
-func (p *metricService) Validate() error {
- if p.listenAddr == "" {
- return errNoAddr
- }
- return nil
-}
-
-func (p *metricService) Name() string {
- return "metric-service"
-}
-
-func (p *metricService) Serve() run.StopNotify {
- p.l = logger.GetLogger(p.Name())
+var reg = prometheus.NewRegistry()
+func init() {
reg.MustRegister(prometheus.NewGoCollector())
reg.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
-
- clock, _ := timestamp.GetClock(context.TODO())
- p.scheduler = timestamp.NewScheduler(p.l, clock)
- p.scheduler.Register("metrics-collector", cron.Descriptor, "@every
15s", func(now time.Time, logger *logger.Logger) bool {
- MetricsCollector.collect()
- return true
- })
-
- mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.HandlerFor(
reg,
promhttp.HandlerOpts{},
))
- p.svr = &http.Server{
- Addr: p.listenAddr,
- ReadHeaderTimeout: 3 * time.Second,
- Handler: mux,
- }
-
- go func() {
- defer p.closer.Done()
- p.l.Info().Str("listenAddr", p.listenAddr).Msg("Start metric
server")
- _ = p.svr.ListenAndServe()
- }()
- return p.closer.CloseNotify()
-}
-
-func (p *metricService) GracefulStop() {
- if p.scheduler != nil {
- p.scheduler.Close()
- }
- if p.svr != nil {
- _ = p.svr.Close()
- }
- p.closer.CloseThenWait()
}
// NewMeterProvider returns a meter.Provider based on the given scope.
diff --git a/banyand/observability/meter_prom.go
b/banyand/observability/service.go
similarity index 62%
copy from banyand/observability/meter_prom.go
copy to banyand/observability/service.go
index 173bb116..412dc8e1 100644
--- a/banyand/observability/meter_prom.go
+++ b/banyand/observability/service.go
@@ -1,6 +1,3 @@
-//go:build prometheus
-// +build prometheus
-
// Licensed to Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
@@ -25,24 +22,17 @@ import (
"net/http"
"time"
- grpcprom
"github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
- "github.com/prometheus/client_golang/prometheus"
- "github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/robfig/cron/v3"
"github.com/apache/skywalking-banyandb/pkg/logger"
- "github.com/apache/skywalking-banyandb/pkg/meter"
- "github.com/apache/skywalking-banyandb/pkg/meter/prom"
"github.com/apache/skywalking-banyandb/pkg/run"
"github.com/apache/skywalking-banyandb/pkg/timestamp"
- "google.golang.org/grpc"
)
var (
- _ run.Service = (*metricService)(nil)
- _ run.Config = (*metricService)(nil)
-
- reg = prometheus.NewRegistry()
+ _ run.Service = (*metricService)(nil)
+ _ run.Config = (*metricService)(nil)
+ mux = http.NewServeMux()
)
// NewMetricService returns a metric service.
@@ -56,8 +46,8 @@ type metricService struct {
l *logger.Logger
svr *http.Server
closer *run.Closer
- listenAddr string
scheduler *timestamp.Scheduler
+ listenAddr string
}
func (p *metricService) FlagSet() *run.FlagSet {
@@ -80,27 +70,20 @@ func (p *metricService) Name() string {
func (p *metricService) Serve() run.StopNotify {
p.l = logger.GetLogger(p.Name())
- reg.MustRegister(prometheus.NewGoCollector())
-
reg.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
-
clock, _ := timestamp.GetClock(context.TODO())
p.scheduler = timestamp.NewScheduler(p.l, clock)
- p.scheduler.Register("metrics-collector", cron.Descriptor, "@every
15s", func(now time.Time, logger *logger.Logger) bool {
+ err := p.scheduler.Register("metrics-collector", cron.Descriptor,
"@every 15s", func(now time.Time, logger *logger.Logger) bool {
MetricsCollector.collect()
return true
})
-
- mux := http.NewServeMux()
- mux.Handle("/metrics", promhttp.HandlerFor(
- reg,
- promhttp.HandlerOpts{},
- ))
+ if err != nil {
+ p.l.Fatal().Err(err).Msg("Failed to register metrics collector")
+ }
p.svr = &http.Server{
Addr: p.listenAddr,
ReadHeaderTimeout: 3 * time.Second,
Handler: mux,
}
-
go func() {
defer p.closer.Done()
p.l.Info().Str("listenAddr", p.listenAddr).Msg("Start metric
server")
@@ -118,19 +101,3 @@ func (p *metricService) GracefulStop() {
}
p.closer.CloseThenWait()
}
-
-// NewMeterProvider returns a meter.Provider based on the given scope.
-func NewMeterProvider(scope meter.Scope) meter.Provider {
- return prom.NewProvider(scope, reg)
-}
-
-// MetricsServerInterceptor returns a server interceptor for metrics.
-func MetricsServerInterceptor() (grpc.UnaryServerInterceptor,
grpc.StreamServerInterceptor) {
- srvMetrics := grpcprom.NewServerMetrics(
- grpcprom.WithServerHandlingTimeHistogram(
- grpcprom.WithHistogramBuckets([]float64{0.001, 0.01,
0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}),
- ),
- )
- reg.MustRegister(srvMetrics)
- return srvMetrics.UnaryServerInterceptor(),
srvMetrics.StreamServerInterceptor()
-}
diff --git a/banyand/observability/system.go b/banyand/observability/system.go
new file mode 100644
index 00000000..0bf551d8
--- /dev/null
+++ b/banyand/observability/system.go
@@ -0,0 +1,162 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package observability
+
+import (
+ "encoding/json"
+ "net/http"
+ "os"
+ "sync"
+
+ "github.com/shirou/gopsutil/v3/cpu"
+ "github.com/shirou/gopsutil/v3/disk"
+ "github.com/shirou/gopsutil/v3/host"
+ "github.com/shirou/gopsutil/v3/mem"
+
+ "github.com/apache/skywalking-banyandb/pkg/logger"
+)
+
+var systemInfoInstance *SystemInfo
+
+func init() {
+ systemInfoInstance = &SystemInfo{
+ Addresses: make(map[string]string),
+ DiskUsages: make(map[string]*DiskUsage),
+ }
+}
+
+// UpdateAddress updates the address of the given name.
+func UpdateAddress(name, address string) {
+ systemInfoInstance.Lock()
+ defer systemInfoInstance.Unlock()
+ systemInfoInstance.Addresses[name] = address
+}
+
+func getAddresses() map[string]string {
+ systemInfoInstance.RLock()
+ defer systemInfoInstance.RUnlock()
+ return systemInfoInstance.Addresses
+}
+
+// UpdatePath updates a path to monitoring its disk usage.
+func UpdatePath(path string) {
+ systemInfoInstance.Lock()
+ defer systemInfoInstance.Unlock()
+ systemInfoInstance.DiskUsages[path] = nil
+}
+
+func getPath() map[string]*DiskUsage {
+ systemInfoInstance.RLock()
+ defer systemInfoInstance.RUnlock()
+ return systemInfoInstance.DiskUsages
+}
+
+// SystemInfo represents the system information of a node.
+type SystemInfo struct {
+ Addresses map[string]string `json:"addresses"`
+ DiskUsages map[string]*DiskUsage `json:"disk_usages"`
+ NodeID string `json:"node_id"`
+ Hostname string `json:"hostname"`
+ Roles []string `json:"roles"`
+ Uptime uint64 `json:"uptime"`
+ CPUUsage float64 `json:"cpu_usage"`
+ MemoryUsage float64 `json:"memory_usage"`
+ sync.RWMutex
+}
+
+// DiskUsage represents the disk usage for a given path.
+type DiskUsage struct {
+ Capacity uint64 `json:"capacity"`
+ Used uint64 `json:"used"`
+}
+
+// ErrorResponse represents the error response.
+type ErrorResponse struct {
+ Message string `json:"message"`
+ OriginalError string `json:"original_error,omitempty"`
+}
+
+func init() {
+ mux.HandleFunc("/system", systemInfoHandler)
+}
+
+func systemInfoHandler(w http.ResponseWriter, _ *http.Request) {
+ hostname, _ := os.Hostname()
+ uptime, _ := getUptime()
+ cpuUsage, _ := getCPUUsage()
+ memoryUsage, _ := getMemoryUsage()
+
+ systemInfo := &SystemInfo{
+ NodeID: "1",
+ Roles: []string{"meta", "ingest", "query", "data"},
+ Hostname: hostname,
+ Uptime: uptime,
+ CPUUsage: cpuUsage,
+ MemoryUsage: memoryUsage,
+ Addresses: getAddresses(),
+ DiskUsages: make(map[string]*DiskUsage),
+ }
+ for k := range getPath() {
+ usage, _ := getDiskUsage(k)
+ systemInfo.DiskUsages[k] = &usage
+ }
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusOK)
+ if err := json.NewEncoder(w).Encode([]*SystemInfo{systemInfo}); err !=
nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ errorResponse := &ErrorResponse{
+ Message: "Error encoding JSON response",
+ OriginalError: err.Error(),
+ }
+ if err := json.NewEncoder(w).Encode(errorResponse); err != nil {
+ logger.GetLogger().Error().Err(err).Msg("Error encoding
JSON response")
+ }
+ }
+}
+
+func getUptime() (uint64, error) {
+ uptime, err := host.Uptime()
+ if err != nil {
+ return 0, err
+ }
+ return uptime, nil
+}
+
+func getCPUUsage() (float64, error) {
+ percentages, err := cpu.Percent(0, false)
+ if err != nil {
+ return 0, err
+ }
+ return percentages[0], nil
+}
+
+func getMemoryUsage() (float64, error) {
+ vm, err := mem.VirtualMemory()
+ if err != nil {
+ return 0, err
+ }
+ return vm.UsedPercent, nil
+}
+
+func getDiskUsage(path string) (DiskUsage, error) {
+ usage, err := disk.Usage(path)
+ if err != nil {
+ return DiskUsage{}, err
+ }
+ return DiskUsage{Capacity: usage.Total, Used: usage.Used}, nil
+}
diff --git a/banyand/stream/service.go b/banyand/stream/service.go
index 5eb2349a..8afb9436 100644
--- a/banyand/stream/service.go
+++ b/banyand/stream/service.go
@@ -29,6 +29,7 @@ import (
"github.com/apache/skywalking-banyandb/banyand/discovery"
"github.com/apache/skywalking-banyandb/banyand/metadata"
"github.com/apache/skywalking-banyandb/banyand/metadata/schema"
+ "github.com/apache/skywalking-banyandb/banyand/observability"
"github.com/apache/skywalking-banyandb/banyand/queue"
"github.com/apache/skywalking-banyandb/banyand/tsdb"
"github.com/apache/skywalking-banyandb/pkg/logger"
@@ -103,7 +104,9 @@ func (s *service) PreRun() error {
if err != nil {
return err
}
- s.schemaRepo = newSchemaRepo(path.Join(s.root, s.Name()), s.metadata,
s.repo, int64(s.blockBufferSize), s.dbOpts, s.l)
+ path := path.Join(s.root, s.Name())
+ observability.UpdatePath(path)
+ s.schemaRepo = newSchemaRepo(path, s.metadata, s.repo,
int64(s.blockBufferSize), s.dbOpts, s.l)
for _, g := range groups {
if g.Catalog != commonv1.Catalog_CATALOG_STREAM {
continue
diff --git a/dist/LICENSE b/dist/LICENSE
index 479a55e3..caa30176 100644
--- a/dist/LICENSE
+++ b/dist/LICENSE
@@ -178,7 +178,7 @@
Apache-2.0 licenses
========================================================================
- github.com/SkyAPM/badger/v3 v3.0.0-20230329010346-dfdf57f0581b Apache-2.0
+ github.com/SkyAPM/badger/v3 v3.0.0-20230511223516-583c6a825854 Apache-2.0
github.com/blevesearch/segment v0.9.0 Apache-2.0
github.com/blevesearch/vellum v1.0.7 Apache-2.0
github.com/coreos/go-semver v0.3.0 Apache-2.0
@@ -398,7 +398,7 @@ ISC licenses
glob-parent 5.1.2 ISC
graceful-fs 4.2.10 ISC
picocolors 1.0.0 ISC
- yaml 2.2.1 ISC
+ yaml 2.2.2 ISC
========================================================================
MIT licenses
diff --git a/docs/installation.md b/docs/installation.md
index 498be131..89b79144 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -16,7 +16,7 @@ Get binaries from the
[download](https://skywalking.apache.org/downloads/).
Users who want to build a binary from sources have to set up:
* Go 1.20
-* Node 16.15
+* Node 18.16
* Git >= 2.30
* Linux, macOS or Windows+WSL2
* GNU make
diff --git a/ui/LICENSE b/ui/LICENSE
index 4d5f4740..02c67b02 100644
--- a/ui/LICENSE
+++ b/ui/LICENSE
@@ -35,7 +35,7 @@ ISC licenses
glob-parent 5.1.2 ISC
graceful-fs 4.2.10 ISC
picocolors 1.0.0 ISC
- yaml 2.2.1 ISC
+ yaml 2.2.2 ISC
========================================================================
MIT licenses
diff --git a/ui/package-lock.json b/ui/package-lock.json
index 3e6b6435..1f167ae5 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -29,7 +29,7 @@
"vite": "^3.0.9"
},
"engines": {
- "node": "16.15"
+ "node": "18.16"
}
},
"node_modules/@antfu/utils": {
diff --git a/ui/package.json b/ui/package.json
index 0e8242d1..5a58ce3e 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -2,7 +2,7 @@
"name": "ui",
"version": "0.1.0",
"engines": {
- "node": "16.15"
+ "node": "18.16"
},
"scripts": {
"dev": "vite",
diff --git a/ui/vite.config.js b/ui/vite.config.js
index e58cdb41..5660f03d 100644
--- a/ui/vite.config.js
+++ b/ui/vite.config.js
@@ -49,6 +49,11 @@ export default defineConfig({
target: "http://localhost:17913",
changeOrigin: true,
},
+ "^/monitoring": {
+ target: "http://localhost:2121",
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/monitoring/, ''),
+ },
},
}
})