feat: 实现完整可观测性架构与火山v3适配器重构
重构整体架构: 1. 新增telemetry包实现零依赖的Prometheus指标系统 2. 新增metrics包集中管理业务埋点指标 3. 重构火山v3适配器,拆分client/request/response等模块 4. 替换旧的service/stats统计系统为标准指标埋点 5. 新增/metrics观测端点与完整仪表盘支持 功能更新: - 实现基于IP的限流与并发限制,添加指标埋点 - 重构TTS控制器,支持多格式输出与完整错误分类 - 更新.env.example配置示例,新增多项可选参数 - 替换旧的volcano适配器实现,支持完整的v3 API特性 - 清理冗余代码,移除service/stats与旧adapter实现
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
package telemetry
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// copyLabels 返回只包含 labelNames 中声明的 key 的副本,缺失补空串。
|
||||
// 这样序列化时输出顺序和数量固定。
|
||||
func copyLabels(labels Labels, names []string) Labels {
|
||||
if len(names) == 0 {
|
||||
return Labels{}
|
||||
}
|
||||
out := make(Labels, len(names))
|
||||
for _, n := range names {
|
||||
out[n] = labels[n]
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func mergeLabels(a, b Labels) Labels {
|
||||
out := make(Labels, len(a)+len(b))
|
||||
for k, v := range a {
|
||||
out[k] = v
|
||||
}
|
||||
for k, v := range b {
|
||||
out[k] = v
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// formatLabels 序列化为 `{k1="v1",k2="v2"}`;空集合返回空字符串。
|
||||
// value 内的 `\`, `"`, 换行会按 Prometheus 规范转义。
|
||||
func formatLabels(labels Labels) string {
|
||||
if len(labels) == 0 {
|
||||
return ""
|
||||
}
|
||||
keys := sortedKeys(labels)
|
||||
var sb strings.Builder
|
||||
sb.WriteByte('{')
|
||||
for i, k := range keys {
|
||||
if i > 0 {
|
||||
sb.WriteByte(',')
|
||||
}
|
||||
sb.WriteString(k)
|
||||
sb.WriteString(`="`)
|
||||
sb.WriteString(escapeLabelValue(labels[k]))
|
||||
sb.WriteByte('"')
|
||||
}
|
||||
sb.WriteByte('}')
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
func escapeLabelValue(v string) string {
|
||||
if !strings.ContainsAny(v, "\\\"\n") {
|
||||
return v
|
||||
}
|
||||
var sb strings.Builder
|
||||
sb.Grow(len(v) + 2)
|
||||
for i := 0; i < len(v); i++ {
|
||||
switch v[i] {
|
||||
case '\\':
|
||||
sb.WriteString(`\\`)
|
||||
case '"':
|
||||
sb.WriteString(`\"`)
|
||||
case '\n':
|
||||
sb.WriteString(`\n`)
|
||||
default:
|
||||
sb.WriteByte(v[i])
|
||||
}
|
||||
}
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
func writeMetricLine(w io.Writer, name string, labels Labels, value float64) {
|
||||
fmt.Fprintf(w, "%s%s %s\n", name, formatLabels(labels), formatFloat(value))
|
||||
}
|
||||
|
||||
func formatFloat(f float64) string {
|
||||
return strconv.FormatFloat(f, 'g', -1, 64)
|
||||
}
|
||||
|
||||
// float64 bits 互转,封装到独立文件避免重复。
|
||||
func float64bits(f float64) uint64 { return math.Float64bits(f) }
|
||||
func float64frombits(b uint64) float64 { return math.Float64frombits(b) }
|
||||
Reference in New Issue
Block a user