generated from newrelic/developer-toolkit-template-go
/
logs.go
50 lines (44 loc) · 1.7 KB
/
logs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Copyright New Relic Corporation. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package apmconnector // import "github.com/newrelic/opentelemetry-collector-components/connector/apmconnector"
import (
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.uber.org/zap"
)
func BuildTransactions(logger *zap.Logger, td ptrace.Traces) plog.Logs {
logs := plog.NewLogs()
for i := 0; i < td.ResourceSpans().Len(); i++ {
resourceLogs := logs.ResourceLogs().AppendEmpty()
rs := td.ResourceSpans().At(i)
if !ShouldProcess(logger, rs.Resource()) {
continue
}
rs.Resource().CopyTo(resourceLogs.Resource())
for j := 0; j < rs.ScopeSpans().Len(); j++ {
scopeSpan := rs.ScopeSpans().At(j)
scopeLog := resourceLogs.ScopeLogs().AppendEmpty()
for k := 0; k < scopeSpan.Spans().Len(); k++ {
span := scopeSpan.Spans().At(k)
if span.Kind() != ptrace.SpanKindServer {
continue
}
log := scopeLog.LogRecords().AppendEmpty()
buildTransaction(log, span)
}
}
}
return logs
}
func buildTransaction(lr plog.LogRecord, span ptrace.Span) {
lr.Attributes().PutStr("event.domain", "newrelic.otel_collector")
lr.Attributes().PutStr("event.name", "Transaction")
transactionName, transactionType := GetTransactionMetricName(span)
lr.Attributes().PutStr("transactionType", transactionType.AsString())
lr.Attributes().PutStr("name", transactionName)
lr.Attributes().PutStr("trace.id", span.TraceID().String())
duration := float64((span.EndTimestamp() - span.StartTimestamp()).AsTime().UnixNano()) / 1e9
lr.Attributes().PutDouble("duration", duration)
err := span.Status().Code() == ptrace.StatusCodeError
lr.Attributes().PutBool("error", err)
}