feat(go): expose gateway frame duration histogram

This commit is contained in:
lingniu
2026-07-03 18:54:00 +08:00
parent 71905aca3d
commit 16ee09180c
10 changed files with 182 additions and 9 deletions

View File

@@ -266,10 +266,16 @@ func (c *MQTTClient) recordFrameDuration(status envelope.ParseStatus, elapsed ti
if c.cfg.Metrics == nil {
return
}
elapsedMS := float64(elapsed.Milliseconds())
labels := metrics.Labels{
"protocol": string(envelope.ProtocolYutongMQTT),
"status": string(status),
}
c.cfg.Metrics.SetGauge("vehicle_gateway_frame_duration_ms", metrics.Labels{
"protocol": string(envelope.ProtocolYutongMQTT),
"status": string(status),
}, float64(elapsed.Milliseconds()))
}, elapsedMS)
c.cfg.Metrics.ObserveHistogram("vehicle_gateway_frame_duration_ms_histogram", labels, gatewayFrameDurationBucketsMS, elapsedMS)
}
func (c *MQTTClient) recordPublishMetric(kind string, status string) {

View File

@@ -80,6 +80,9 @@ func TestMQTTClientRecordsMessageMetrics(t *testing.T) {
`vehicle_gateway_identity_total{protocol="YUTONG_MQTT",status="resolved"} 1`,
`vehicle_gateway_publish_total{kind="raw",protocol="YUTONG_MQTT",status="ok"} 1`,
`vehicle_gateway_frame_duration_ms{protocol="YUTONG_MQTT",status="OK"}`,
`vehicle_gateway_frame_duration_ms_histogram_bucket{le="+Inf",protocol="YUTONG_MQTT",status="OK"} 1`,
`vehicle_gateway_frame_duration_ms_histogram_count{protocol="YUTONG_MQTT",status="OK"} 1`,
`vehicle_gateway_frame_duration_ms_histogram_sum{protocol="YUTONG_MQTT",status="OK"}`,
} {
if !strings.Contains(text, want) {
t.Fatalf("metrics missing %s:\n%s", want, text)

View File

@@ -63,6 +63,8 @@ type TCPServerConfig struct {
const frameOperationTimeout = 30 * time.Second
var gatewayFrameDurationBucketsMS = []float64{1, 5, 10, 25, 50, 100, 250, 500, 1000, 5000}
func NewTCPServer(cfg TCPServerConfig) (*TCPServer, error) {
if cfg.Protocol.Protocol == "" {
return nil, errors.New("protocol is required")
@@ -322,10 +324,16 @@ func (s *TCPServer) recordFrameDuration(status envelope.ParseStatus, elapsed tim
if s.metrics == nil {
return
}
elapsedMS := float64(elapsed.Milliseconds())
labels := metrics.Labels{
"protocol": string(s.protocol.Protocol),
"status": string(status),
}
s.metrics.SetGauge("vehicle_gateway_frame_duration_ms", metrics.Labels{
"protocol": string(s.protocol.Protocol),
"status": string(status),
}, float64(elapsed.Milliseconds()))
}, elapsedMS)
s.metrics.ObserveHistogram("vehicle_gateway_frame_duration_ms_histogram", labels, gatewayFrameDurationBucketsMS, elapsedMS)
}
func (s *TCPServer) recordPublishMetric(kind string, status string) {

View File

@@ -82,6 +82,9 @@ func TestTCPServerRecordsFrameMetrics(t *testing.T) {
`vehicle_gateway_identity_total{protocol="JT808",status="unresolved"} 1`,
`vehicle_gateway_publish_total{kind="raw",protocol="JT808",status="ok"} 1`,
`vehicle_gateway_frame_duration_ms{protocol="JT808",status="OK"}`,
`vehicle_gateway_frame_duration_ms_histogram_bucket{le="+Inf",protocol="JT808",status="OK"} 1`,
`vehicle_gateway_frame_duration_ms_histogram_count{protocol="JT808",status="OK"} 1`,
`vehicle_gateway_frame_duration_ms_histogram_sum{protocol="JT808",status="OK"}`,
} {
if !strings.Contains(text, want) {
t.Fatalf("metrics missing %s:\n%s", want, text)