translator/translate/otel/pipeline/applicationsignals/translator.go (74 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package applicationsignals
import (
"fmt"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/pipeline"
"github.com/aws/amazon-cloudwatch-agent/translator/context"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/common"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/exporter/awsemf"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/exporter/awsxray"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/exporter/debug"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/extension/agenthealth"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/extension/awsproxy"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/extension/k8smetadata"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/processor/awsapplicationsignals"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/processor/awsentity"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/processor/metricstransformprocessor"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/processor/resourcedetection"
"github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/receiver/otlp"
"github.com/aws/amazon-cloudwatch-agent/translator/util/ecsutil"
)
type translator struct {
signal pipeline.Signal
}
var _ common.PipelineTranslator = (*translator)(nil)
func NewTranslator(signal pipeline.Signal) common.PipelineTranslator {
return &translator{
signal,
}
}
func (t *translator) ID() pipeline.ID {
return pipeline.NewIDWithName(t.signal, common.AppSignals)
}
func (t *translator) Translate(conf *confmap.Conf) (*common.ComponentTranslators, error) {
configKey, ok := common.AppSignalsConfigKeys[t.signal]
if !ok {
return nil, fmt.Errorf("no config key defined for signal: %s", t.signal)
}
if conf == nil || (!conf.IsSet(configKey[0]) && !conf.IsSet(configKey[1])) {
return nil, &common.MissingKeyError{ID: t.ID(), JsonKey: configKey[0]}
}
translators := &common.ComponentTranslators{
Receivers: common.NewTranslatorMap(otlp.NewTranslator(common.WithName(common.AppSignals), otlp.WithSignal(t.signal))),
Processors: common.NewTranslatorMap[component.Config, component.ID](),
Exporters: common.NewTranslatorMap[component.Config, component.ID](),
Extensions: common.NewTranslatorMap[component.Config, component.ID](),
}
if t.signal == pipeline.SignalMetrics {
translators.Processors.Set(metricstransformprocessor.NewTranslatorWithName(common.AppSignals))
}
translators.Processors.Set(resourcedetection.NewTranslator(resourcedetection.WithSignal(t.signal)))
translators.Processors.Set(awsapplicationsignals.NewTranslator(awsapplicationsignals.WithSignal(t.signal)))
// ECS is not in scope for entity association, so we only add the entity processor in non-ECS platforms
isECS := ecsutil.GetECSUtilSingleton().IsECS()
if t.signal == pipeline.SignalMetrics && !isECS {
translators.Processors.Set(awsentity.NewTranslatorWithEntityType(awsentity.Service, common.AppSignals, false))
if context.CurrentContext().KubernetesMode() != "" {
translators.Extensions.Set(k8smetadata.NewTranslator())
}
}
if enabled, _ := common.GetBool(conf, common.AgentDebugConfigKey); enabled {
translators.Exporters.Set(debug.NewTranslator(common.WithName(common.AppSignals)))
}
if t.signal == pipeline.SignalTraces {
translators.Exporters.Set(awsxray.NewTranslatorWithName(common.AppSignals))
translators.Extensions.Set(awsproxy.NewTranslatorWithName(common.AppSignals))
translators.Extensions.Set(agenthealth.NewTranslator(agenthealth.TracesName, []string{agenthealth.OperationPutTraceSegments}))
translators.Extensions.Set(agenthealth.NewTranslatorWithStatusCode(agenthealth.StatusCodeName, nil, true))
} else {
translators.Exporters.Set(awsemf.NewTranslatorWithName(common.AppSignals))
translators.Extensions.Set(agenthealth.NewTranslator(agenthealth.LogsName, []string{agenthealth.OperationPutLogEvents}))
translators.Extensions.Set(agenthealth.NewTranslatorWithStatusCode(agenthealth.StatusCodeName, nil, true))
}
return translators, nil
}