67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package lokicore
|
|
|
|
import (
|
|
"time"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-observability/logging/lokicore/loki"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
)
|
|
|
|
// Zap Core for loki.
|
|
// Expands the zapcore.Core interface with calls to export logs to Loki.
|
|
type LokiCore struct {
|
|
original zapcore.Core
|
|
encoder zapcore.Encoder
|
|
loki *loki.Client
|
|
}
|
|
|
|
func New(original zapcore.Core, lokiCfg loki.Config) *LokiCore {
|
|
encoderConfig := zap.NewProductionEncoderConfig()
|
|
encoder := zapcore.NewJSONEncoder(encoderConfig)
|
|
encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout(time.RFC3339Nano)
|
|
|
|
return &LokiCore{
|
|
original: original,
|
|
encoder: encoder,
|
|
loki: loki.Setup(lokiCfg),
|
|
}
|
|
}
|
|
|
|
func (c *LokiCore) With(fields []zapcore.Field) zapcore.Core {
|
|
return &LokiCore{
|
|
original: c.original.With(fields),
|
|
encoder: c.encoder,
|
|
loki: c.loki,
|
|
}
|
|
}
|
|
|
|
func (c *LokiCore) Write(entry zapcore.Entry, fields []zapcore.Field) error {
|
|
if err := c.original.Write(entry, fields); err != nil {
|
|
return err
|
|
}
|
|
|
|
buffer, err := c.encoder.EncodeEntry(entry, fields)
|
|
defer buffer.Free()
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return c.loki.Send(buffer.String(), entry.Time)
|
|
}
|
|
|
|
func (c *LokiCore) Check(entry zapcore.Entry, checked *zapcore.CheckedEntry) *zapcore.CheckedEntry {
|
|
if c.Enabled(entry.Level) {
|
|
return checked.AddCore(entry, c)
|
|
}
|
|
return checked
|
|
}
|
|
|
|
func (c *LokiCore) Sync() error {
|
|
return c.original.Sync()
|
|
}
|
|
|
|
func (c *LokiCore) Enabled(level zapcore.Level) bool {
|
|
return c.original.Enabled(level)
|
|
}
|