tracer

package module
v1.30.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 29, 2022 License: MIT Imports: 18 Imported by: 6

README

Tracer - logging service

Пример логирования в проекте

package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"net/http"

	"gitlab.com/tehidev/tracer"
)

func main() {
	// Создаём контекст приложения
	ctx := context.Background()

	// Инициализируем трейсер
	ringBufferSize := 1024 * 1024 * 5 // 5 MB
	exporterSecret := ""
	tracing := logger.New().
		WithStdout(true /* colored */).
		WithExporter(ringBufferSize, exporterSecret).
		WithFile("app.log", &logger.FileRotationConfig{
			MaxSizeMB:  50,
			MaxAgeDays: 200,
		})

	// Начинаем трассировку
	appCtx, span := tracing.Start(ctx, "main")
	// В конце выполнения программы заканчиваем трассировку
	defer span.Finish()

	// Просто лог о начале запуска
	span.Info().Msg("app started")

	// Создаём http роутер
	mux := http.NewServeMux()

	// Прописываем ручку экспорта логов по URL /logs
	mux.Handle("/logs", tracing.Handler())

	// Тестовая ручка с логированием
	mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
		// Начинаем трассировку на основе контекста реквеста
		ctx, span := logger.Start(r.Context(), "http.request")
		// В конце выполнения функции заканчиваем трассировку
		defer span.Finish()

		// Пробрасываем поле во все ветки логов
		span.Forward(span.With().
			Str("request_remote_addr", r.RemoteAddr),
		)

		span.Trace().
			Str("uri", r.RequestURI).
			Msg("request info")

		if r.Body != nil {
			if body, err := ioutil.ReadAll(r.Body); err != nil {
				span.Trace().Bytes("body", body).Msg("request body")
			}
			defer r.Body.Close()
		}

		doResponse(ctx, w)
	})

	span.Info().Msg("  follow http://localhost:5050/hello")
	span.Info().Msg("see logs http://localhost:5050/logs")

	http.ListenAndServe(":5050", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Прокидываем контекст трассировки приложения в контекст каждого реквеста
		r = r.WithContext(
			logger.WithContext(r.Context(), appCtx),
		)
		mux.ServeHTTP(w, r)
	}))
}

func doResponse(ctx context.Context, w http.ResponseWriter) {
	// Начинаем трассировку на основе переданного контекста
	span := logger.StartSpan(ctx, "doResponse")
	// В конце выполнения функции заканчиваем трассировку
	defer span.Finish()

	span.Debug().Msg("begin")

	w.WriteHeader(http.StatusOK)
	fmt.Fprint(w, "hello!")
}

Ошибки со стеком

Используйте создание или оборачивание ошибок через gitlab.com/tehidev/tracer/errors

  • New
  • Newf
  • Stack
  • Is

Documentation

Index

Constants

View Source
const ExporterSecretHeader = "X-Exporter-Secret"

Variables

View Source
var (
	FieldTimeFormat      = time.RFC3339Nano
	FieldDurationUnit    = time.Second
	FieldDurationInteger = false
)
View Source
var DefaultLogger = zerolog.New(os.Stdout).
	Level(zerolog.TraceLevel).
	With().Timestamp().Caller().
	Logger()
View Source
var LoggerErrorHandler func(error) = func(error) {}

Functions

func Check

func Check(ctx context.Context) bool

func WithContext

func WithContext(ctx, spanCtx context.Context) context.Context

Types

type Config

type Config struct {
	Filename string `yaml:"filename"`

	Stdout bool `yaml:"stdout"`

	Exporter        bool   `yaml:"exporter"`
	ExporterSecret  string `yaml:"exporter_secret"`
	ExporterMaxSize int    `yaml:"exporter_max_size"`

	Rotation *FileRotationConfig `yaml:"rotation"`
}

type Context

type Context = zerolog.Context

type Event

type Event = zerolog.Event

type Field

type Field = string
const (
	FieldID      Field = "_id"
	FieldService Field = "_service"

	FieldBranch   Field = "_branch"
	FieldParent   Field = "_parent"
	FieldSpan     Field = "_span"
	FieldDuration Field = "_duration"

	FieldLevel      Field = "_level"
	FieldMessage    Field = "_message"
	FieldError      Field = "_error"
	FieldErrorStack Field = "_stack"
	FieldFile       Field = "_file"
	FieldTime       Field = "_time"
)

type FileRotationConfig

type FileRotationConfig struct {
	MaxSizeMB  int  `yaml:"max_size_mb"`  // max size of active log file in MB
	MaxAgeDays int  `yaml:"max_age_days"` // max age days of backups files
	MaxBackups int  `yaml:"max_backups"`  // max backups count
	Compress   bool `yaml:"compress"`     // compress backups files
}

type Level

type Level = string
const (
	LevelTrace Level = "trace"
	LevelDebug Level = "debug"
	LevelInfo  Level = "info"
	LevelWarn  Level = "warn"
	LevelError Level = "error"
	LevelPanic Level = "panic"
	LevelFatal Level = "fatal"
)

type Logger

type Logger = zerolog.Logger

type Span

type Span interface {
	SpanLogger
	Finish()
}

func Start

func Start(ctx context.Context, spanName string) (context.Context, Span)

func StartSpan

func StartSpan(ctx context.Context, spanName string) Span

type SpanContext

type SpanContext interface {
	Span
	context.Context
}

func FromContext

func FromContext(ctx context.Context) SpanContext

func StartSpanContext

func StartSpanContext(ctx context.Context, spanName string) SpanContext

type SpanLogger

type SpanLogger interface {
	Trace() *Event
	Debug() *Event
	Info() *Event
	Warn() *Event
	Error(error) *Event
	Panic() *Event
	Fatal() *Event

	Forward(Context)
	With() Context
	WithTrace() Context
}

type Tracer

type Tracer struct {
	// contains filtered or unexported fields
}

func New

func New() *Tracer

func (*Tracer) Handler

func (t *Tracer) Handler() http.Handler

func (*Tracer) Start

func (t *Tracer) Start(ctx context.Context, span string) (context.Context, Span)

func (*Tracer) WithConfig

func (t *Tracer) WithConfig(conf Config) *Tracer

func (*Tracer) WithExporter

func (t *Tracer) WithExporter(maxSize int, secret string) *Tracer

func (*Tracer) WithFile

func (t *Tracer) WithFile(filename string, conf *FileRotationConfig) *Tracer

func (*Tracer) WithStdout

func (t *Tracer) WithStdout(colored bool) *Tracer

func (*Tracer) WithWriter

func (t *Tracer) WithWriter(w io.Writer) *Tracer

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL