Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added mapping of experimental Otel telemetry.distro.name and version attributes #203

Merged
merged 7 commits into from
Mar 12, 2024
Merged
30 changes: 26 additions & 4 deletions input/otlp/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,9 @@ func translateResourceMetadata(resource pcommon.Resource, out *modelpb.APMEvent)
// devices. APM server should drop this field.
case "telemetry.sdk.elastic_export_timestamp":
// Do nothing.
case "telemetry.distro.name":
case "telemetry.distro.version":
//distro version & name are handled below and should not end up as labels

default:
if out.Labels == nil {
Expand Down Expand Up @@ -374,12 +377,31 @@ func translateResourceMetadata(resource pcommon.Resource, out *modelpb.APMEvent)
// agent.version is a required field.
out.Agent.Version = "unknown"
}
if out.GetService().GetLanguage().GetName() != "" {
if out.Agent == nil {
out.Agent = modelpb.AgentFromVTPool()
kruskall marked this conversation as resolved.
Show resolved Hide resolved

distroName, distroNameSet := resource.Attributes().Get("telemetry.distro.name")
distroVersion, distroVersionSet := resource.Attributes().Get("telemetry.distro.version")

if distroNameSet && distroName.Str() != "" {
agentLang := "unknown"
if out.GetService().GetLanguage().GetName() != "" {
agentLang = out.GetService().GetLanguage().GetName()
}

out.Agent.Name = fmt.Sprintf("%s/%s/%s", out.Agent.Name, agentLang, distroName.Str())

//we intentionally do not want to fallback to the Otel SDK version if we have a distro name, this would only cause confusion
out.Agent.Version = "unknown"
JonasKunz marked this conversation as resolved.
Show resolved Hide resolved
if distroVersionSet && distroVersion.Str() != "" {
out.Agent.Version = distroVersion.Str()
}
out.Agent.Name = fmt.Sprintf("%s/%s", out.Agent.Name, out.Service.Language.Name)
} else {
//distro is not set, use just the language as suffix if present
if out.GetService().GetLanguage().GetName() != "" {
out.Agent.Name = fmt.Sprintf("%s/%s", out.Agent.Name, out.GetService().GetLanguage().GetName())
}
}

if out.GetService().GetLanguage().GetName() == "" {
if out.Service == nil {
out.Service = modelpb.ServiceFromVTPool()
}
Expand Down
46 changes: 46 additions & 0 deletions input/otlp/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,52 @@ func TestResourceConventions(t *testing.T) {
},
},
},
"agent_distro": {
attrs: map[string]interface{}{
"telemetry.sdk.name": "sdk_name",
"telemetry.sdk.version": "sdk_version",
"telemetry.sdk.language": "language_name",
"telemetry.distro.name": "distro_name",
"telemetry.distro.version": "distro_version",
},
expected: &modelpb.APMEvent{
Agent: &modelpb.Agent{Name: "sdk_name/language_name/distro_name", Version: "distro_version"},
Service: &modelpb.Service{
Name: "unknown",
Language: &modelpb.Language{Name: "language_name"},
},
},
},
"agent_distro_no_language": {
attrs: map[string]interface{}{
"telemetry.sdk.name": "sdk_name",
"telemetry.sdk.version": "sdk_version",
"telemetry.distro.name": "distro_name",
"telemetry.distro.version": "distro_version",
},
expected: &modelpb.APMEvent{
Agent: &modelpb.Agent{Name: "sdk_name/unknown/distro_name", Version: "distro_version"},
Service: &modelpb.Service{
Name: "unknown",
Language: &modelpb.Language{Name: "unknown"},
},
},
},
"agent_distro_no_version": {
attrs: map[string]interface{}{
"telemetry.sdk.name": "sdk_name",
"telemetry.sdk.version": "sdk_version",
"telemetry.sdk.language": "language_name",
"telemetry.distro.name": "distro_name",
},
expected: &modelpb.APMEvent{
Agent: &modelpb.Agent{Name: "sdk_name/language_name/distro_name", Version: "unknown"},
Service: &modelpb.Service{
Name: "unknown",
Language: &modelpb.Language{Name: "language_name"},
},
},
},
"runtime": {
attrs: map[string]interface{}{
"process.runtime.name": "runtime_name",
Expand Down
Loading