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

Add new attribute mappings #139

Merged
merged 4 commits into from
Sep 12, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 25 additions & 10 deletions input/otlp/traces.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ const (
attributeNetworkMNC = "net.host.carrier.mnc"
attributeNetworkCarrierName = "net.host.carrier.name"
attributeNetworkICC = "net.host.carrier.icc"
attributeHttpRequestMethod = "http.request.method"
attributeHttpResponseStatusCode = "http.response.status_code"
attributeServerAddress = "server.address"
attributeServerPort = "server.port"
attributeUrlFull = "url.full"
attributeUserAgentOriginal = "user_agent.original"
)

// ConsumeTraces consumes OpenTelemetry trace data,
Expand Down Expand Up @@ -257,11 +263,11 @@ func TranslateTransaction(
setLabel(k, event, ifaceAttributeValue(v))
case pcommon.ValueTypeInt:
switch kDots {
case semconv.AttributeHTTPStatusCode:
case semconv.AttributeHTTPStatusCode, attributeHttpResponseStatusCode:
isHTTP = true
httpResponse.StatusCode = uint32(v.Int())
http.Response = &httpResponse
case semconv.AttributeNetPeerPort:
case semconv.AttributeNetPeerPort, attributeServerPort:
stevejgordon marked this conversation as resolved.
Show resolved Hide resolved
event.Source = populateNil(event.Source)
event.Source.Port = uint32(v.Int())
case semconv.AttributeNetHostPort:
Expand All @@ -277,11 +283,11 @@ func TranslateTransaction(
stringval := truncate(v.Str())
switch kDots {
// http.*
case semconv.AttributeHTTPMethod:
case semconv.AttributeHTTPMethod, attributeHttpRequestMethod:
isHTTP = true
httpRequest.Method = stringval
http.Request = &httpRequest
case semconv.AttributeHTTPURL, semconv.AttributeHTTPTarget, "http.path":
case semconv.AttributeHTTPURL, semconv.AttributeHTTPTarget, "http.path", attributeUrlFull:
stevejgordon marked this conversation as resolved.
Show resolved Hide resolved
isHTTP = true
httpURL = stringval
case semconv.AttributeHTTPHost:
Expand All @@ -290,7 +296,7 @@ func TranslateTransaction(
case semconv.AttributeHTTPScheme:
isHTTP = true
httpScheme = stringval
case semconv.AttributeHTTPStatusCode:
case semconv.AttributeHTTPStatusCode, attributeHttpResponseStatusCode:
if intv, err := strconv.Atoi(stringval); err == nil {
isHTTP = true
httpResponse.StatusCode = uint32(intv)
Expand All @@ -315,7 +321,7 @@ func TranslateTransaction(
event.Client = populateNil(event.Client)
event.Client.Ip = ip
}
case semconv.AttributeHTTPUserAgent:
case semconv.AttributeHTTPUserAgent, attributeUserAgentOriginal:
event.UserAgent = populateNil(event.UserAgent)
event.UserAgent.Original = stringval

Expand All @@ -325,7 +331,7 @@ func TranslateTransaction(
if ip, err := modelpb.ParseIP(stringval); err == nil {
event.Source.Ip = ip
}
case semconv.AttributeNetPeerName:
case semconv.AttributeNetPeerName, attributeServerAddress:
stevejgordon marked this conversation as resolved.
Show resolved Hide resolved
event.Source = populateNil(event.Source)
event.Source.Domain = stringval
case semconv.AttributeNetHostName:
Expand Down Expand Up @@ -533,11 +539,11 @@ func TranslateSpan(spanKind ptrace.SpanKind, attributes pcommon.Map, event *mode
setLabel(k, event, v.Double())
case pcommon.ValueTypeInt:
switch kDots {
case "http.status_code":
case "http.status_code", attributeHttpResponseStatusCode:
httpResponse.StatusCode = uint32(v.Int())
http.Response = &httpResponse
isHTTP = true
case semconv.AttributeNetPeerPort, "peer.port":
case semconv.AttributeNetPeerPort, "peer.port", attributeServerPort:
netPeerPort = int(v.Int())
case semconv.AttributeRPCGRPCStatusCode:
rpcSystem = "grpc"
Expand All @@ -562,7 +568,7 @@ func TranslateSpan(spanKind ptrace.SpanKind, attributes pcommon.Map, event *mode
case semconv.AttributeHTTPURL:
httpURL = stringval
isHTTP = true
case semconv.AttributeHTTPMethod:
case semconv.AttributeHTTPMethod, attributeHttpRequestMethod:
httpRequest.Method = stringval
http.Request = &httpRequest
isHTTP = true
Expand Down Expand Up @@ -619,6 +625,10 @@ func TranslateSpan(spanKind ptrace.SpanKind, attributes pcommon.Map, event *mode
event.Network.Carrier = populateNil(event.Network.Carrier)
event.Network.Carrier.Icc = stringval

// server.*
case attributeServerAddress:
netPeerName = stringval

// session.*
case "session.id":
event.Session = populateNil(event.Session)
Expand Down Expand Up @@ -651,6 +661,11 @@ func TranslateSpan(spanKind ptrace.SpanKind, attributes pcommon.Map, event *mode
isRPC = true
case semconv.AttributeRPCMethod:

// url.*
case attributeUrlFull:
httpURL = stringval
isHTTP = true

// miscellaneous
case "span.kind": // filter out
case semconv.AttributePeerService:
Expand Down
69 changes: 63 additions & 6 deletions input/otlp/traces_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,19 @@ func TestHTTPTransactionURL(t *testing.T) {
"http.target": "/foo",
})
})
t.Run("url.full", func(t *testing.T) {
test(t, &modelpb.URL{
Scheme: "https",
Original: "https://testing.invalid:80/foo?bar",
Full: "https://testing.invalid:80/foo?bar",
Path: "/foo",
Query: "bar",
Domain: "testing.invalid",
Port: 80,
}, map[string]interface{}{
"url.full": "https://testing.invalid:80/foo?bar",
})
})
}

func TestHTTPSpanURL(t *testing.T) {
Expand Down Expand Up @@ -416,10 +429,23 @@ func TestHTTPTransactionFlavor(t *testing.T) {
}

func TestHTTPTransactionUserAgent(t *testing.T) {
event := transformTransactionWithAttributes(t, map[string]interface{}{
"http.user_agent": "Foo/bar (baz)",
test := func(t *testing.T, attrs map[string]interface{}) {
t.Helper()
event := transformTransactionWithAttributes(t, attrs)
assert.Equal(t, &modelpb.UserAgent{Original: "Foo/bar (baz)"}, event.UserAgent)
}

t.Run("http.user_agent", func(t *testing.T) {
test(t, map[string]interface{}{
"http.user_agent": "Foo/bar (baz)",
})
})

t.Run("user_agent.original", func(t *testing.T) {
test(t, map[string]interface{}{
"user_agent.original": "Foo/bar (baz)",
})
})
assert.Equal(t, &modelpb.UserAgent{Original: "Foo/bar (baz)"}, event.UserAgent)
}

func TestHTTPTransactionClientIP(t *testing.T) {
Expand All @@ -435,10 +461,23 @@ func TestHTTPTransactionClientIP(t *testing.T) {
}

func TestHTTPTransactionStatusCode(t *testing.T) {
event := transformTransactionWithAttributes(t, map[string]interface{}{
"http.status_code": 200,
test := func(t *testing.T, expected uint32, attrs map[string]interface{}) {
t.Helper()
event := transformSpanWithAttributes(t, attrs)
assert.Equal(t, expected, event.Http.Response.StatusCode)
}

t.Run("http.status_code", func(t *testing.T) {
test(t, 200, map[string]interface{}{
"http.status_code": 200,
})
})

t.Run("http.response.status_code", func(t *testing.T) {
test(t, 200, map[string]interface{}{
"http.response.status_code": 200,
})
})
assert.Equal(t, uint32(200), event.Http.Response.StatusCode)
}

func TestDatabaseSpan(t *testing.T) {
Expand Down Expand Up @@ -485,6 +524,24 @@ func TestDatabaseSpan(t *testing.T) {
}, event.Span.DestinationService, protocmp.Transform()))
}

func TestDatabaseSpanWithServerAttributes(t *testing.T) {
event := transformSpanWithAttributes(t, map[string]interface{}{
"db.system": "mysql",
"db.name": "ShopDb",
"server.address": "shopdb.example.com",
"server.port": 3306,
})

assert.Equal(t, "db", event.Span.Type)
assert.Equal(t, "mysql", event.Span.Subtype)
assert.Equal(t, "", event.Span.Action)

assert.Equal(t, &modelpb.Destination{
Address: "shopdb.example.com",
Port: 3306,
}, event.Destination)
}

func TestInstrumentationLibrary(t *testing.T) {
traces, spans := newTracesSpans()
spans.Scope().SetName("library-name")
Expand Down