79 lines
1.9 KiB
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()
|
|
}
|