From e9aad806f81b865c7c0687a813c3d3af620b6617 Mon Sep 17 00:00:00 2001 From: wood chen Date: Mon, 17 Feb 2025 06:36:38 +0800 Subject: [PATCH] refactor(metrics): Improve atomic counter handling and type safety in metrics collection - Optimize latency bucket counter initialization using pointer creation - Add type checking when loading latency distribution metrics - Simplify counter initialization and access in metrics collector - Enhance type safety for atomic counter operations --- internal/metrics/collector.go | 11 ++- web/next.config.js | 12 +--- web/package-lock.json | 122 +++++++++++++++++++++++++++++++++- web/package.json | 7 +- 4 files changed, 134 insertions(+), 18 deletions(-) diff --git a/internal/metrics/collector.go b/internal/metrics/collector.go index 1b4bc81..f76c4a6 100644 --- a/internal/metrics/collector.go +++ b/internal/metrics/collector.go @@ -162,8 +162,9 @@ func (c *Collector) RecordRequest(path string, status int, latency time.Duration if counter, ok := c.latencyBuckets.Load(bucketKey); ok { atomic.AddInt64(counter.(*int64), 1) } else { - var count int64 = 1 - c.latencyBuckets.Store(bucketKey, &count) + counter := new(int64) + *counter = 1 + c.latencyBuckets.Store(bucketKey, counter) } // 更新错误统计 @@ -308,7 +309,11 @@ func (c *Collector) GetStats() map[string]interface{} { // 收集延迟分布 latencyDistribution := make(map[string]int64) c.latencyBuckets.Range(func(key, value interface{}) bool { - latencyDistribution[key.(string)] = atomic.LoadInt64(value.(*int64)) + if counter, ok := value.(*int64); ok { + latencyDistribution[key.(string)] = atomic.LoadInt64(counter) + } else { + latencyDistribution[key.(string)] = value.(int64) + } return true }) diff --git a/web/next.config.js b/web/next.config.js index 7f45e3c..bff6fb4 100644 --- a/web/next.config.js +++ b/web/next.config.js @@ -1,20 +1,10 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - output: process.env.NODE_ENV === 'development' ? undefined : 'export', - basePath: process.env.NODE_ENV === 'development' ? '' : '/admin', - trailingSlash: true, - eslint: { - ignoreDuringBuilds: true, - }, - // 开发环境配置代理 async rewrites() { - if (process.env.NODE_ENV !== 'development') { - return [] - } return [ { source: '/admin/api/:path*', - destination: 'http://localhost:3336/admin/api/:path*', + destination: 'http://127.0.0.1:3336/admin/api/:path*', }, ] }, diff --git a/web/package-lock.json b/web/package-lock.json index e9c82a6..37ce30f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,17 +1,20 @@ { - "name": "web", + "name": "proxy-go-web", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "web", + "name": "proxy-go-web", "version": "0.1.0", "dependencies": { "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-slider": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.2.6", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -901,6 +904,12 @@ "node": ">=14" } }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, "node_modules/@radix-ui/primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", @@ -1027,6 +1036,21 @@ } } }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz", @@ -1206,6 +1230,70 @@ } } }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz", + "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.3.tgz", + "integrity": "sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", @@ -1253,6 +1341,36 @@ } } }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz", + "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-toast": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.6.tgz", diff --git a/web/package.json b/web/package.json index ea709b2..8f4d825 100644 --- a/web/package.json +++ b/web/package.json @@ -1,18 +1,21 @@ { - "name": "web", + "name": "proxy-go-web", "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -p 3000", + "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-slider": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.2.6", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1",