Update enrichment to handle existing attributes #245
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
Traditional APM event ingestion utilized enrichment from the apm-data lib. With the introduction of the
receiver/elasticapmintakecomponent (which is using apm-data internally) it is possible for a collector to have a pipeline such as:receiver/elasticapmintake->processor/elasticapm.The
processor/elasticapmand theopentelemetry-libshould account for this by not overriding any pre-existing elastic attributes. This will preserve the existing values and avoid any unintended changes to elastic attributesThis is a follow up to #237
Changes
attribute.IsEmptyhelper function which checks if an attribute exists or is empty. I opted to use this approach since in some it allows the logic to exit early when the attribute exists. The downside is that it adds a lot more if statements everywhere.Attributes().PutStrbut this would require the enrichment logic to always attempt to derive the new value which would be a little less efficient.transaction.typerequired special consideration since the library itself can set thetransaction.typeisElasticTransactionto checkprocessor.event. This avoids having to derive if a span is an elastic transaction when it is already explicitly considered a transactions. It also avoids reclassifying a span to a transaction or a transaction to a span.