diff --git a/.chloggen/main.yaml b/.chloggen/main.yaml new file mode 100644 index 0000000000000..f2c7c2b416747 --- /dev/null +++ b/.chloggen/main.yaml @@ -0,0 +1,27 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. receiver/filelog) +component: extension/encoding + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Add most of the AWS ELB fields to the AWSLogsEncoding. + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [43757] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [] diff --git a/extension/encoding/awslogsencodingextension/README.md b/extension/encoding/awslogsencodingextension/README.md index 60cd1b9512de9..eef8b7d7e3cbe 100644 --- a/extension/encoding/awslogsencodingextension/README.md +++ b/extension/encoding/awslogsencodingextension/README.md @@ -362,38 +362,42 @@ ELB access log record fields are mapped this way in the resulting OpenTelemetry > AWS Fields are according to [documentation](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html). -| **AWS Field** | **OpenTelemetry Field(s)** | -|------------------------------|----------------------------------------------------------------------| -| type | `network.protocol.name` | -| time | Log timestamp | -| elb | `cloud.resource_id` | -| client:port | `client.address`, `client.port` | -| received_bytes | `http.request.size` | -| sent_bytes | `http.response.size` | -| "request" | `url.full`, `http.request.method`, `network.protocol.version` | -| ssl_cipher | `tls.cipher` | -| ssl_protocol | `tls.protocol.version` | -| elb_status_code | `aws.elb.status.code` | -| user_agent | `user_agent.original` | -| domain_name | `url.domain` | -| target:port | _Currently not supported_ | -| request_processing_time | _Currently not supported_ | -| target_processing_time | _Currently not supported_ | -| response_processing_time | _Currently not supported_ | -| target_status_code | _Currently not supported_ | -| target_group_arn | _Currently not supported_ | -| "trace_id" | _Currently not supported_ | -| "chosen_cert_arn" | _Currently not supported_ | -| matched_rule_priority | _Currently not supported_ | -| request_creation_time | _Currently not supported_ | -| "actions_executed" | _Currently not supported_ | -| "redirect_url" | _Currently not supported_ | -| "error_reason" | _Currently not supported_ | -| "target:port_list" | _Currently not supported_ | -| "target_status_code_list" | _Currently not supported_ | -| "classification" | _Currently not supported_ | -| "classification_reason" | _Currently not supported_ | -| conn_trace_id | _Currently not supported_ | +| **AWS Field** | **OpenTelemetry Field(s)** | +|---------------------------|---------------------------------------------------------------| +| type | `network.protocol.name` | +| time | Log timestamp | +| elb | `cloud.resource_id` | +| client:port | `client.address`, `client.port` | +| received_bytes | `http.request.size` | +| sent_bytes | `http.response.size` | +| "request" | `url.full`, `http.request.method`, `network.protocol.version` | +| ssl_cipher | `tls.cipher` | +| ssl_protocol | `tls.protocol.version` | +| elb_status_code | `aws.elb.status.code` | +| user_agent | `user_agent.original` | +| domain_name | `url.domain` | +| target:port | `destination.address`, `destination.port` | +| request_processing_time | `aws.alb.request_processing_time` | +| target_processing_time | `aws.elb.target_processing_time` | +| response_processing_time | `aws.elb.response_processing_time` | +| target_status_code | `aws.elb.backend.status.code` | +| target_group_arn | `aws.elb.target_group_arn` | +| "trace_id" | `aws.elb.aws_trace_id` | +| "chosen_cert_arn" | `aws.elb.chosen_cert_arn` | +| matched_rule_priority | _Currently not supported_ | +| request_creation_time | _Currently not supported_ | +| "actions_executed" | `aws.elb.actions_executed` | +| "redirect_url" | `aws.elb.redirect_url` | +| "error_reason" | `aws.elb.error_reason` | +| "target:port_list" | _Currently not supported_ | +| "target_status_code_list" | _Currently not supported_ | +| "classification" | `aws.elb.classification` | +| "classification_reason" | `aws.elb.classification_reason` | +| conn_trace_id | `aws.elb.connection_trace_id` | +| transformed_host | `aws.elb.transformed_host` | +| transformed_uri | `aws.elb.transformed_uri` | +| request_transform_status | `aws.elb.request_transform_status` | + #### Network Load Balancer (NLB) diff --git a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/elb.go b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/elb.go index 2f9db6a9481d5..607ca5113c1d8 100644 --- a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/elb.go +++ b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/elb.go @@ -237,9 +237,9 @@ type ALBAccessLogRecord struct { TargetIPPort string // Target IP:Port or - TargetIP string // Target IP TargetPort int64 // Target port - RequestProcessingTime string // Time taken to process the request in seconds - TargetProcessingTime string // Time taken for the target to process the request in seconds - ResponseProcessingTime string // Time taken to send the response to the client in seconds + RequestProcessingTime string // Time taken to process the request in milliseconds + TargetProcessingTime string // Time taken for the target to process the request in milliseconds + ResponseProcessingTime string // Time taken to send the response to the client in milliseconds ELBStatusCode int64 // Status code from the load balancer TargetStatusCode string // Status code from the target ReceivedBytes int64 // Size of the request in bytes @@ -264,6 +264,10 @@ type ALBAccessLogRecord struct { TargetStatusCodeList string // List of status codes from targets Classification string // Classification of the request ClassificationReason string // Reason for classification + ConnectionTraceID string // The connection traceability ID + TransformedHost string // The transformed host header + TransformedURI string // The URI after it is modified by a URL rewrite transform + RequestTransformStatus string // The status of the rewrite transform } // convertTextToALBAccessLogRecord converts a slice of strings into a ALBAccessLogRecord @@ -299,6 +303,18 @@ func convertTextToALBAccessLogRecord(fields []string) (ALBAccessLogRecord, error TargetStatusCodeList: fields[26], Classification: fields[27], ClassificationReason: fields[28], + ConnectionTraceID: unknownField, + TransformedHost: unknownField, + TransformedURI: unknownField, + RequestTransformStatus: unknownField, + } + if len(fields) >= 30 { + record.ConnectionTraceID = fields[29] + } + if len(fields) >= 33 { + record.TransformedHost = fields[30] + record.TransformedURI = fields[31] + record.RequestTransformStatus = fields[32] } var clientPort string if record.ClientIP, clientPort, err = net.SplitHostPort(fields[3]); err != nil { diff --git a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/fields.go b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/fields.go index dddfe860f9cf5..de1ebfe6b977d 100644 --- a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/fields.go +++ b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/fields.go @@ -4,7 +4,22 @@ package elbaccesslogs // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log" const ( - AttributeELBStatusCode = "aws.elb.status.code" // int - AttributeELBBackendStatusCode = "aws.elb.backend.status.code" // int - AttributeTLSListenerResourceID = "aws.elb.tls.listener.resource_id" // string + AttributeELBStatusCode = "aws.elb.status.code" // int + AttributeELBBackendStatusCode = "aws.elb.backend.status.code" // int + AttributeTLSListenerResourceID = "aws.elb.tls.listener.resource_id" // string + AttributeELBRequestProcessingTime = "aws.elb.request_processing_time" // float + AttributeELBResponseProcessingTime = "aws.elb.response_processing_time" // float + AttributeELBTargetProcessingTime = "aws.elb.target_processing_time" // float + AttributeELBTargetGroupARN = "aws.elb.target_group_arn" // string + AttributeELBChosenCertARN = "aws.elb.chosen_cert_arn" // string + AttributeELBActionsExecuted = "aws.elb.actions_executed" // string + AttributeELBRedirectURL = "aws.elb.redirect_url" // string + AttributeELBErrorReason = "aws.elb.error_reason" // string + AttributeELBClassification = "aws.elb.classification" // string + AttributeELBClassificationReason = "aws.elb.classification_reason" // string + AttributeELBConnectionTraceID = "aws.elb.connection_trace_id" // string + AttributeELBTransformedHost = "aws.elb.transformed_host" // string + AttributeELBTransformedURI = "aws.elb.transformed_uri" // string + AttributeELBRequestTransformStatus = "aws.elb.request_transform_status" // string + AttributeELBAWSTraceID = "aws.elb.aws_trace_id" // string ) diff --git a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_invalid_syntax.log b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_invalid_syntax.log index e5903531a2b0e..f071f34dfb396 100644 --- a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_invalid_syntax.log +++ b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_invalid_syntax.log @@ -1 +1 @@ -invalid 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 0.000 0.001 0.000 200 200 34 366 "GET http://www.example.com:80/ HTTP/1.1" "curl/7.46.0" - - arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337262-36d228ad5d99923122bbe354" "-" "-" 0 2018-07-02T22:22:48.364000Z "forward,redirect" "-" "-" "10.0.0.1:80" "200" "-" "-" \ No newline at end of file +invalid 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 0.000 0.001 0.000 200 200 34 366 "GET http://www.example.com:80/ HTTP/1.1" "curl/7.46.0" - - arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337262-36d228ad5d99923122bbe354" "-" "-" 0 2018-07-02T22:22:48.364000Z "forward,redirect" "-" "-" "10.0.0.1:80" "200" "-" "-" TID_1234abcd5678ef90 "-" "-" "-" \ No newline at end of file diff --git a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs.log b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs.log index 95d7beb7b9f47..4f942b4e99010 100644 --- a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs.log +++ b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs.log @@ -1,2 +1,3 @@ https 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 0.086 0.048 0.037 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337281-1d84f3d73c47ec4e58577259" "www.example.com" "arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012" 1 2018-07-02T22:22:48.364000Z "authenticate,forward" "-" "-" "10.0.0.1:80" "200" "-" "-" TID_1234abcd5678ef90 -https 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 [fe80::202:b3ff:fe1e:8329]:443 [2001:db8::1]:80 0.086 0.048 0.037 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337281-1d84f3d73c47ec4e58577259" "www.example.com" "arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012" 1 2018-07-02T22:22:48.364000Z "authenticate,forward" "-" "-" "10.0.0.1:80" "200" "-" "-" TID_1234abcd5678ef90 \ No newline at end of file +https 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 [fe80::202:b3ff:fe1e:8329]:443 [2001:db8::1]:80 0.086 0.048 0.037 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337281-1d84f3d73c47ec4e58577259" "www.example.com" "arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012" 1 2018-07-02T22:22:48.364000Z "authenticate,forward" "-" "-" "10.0.0.1:80" "200" "-" "-" TID_1234abcd5678ef90 +https 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 0.086 0.048 0.037 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337281-1d84f3d73c47ec4e58577259" "www.example.com" "arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012" 1 2018-07-02T22:22:48.364000Z "authenticate,forward" "-" "-" "10.0.0.1:80" "200" "-" "-" TID_1234abcd5678ef90 "transformed.example.com" "https://transformed.example.com/index.html" "TransformSuccess" diff --git a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs_expected.yaml b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs_expected.yaml index f2c574668e0fc..b8ac67ae3a86d 100644 --- a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs_expected.yaml +++ b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/testdata/alb_al_valid_logs_expected.yaml @@ -55,6 +55,36 @@ resourceLogs: - key: destination.port value: intValue: "80" + - key: aws.elb.actions_executed + value: + arrayValue: + values: + - stringValue: "authenticate" + - stringValue: "forward" + - key: aws.elb.backend.status.code + value: + intValue: "200" + - key: aws.elb.chosen_cert_arn + value: + stringValue: arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012 + - key: aws.elb.aws_trace_id + value: + stringValue: Root=1-58337281-1d84f3d73c47ec4e58577259 + - key: aws.elb.connection_trace_id + value: + stringValue: TID_1234abcd5678ef90 + - key: aws.elb.request_processing_time + value: + doubleValue: "0.086" + - key: aws.elb.target_processing_time + value: + doubleValue: "0.048" + - key: aws.elb.response_processing_time + value: + doubleValue: "0.037" + - key: aws.elb.target_group_arn + value: + stringValue: arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 body: {} timeUnixNano: "1530570180186641000" - attributes: @@ -103,8 +133,125 @@ resourceLogs: - key: destination.port value: intValue: "80" + - key: aws.elb.actions_executed + value: + arrayValue: + values: + - stringValue: "authenticate" + - stringValue: "forward" + - key: aws.elb.backend.status.code + value: + intValue: "200" + - key: aws.elb.chosen_cert_arn + value: + stringValue: arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012 + - key: aws.elb.aws_trace_id + value: + stringValue: Root=1-58337281-1d84f3d73c47ec4e58577259 + - key: aws.elb.connection_trace_id + value: + stringValue: TID_1234abcd5678ef90 + - key: aws.elb.request_processing_time + value: + doubleValue: "0.086" + - key: aws.elb.target_processing_time + value: + doubleValue: "0.048" + - key: aws.elb.response_processing_time + value: + doubleValue: "0.037" + - key: aws.elb.target_group_arn + value: + stringValue: arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 body: {} timeUnixNano: "1530570180186641000" + - attributes: + - key: network.protocol.name + value: + stringValue: https + - key: network.protocol.version + value: + stringValue: "1.1" + - key: client.address + value: + stringValue: 192.168.131.39 + - key: http.request.method + value: + stringValue: GET + - key: url.full + value: + stringValue: https://www.example.com:443/ + - key: client.port + value: + intValue: "2817" + - key: http.request.size + value: + intValue: "0" + - key: http.response.size + value: + intValue: "57" + - key: aws.elb.status.code + value: + intValue: "200" + - key: tls.protocol.version + value: + stringValue: tlsv1.2 + - key: tls.cipher + value: + stringValue: ECDHE-RSA-AES128-GCM-SHA256 + - key: user_agent.original + value: + stringValue: curl/7.46.0 + - key: url.domain + value: + stringValue: www.example.com + - key: destination.address + value: + stringValue: 10.0.0.1 + - key: destination.port + value: + intValue: "80" + - key: aws.elb.actions_executed + value: + arrayValue: + values: + - stringValue: "authenticate" + - stringValue: "forward" + - key: aws.elb.backend.status.code + value: + intValue: "200" + - key: aws.elb.chosen_cert_arn + value: + stringValue: arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012 + - key: aws.elb.aws_trace_id + value: + stringValue: Root=1-58337281-1d84f3d73c47ec4e58577259 + - key: aws.elb.connection_trace_id + value: + stringValue: TID_1234abcd5678ef90 + - key: aws.elb.request_processing_time + value: + doubleValue: "0.086" + - key: aws.elb.target_processing_time + value: + doubleValue: "0.048" + - key: aws.elb.response_processing_time + value: + doubleValue: "0.037" + - key: aws.elb.target_group_arn + value: + stringValue: arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 + - key: aws.elb.transformed_host + value: + stringValue: transformed.example.com + - key: aws.elb.transformed_uri + value: + stringValue: https://transformed.example.com/index.html + - key: aws.elb.request_transform_status + value: + stringValue: TransformSuccess + body: { } + timeUnixNano: "1530570180186641000" scope: attributes: - key: encoding.format diff --git a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/unmarshaler.go b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/unmarshaler.go index 8480cdcf29933..d4958a6acd8c3 100644 --- a/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/unmarshaler.go +++ b/extension/encoding/awslogsencodingextension/internal/unmarshaler/elb-access-log/unmarshaler.go @@ -248,6 +248,72 @@ func (f *elbAccessLogUnmarshaler) addToALBAccessLogs(resourceAttr *resourceAttri recordLog.Attributes().PutInt(string(conventions.DestinationPortKey), albRecord.TargetPort) } + // Times are expressed in seconds with a precision of 3 decimal places in logs. Here we convert them to milliseconds. + if albRecord.RequestProcessingTime != unknownField { + rpt, e := safeConvertStrToFloat(albRecord.RequestProcessingTime) + if e == nil { + recordLog.Attributes().PutDouble(AttributeELBRequestProcessingTime, rpt) + } + } + if albRecord.TargetProcessingTime != unknownField { + tpt, e := safeConvertStrToFloat(albRecord.TargetProcessingTime) + if e == nil { + recordLog.Attributes().PutDouble(AttributeELBTargetProcessingTime, tpt) + } + } + if albRecord.ResponseProcessingTime != unknownField { + rpt, e := safeConvertStrToFloat(albRecord.ResponseProcessingTime) + if e == nil { + recordLog.Attributes().PutDouble(AttributeELBResponseProcessingTime, rpt) + } + } + + if albRecord.TraceID != unknownField { + recordLog.Attributes().PutStr(AttributeELBAWSTraceID, albRecord.TraceID) + } + if albRecord.TargetStatusCode != unknownField { + statusCode, e := safeConvertStrToInt(albRecord.TargetStatusCode) + if e == nil { + recordLog.Attributes().PutInt(AttributeELBBackendStatusCode, statusCode) + } + } + if albRecord.TargetGroupARN != unknownField { + recordLog.Attributes().PutStr(AttributeELBTargetGroupARN, albRecord.TargetGroupARN) + } + if albRecord.ChosenCertARN != unknownField { + recordLog.Attributes().PutStr(AttributeELBChosenCertARN, albRecord.ChosenCertARN) + } + if albRecord.ActionsExecuted != unknownField { + actions := recordLog.Attributes().PutEmptySlice(AttributeELBActionsExecuted) + for _, action := range strings.Split(albRecord.ActionsExecuted, ",") { + actions.AppendEmpty().SetStr(action) + } + } + if albRecord.RedirectURL != unknownField { + recordLog.Attributes().PutStr(AttributeELBRedirectURL, albRecord.RedirectURL) + } + if albRecord.ErrorReason != unknownField { + recordLog.Attributes().PutStr(AttributeELBErrorReason, albRecord.ErrorReason) + } + if albRecord.Classification != unknownField { + recordLog.Attributes().PutStr(AttributeELBClassification, albRecord.Classification) + } + if albRecord.ClassificationReason != unknownField { + recordLog.Attributes().PutStr(AttributeELBClassificationReason, albRecord.ClassificationReason) + } + if albRecord.ConnectionTraceID != unknownField { + recordLog.Attributes().PutStr(AttributeELBConnectionTraceID, albRecord.ConnectionTraceID) + } + if albRecord.TransformedHost != unknownField { + recordLog.Attributes().PutStr(AttributeELBTransformedHost, albRecord.TransformedHost) + } + if albRecord.TransformedURI != unknownField { + recordLog.Attributes().PutStr(AttributeELBTransformedURI, albRecord.TransformedURI) + } + if albRecord.RequestTransformStatus != unknownField { + recordLog.Attributes().PutStr(AttributeELBRequestTransformStatus, albRecord.RequestTransformStatus) + } + // Set timestamp recordLog.SetTimestamp(pcommon.Timestamp(epochNanoseconds))