mirror of
https://github.com/hanzoai/telemetry.git
synced 2026-10-30 20:01:49 +00:00
88 lines
2.3 KiB
Go
88 lines
2.3 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.uber.org/zap"
|
|
|
|
"go.opentelemetry.io/collector/consumer"
|
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
|
"go.opentelemetry.io/collector/consumer/xconsumer"
|
|
"go.opentelemetry.io/collector/internal/telemetry"
|
|
"go.opentelemetry.io/collector/pdata/pprofile"
|
|
"go.opentelemetry.io/collector/service/internal/metadata"
|
|
)
|
|
|
|
var (
|
|
_ xconsumer.Profiles = obsProfiles{}
|
|
profilesMarshaler = pprofile.ProtoMarshaler{}
|
|
)
|
|
|
|
func NewProfiles(cons xconsumer.Profiles, set Settings, opts ...Option) xconsumer.Profiles {
|
|
if !metadata.TelemetryNewPipelineTelemetryFeatureGate.IsEnabled() {
|
|
return cons
|
|
}
|
|
|
|
o := options{}
|
|
for _, opt := range opts {
|
|
opt(&o)
|
|
}
|
|
|
|
consumerSet := Settings{
|
|
ItemCounter: set.ItemCounter,
|
|
SizeCounter: set.SizeCounter,
|
|
Logger: set.Logger.With(telemetry.ToZapFields(o.staticDataPointAttributes)...),
|
|
}
|
|
|
|
return obsProfiles{
|
|
consumer: cons,
|
|
set: consumerSet,
|
|
compiledOptions: o.compile(),
|
|
}
|
|
}
|
|
|
|
type obsProfiles struct {
|
|
consumer xconsumer.Profiles
|
|
set Settings
|
|
compiledOptions
|
|
}
|
|
|
|
// ConsumeProfiles measures telemetry before calling ConsumeProfiles because the data may be mutated downstream
|
|
func (c obsProfiles) ConsumeProfiles(ctx context.Context, pd pprofile.Profiles) error {
|
|
// Measure before calling ConsumeProfiles because the data may be mutated downstream
|
|
attrs := &c.withSuccessAttrs
|
|
|
|
itemCount := pd.SampleCount()
|
|
defer func() {
|
|
c.set.ItemCounter.Add(ctx, int64(itemCount), *attrs)
|
|
}()
|
|
|
|
if isEnabled(ctx, c.set.SizeCounter) {
|
|
byteCount := int64(profilesMarshaler.ProfilesSize(pd))
|
|
defer func() {
|
|
c.set.SizeCounter.Add(ctx, byteCount, *attrs)
|
|
}()
|
|
}
|
|
|
|
err := c.consumer.ConsumeProfiles(ctx, pd)
|
|
if err != nil {
|
|
if consumererror.IsDownstream(err) {
|
|
attrs = &c.withRefusedAttrs
|
|
} else {
|
|
attrs = &c.withFailureAttrs
|
|
err = consumererror.NewDownstream(err)
|
|
}
|
|
if c.set.Logger.Core().Enabled(zap.DebugLevel) {
|
|
c.set.Logger.Debug("Profiles pipeline component had an error", zap.Error(err), zap.Int("item count", itemCount))
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (c obsProfiles) Capabilities() consumer.Capabilities {
|
|
return c.consumer.Capabilities()
|
|
}
|