starlog/metrics.go

85 lines
2.0 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 {
return defaultAsyncRuntime().Metrics()
}
func (logger *StarLogger) GetMetricsSnapshot() MetricsSnapshot {
snapshot := MetricsSnapshot{
Time: time.Now(),
Errors: ErrorMetrics{
WriteErrors: 0,
},
}
if logger == nil || logger.logcore == nil {
snapshot.Async = GetAsyncMetrics()
snapshot.Errors.WriteErrors = GetWriteErrorCount()
return snapshot
}
snapshot.Async = logger.GetAsyncMetrics()
snapshot.Pending = logger.GetPendingStats()
snapshot.Sampling = logger.GetSamplingStats()
snapshot.Dedup = logger.GetDedupStats()
snapshot.RateLimit = logger.GetRateLimitStats()
snapshot.Errors.RedactionErrors = logger.GetRedactErrorCount()
snapshot.Errors.WriteErrors = logger.GetWriteErrorCount()
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 {
if logger == nil {
return GetAsyncMetrics()
}
return logger.asyncRuntime().Metrics()
}