1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-01-24 03:47:19 +02:00
2024-04-11 09:18:42 +02:00

73 lines
1.5 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package stdoutlog // import "go.opentelemetry.io/otel/exporters/stdout/stdoutlog"
import (
"context"
"encoding/json"
"sync/atomic"
"go.opentelemetry.io/otel/sdk/log"
)
var _ log.Exporter = &Exporter{}
// Exporter writes JSON-encoded log records to an [io.Writer] ([os.Stdout] by default).
// Exporter must be created with [New].
type Exporter struct {
encoder atomic.Pointer[json.Encoder]
timestamps bool
}
// New creates an [Exporter].
func New(options ...Option) (*Exporter, error) {
cfg := newConfig(options)
enc := json.NewEncoder(cfg.Writer)
if cfg.PrettyPrint {
enc.SetIndent("", "\t")
}
e := Exporter{
timestamps: cfg.Timestamps,
}
e.encoder.Store(enc)
return &e, nil
}
// Export exports log records to writer.
func (e *Exporter) Export(ctx context.Context, records []log.Record) error {
enc := e.encoder.Load()
if enc == nil {
return nil
}
for _, record := range records {
// Honor context cancellation.
if err := ctx.Err(); err != nil {
return err
}
// Encode record, one by one.
recordJSON := e.newRecordJSON(record)
if err := enc.Encode(recordJSON); err != nil {
return err
}
}
return nil
}
// Shutdown shuts down the Exporter.
// Calls to Export will perform no operation after this is called.
func (e *Exporter) Shutdown(context.Context) error {
e.encoder.Store(nil)
return nil
}
// ForceFlush performs no action.
func (e *Exporter) ForceFlush(context.Context) error {
return nil
}