starlog/metrics.go
2026-03-19 16:37:57 +08:00

96 lines
2.2 KiB
Go

package starlog
import "time"
type AsyncMetrics struct {
Started bool
QueueLength uint64
QueueCapacity uint64
QueueFree uint64
Dropped uint64
FallbackToSync bool
HandlerTimeout time.Duration
}
type ErrorMetrics struct {
WriteErrors uint64
RedactionErrors uint64
}
type MetricsSnapshot struct {
Time time.Time
LoggerName string
Level int
HasWriter bool
HasSink bool
HasMultiSink bool
ArchiveRunning bool
Pending PendingStats
Sampling SamplingStats
Dedup DedupStats
RateLimit RateLimitStats
Async AsyncMetrics
Errors ErrorMetrics
MultiSink MultiSinkStats
}
func GetAsyncMetrics() AsyncMetrics {
stackMu.Lock()
started := stackStarted
current := stacks
stackMu.Unlock()
snapshot := AsyncMetrics{
Started: started,
Dropped: GetAsyncDropCount(),
FallbackToSync: GetAsyncFallbackToSync(),
HandlerTimeout: GetAsyncHandlerTimeout(),
}
if current != nil {
snapshot.QueueLength = current.Len()
snapshot.QueueCapacity = current.Cap()
snapshot.QueueFree = current.Free()
}
return snapshot
}
func (logger *StarLogger) GetMetricsSnapshot() MetricsSnapshot {
snapshot := MetricsSnapshot{
Time: time.Now(),
Async: GetAsyncMetrics(),
Errors: ErrorMetrics{
WriteErrors: GetWriteErrorCount(),
},
}
if logger == nil || logger.logcore == nil {
return snapshot
}
snapshot.Pending = logger.GetPendingStats()
snapshot.Sampling = logger.GetSamplingStats()
snapshot.Dedup = logger.GetDedupStats()
snapshot.RateLimit = logger.GetRateLimitStats()
snapshot.Errors.RedactionErrors = logger.GetRedactErrorCount()
snapshot.ArchiveRunning = IsArchiveRun(logger)
logger.logcore.mu.Lock()
snapshot.LoggerName = logger.logcore.name
snapshot.Level = logger.logcore.minLevel
snapshot.HasWriter = logger.logcore.output != nil
sink := logger.logcore.sink
snapshot.HasSink = sink != nil
logger.logcore.mu.Unlock()
if multi, ok := sink.(*MultiSink); ok && multi != nil {
snapshot.HasMultiSink = true
snapshot.MultiSink = multi.GetStats()
}
return snapshot
}
func (logger *StarLogger) GetAsyncMetrics() AsyncMetrics {
_ = logger
return GetAsyncMetrics()
}