opentelemetry-collector/service/internal/obsconsumer/logs.go

79 lines
1.9 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package obsconsumer // import "go.opentelemetry.io/collector/service/internal/obsconsumer"
import (
"context"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumererror"
"go.opentelemetry.io/collector/internal/telemetry"
"go.opentelemetry.io/collector/pdata/plog"
)
var (
_ consumer.Logs = obsLogs{}
logsMarshaler = &plog.ProtoMarshaler{}
)
func NewLogs(cons consumer.Logs, itemCounter, sizeCounter metric.Int64Counter, opts ...Option) consumer.Logs {
if !telemetry.NewPipelineTelemetryGate.IsEnabled() {
return cons
}
o := options{}
for _, opt := range opts {
opt(&o)
}
return obsLogs{
consumer: cons,
itemCounter: itemCounter,
sizeCounter: sizeCounter,
compiledOptions: o.compile(),
}
}
type obsLogs struct {
consumer consumer.Logs
itemCounter metric.Int64Counter
sizeCounter metric.Int64Counter
compiledOptions
}
// ConsumeLogs measures telemetry before calling ConsumeLogs because the data may be mutated downstream
func (c obsLogs) ConsumeLogs(ctx context.Context, ld plog.Logs) error {
// Use a pointer to so that deferred function can depend on the result of ConsumeLogs
attrs := &c.withSuccessAttrs
itemCount := ld.LogRecordCount()
defer func() {
c.itemCounter.Add(ctx, int64(itemCount), *attrs)
}()
if isEnabled(ctx, c.sizeCounter) {
byteCount := int64(logsMarshaler.LogsSize(ld))
defer func() {
c.sizeCounter.Add(ctx, byteCount, *attrs)
}()
}
err := c.consumer.ConsumeLogs(ctx, ld)
if err != nil {
if consumererror.IsDownstream(err) {
attrs = &c.withRefusedAttrs
} else {
attrs = &c.withFailureAttrs
err = consumererror.NewDownstream(err)
}
}
return err
}
func (c obsLogs) Capabilities() consumer.Capabilities {
return c.consumer.Capabilities()
}