Minimal fixes for metrics

This commit is contained in:
2026-03-02 23:26:57 +01:00
parent 8c9cd96213
commit c03bd3e3a2
5 changed files with 22 additions and 10 deletions

View File

@@ -661,13 +661,12 @@ func (l *limitedListener) Accept() (net.Conn, error) {
l.slots <- struct{}{} l.slots <- struct{}{}
metrics.Default.DecRequestQueueLength() metrics.Default.DecRequestQueueLength()
} }
metrics.Default.IncConnectionPoolActive()
conn, err := l.Listener.Accept() conn, err := l.Listener.Accept()
if err != nil { if err != nil {
<-l.slots <-l.slots
metrics.Default.DecConnectionPoolActive()
return nil, err return nil, err
} }
metrics.Default.IncConnectionPoolActive()
return &limitedConn{ return &limitedConn{
Conn: conn, Conn: conn,
done: func() { done: func() {

View File

@@ -762,7 +762,7 @@ func trimFloat(v float64) string {
} }
func escapeLabelValue(value string) string { func escapeLabelValue(value string) string {
value = strings.ReplaceAll(value, `\\`, `\\\\`) value = strings.ReplaceAll(value, `\`, `\\`)
value = strings.ReplaceAll(value, "\n", `\\n`) value = strings.ReplaceAll(value, "\n", `\\n`)
value = strings.ReplaceAll(value, `"`, `\\"`) value = strings.ReplaceAll(value, `"`, `\\"`)
return value return value

View File

@@ -24,3 +24,11 @@ func TestRenderPrometheusHistogramNoEmptyLabelSet(t *testing.T) {
t.Fatalf("unexpected empty label set for gc count metric") t.Fatalf("unexpected empty label set for gc count metric")
} }
} }
func TestEscapeLabelValueEscapesSingleBackslash(t *testing.T) {
got := escapeLabelValue(`a\b`)
want := `a\\b`
if got != want {
t.Fatalf("escapeLabelValue returned %q, want %q", got, want)
}
}

View File

@@ -106,10 +106,6 @@ func (s *ObjectService) PutObject(bucket, key, contentType string, input io.Read
func (s *ObjectService) GetObject(bucket, key string) (io.ReadCloser, *models.ObjectManifest, error) { func (s *ObjectService) GetObject(bucket, key string) (io.ReadCloser, *models.ObjectManifest, error) {
start := time.Now() start := time.Now()
success := false
defer func() {
metrics.Default.ObserveService("get_object", time.Since(start), success)
}()
waitStart := time.Now() waitStart := time.Now()
s.gcMu.RLock() s.gcMu.RLock()
@@ -120,20 +116,27 @@ func (s *ObjectService) GetObject(bucket, key string) (io.ReadCloser, *models.Ob
if err != nil { if err != nil {
metrics.Default.ObserveLockHold("gc_mu_read", time.Since(holdStart)) metrics.Default.ObserveLockHold("gc_mu_read", time.Since(holdStart))
s.gcMu.RUnlock() s.gcMu.RUnlock()
metrics.Default.ObserveService("get_object", time.Since(start), false)
return nil, nil, err return nil, nil, err
} }
pr, pw := io.Pipe() pr, pw := io.Pipe()
go func() { go func() {
streamOK := false
defer func() {
metrics.Default.ObserveService("get_object", time.Since(start), streamOK)
}()
defer metrics.Default.ObserveLockHold("gc_mu_read", time.Since(holdStart)) defer metrics.Default.ObserveLockHold("gc_mu_read", time.Since(holdStart))
defer s.gcMu.RUnlock() defer s.gcMu.RUnlock()
if err := s.blob.AssembleStream(manifest.Chunks, pw); err != nil { if err := s.blob.AssembleStream(manifest.Chunks, pw); err != nil {
_ = pw.CloseWithError(err) _ = pw.CloseWithError(err)
return return
} }
_ = pw.Close() if err := pw.Close(); err != nil {
return
}
streamOK = true
}() }()
success = true
return pr, manifest, nil return pr, manifest, nil
} }

View File

@@ -88,8 +88,9 @@ func (bs *BlobStore) IngestStream(stream io.Reader) ([]string, int64, string, er
func (bs *BlobStore) saveBlob(chunkID string, data []byte) error { func (bs *BlobStore) saveBlob(chunkID string, data []byte) error {
start := time.Now() start := time.Now()
success := false success := false
writtenBytes := int64(0)
defer func() { defer func() {
metrics.Default.ObserveBlob("write_chunk", time.Since(start), int64(len(data)), success) metrics.Default.ObserveBlob("write_chunk", time.Since(start), writtenBytes, success)
}() }()
if !isValidChunkID(chunkID) { if !isValidChunkID(chunkID) {
@@ -144,6 +145,7 @@ func (bs *BlobStore) saveBlob(chunkID string, data []byte) error {
if err := syncDir(dir); err != nil { if err := syncDir(dir); err != nil {
return err return err
} }
writtenBytes = int64(len(data))
success = true success = true
return nil return nil
} }