新增 Aliyun OSS 与 S3 协议、通道内重试和按优先级跨通道切换,保留 server-main 兼容与环境 OSS 内存通道。 将请求及结果中的 Base64、Data URI、Buffer、multipart 和内联二进制统一对象化,生产路径不再写入本机静态目录,历史本地资源仅保留只读兼容。 引入 PublicErrorV1 并统一 API、异步查询、兼容协议和失败回调的安全错误输出,同时补充迁移、管理端、指标、OpenAPI 与本地模拟验收。 验证:go test ./... -count=1;go vet ./...;pnpm lint;pnpm test;pnpm build;pnpm openapi;tests/ci/migrations-test.sh。
74 lines
2.6 KiB
Go
74 lines
2.6 KiB
Go
package publicerror
|
|
|
|
import "sync/atomic"
|
|
|
|
type MetricCount struct {
|
|
Code string
|
|
Count uint64
|
|
}
|
|
|
|
var observed = struct {
|
|
upstreamConnectionInterrupted atomic.Uint64
|
|
upstreamTimeout atomic.Uint64
|
|
upstreamRateLimited atomic.Uint64
|
|
upstreamUnavailable atomic.Uint64
|
|
upstreamInvalidResponse atomic.Uint64
|
|
upstreamAuthFailed atomic.Uint64
|
|
upstreamRequestRejected atomic.Uint64
|
|
storageWriteFailed atomic.Uint64
|
|
storageReadFailed atomic.Uint64
|
|
resultExpired atomic.Uint64
|
|
resultUnavailable atomic.Uint64
|
|
invalidParameter atomic.Uint64
|
|
gatewayError atomic.Uint64
|
|
}{}
|
|
|
|
func Observe(value Error) {
|
|
switch value.Code {
|
|
case "upstream_connection_interrupted":
|
|
observed.upstreamConnectionInterrupted.Add(1)
|
|
case "upstream_timeout":
|
|
observed.upstreamTimeout.Add(1)
|
|
case "upstream_rate_limited":
|
|
observed.upstreamRateLimited.Add(1)
|
|
case "upstream_unavailable":
|
|
observed.upstreamUnavailable.Add(1)
|
|
case "upstream_invalid_response":
|
|
observed.upstreamInvalidResponse.Add(1)
|
|
case "upstream_auth_failed":
|
|
observed.upstreamAuthFailed.Add(1)
|
|
case "upstream_request_rejected":
|
|
observed.upstreamRequestRejected.Add(1)
|
|
case "storage_write_failed":
|
|
observed.storageWriteFailed.Add(1)
|
|
case "storage_read_failed":
|
|
observed.storageReadFailed.Add(1)
|
|
case "result_expired":
|
|
observed.resultExpired.Add(1)
|
|
case "result_unavailable":
|
|
observed.resultUnavailable.Add(1)
|
|
case "invalid_parameter":
|
|
observed.invalidParameter.Add(1)
|
|
default:
|
|
observed.gatewayError.Add(1)
|
|
}
|
|
}
|
|
|
|
func MetricSnapshot() []MetricCount {
|
|
return []MetricCount{
|
|
{Code: "upstream_connection_interrupted", Count: observed.upstreamConnectionInterrupted.Load()},
|
|
{Code: "upstream_timeout", Count: observed.upstreamTimeout.Load()},
|
|
{Code: "upstream_rate_limited", Count: observed.upstreamRateLimited.Load()},
|
|
{Code: "upstream_unavailable", Count: observed.upstreamUnavailable.Load()},
|
|
{Code: "upstream_invalid_response", Count: observed.upstreamInvalidResponse.Load()},
|
|
{Code: "upstream_auth_failed", Count: observed.upstreamAuthFailed.Load()},
|
|
{Code: "upstream_request_rejected", Count: observed.upstreamRequestRejected.Load()},
|
|
{Code: "storage_write_failed", Count: observed.storageWriteFailed.Load()},
|
|
{Code: "storage_read_failed", Count: observed.storageReadFailed.Load()},
|
|
{Code: "result_expired", Count: observed.resultExpired.Load()},
|
|
{Code: "result_unavailable", Count: observed.resultUnavailable.Load()},
|
|
{Code: "invalid_parameter", Count: observed.invalidParameter.Load()},
|
|
{Code: "gateway_error", Count: observed.gatewayError.Load()},
|
|
}
|
|
}
|