func()

in processor/datadogsemanticsprocessor/processor.go [33:116]


func (tp *tracesProcessor) processTraces(ctx context.Context, td ptrace.Traces) (output ptrace.Traces, err error) {
	rspans := td.ResourceSpans()
	for i := 0; i < rspans.Len(); i++ {
		rspan := rspans.At(i)
		otelres := rspan.Resource()
		rattr := otelres.Attributes()
		for j := 0; j < rspan.ScopeSpans().Len(); j++ {
			libspans := rspan.ScopeSpans().At(j)
			for k := 0; k < libspans.Spans().Len(); k++ {
				otelspan := libspans.Spans().At(k)
				sattr := otelspan.Attributes()
				if tp.overrideIncomingDatadogFields {
					sattr.RemoveIf(func(k string, _ pcommon.Value) bool {
						return strings.HasPrefix(k, "datadog.")
					})
					if ddHostname, ok := rattr.Get("datadog.host.name"); ok && ddHostname.AsString() == "" {
						rattr.Remove("datadog.host.name")
					}
				}
				if err = insertAttrIfMissing(sattr, "datadog.service", traceutil.GetOTelService(otelres, true)); err != nil {
					return ptrace.Traces{}, err
				}
				if err = insertAttrIfMissing(sattr, "datadog.name", traceutil.GetOTelOperationNameV2(otelspan)); err != nil {
					return ptrace.Traces{}, err
				}
				if err = insertAttrIfMissing(sattr, "datadog.resource", traceutil.GetOTelResourceV2(otelspan, otelres)); err != nil {
					return ptrace.Traces{}, err
				}
				if err = insertAttrIfMissing(sattr, "datadog.type", traceutil.GetOTelSpanType(otelspan, otelres)); err != nil {
					return ptrace.Traces{}, err
				}
				if src, ok := tp.attrsTranslator.ResourceToSource(ctx, otelres, traceutil.SignalTypeSet, nil); ok && src.Kind == source.HostnameKind {
					if err = insertAttrIfMissing(otelres.Attributes(), "datadog.host.name", src.Identifier); err != nil {
						return ptrace.Traces{}, err
					}
				}

				spanKind := otelspan.Kind()
				if err = insertAttrIfMissing(sattr, "datadog.span.kind", traceutil.OTelSpanKindName(spanKind)); err != nil {
					return ptrace.Traces{}, err
				}
				if env := traceutil.GetOTelEnv(otelres); env != "" {
					if err = insertAttrIfMissing(sattr, "datadog.env", env); err != nil {
						return ptrace.Traces{}, err
					}
				}
				if serviceVersion, ok := otelres.Attributes().Get(semconv.AttributeServiceVersion); ok {
					if err = insertAttrIfMissing(sattr, "datadog.version", serviceVersion.AsString()); err != nil {
						return ptrace.Traces{}, err
					}
				}

				metaMap := make(map[string]string)
				code := traceutil.GetOTelStatusCode(otelspan)
				if code != 0 {
					if err = insertAttrIfMissing(sattr, "datadog.http_status_code", fmt.Sprintf("%d", code)); err != nil {
						return ptrace.Traces{}, err
					}
				}
				ddError := int64(status2Error(otelspan.Status(), otelspan.Events(), metaMap))
				if err = insertAttrIfMissing(sattr, "datadog.error", ddError); err != nil {
					return ptrace.Traces{}, err
				}
				if metaMap["error.msg"] != "" {
					if err = insertAttrIfMissing(sattr, "datadog.error.msg", metaMap["error.msg"]); err != nil {
						return ptrace.Traces{}, err
					}
				}
				if metaMap["error.type"] != "" {
					if err = insertAttrIfMissing(sattr, "datadog.error.type", metaMap["error.type"]); err != nil {
						return ptrace.Traces{}, err
					}
				}
				if metaMap["error.stack"] != "" {
					if err = insertAttrIfMissing(sattr, "datadog.error.stack", metaMap["error.stack"]); err != nil {
						return ptrace.Traces{}, err
					}
				}
			}
		}
	}

	return td, err
}