Skip to content

Commit 58442e7

Browse files
committed
Adding data base user attribute for EMF logs
1 parent ff295b7 commit 58442e7

File tree

6 files changed

+69
-4
lines changed

6 files changed

+69
-4
lines changed

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/jdbc/JdbcContractTestBase.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import static io.opentelemetry.proto.trace.v1.Span.SpanKind.SPAN_KIND_CLIENT;
1919
import static org.assertj.core.api.Assertions.assertThat;
20-
import static org.junit.Assert.assertThat;
2120

2221
import io.opentelemetry.proto.common.v1.KeyValue;
2322
import io.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint;
@@ -52,6 +51,7 @@ protected void assertAwsSpanAttributes(
5251
String path,
5352
String dbSystem,
5453
String dbOperation,
54+
String dbUser,
5555
String type,
5656
String identifier) {
5757
assertThat(resourceScopeSpans)
@@ -60,7 +60,7 @@ protected void assertAwsSpanAttributes(
6060
assertThat(rss.getSpan().getKind()).isEqualTo(SPAN_KIND_CLIENT);
6161
var attributesList = rss.getSpan().getAttributesList();
6262
assertAwsAttributes(
63-
attributesList, method, path, dbSystem, dbOperation, type, identifier);
63+
attributesList, method, path, dbSystem, dbOperation, dbUser, type, identifier);
6464
});
6565
}
6666

@@ -70,6 +70,7 @@ protected void assertAwsAttributes(
7070
String endpoint,
7171
String dbSystem,
7272
String dbOperation,
73+
String dbUser,
7374
String type,
7475
String identifier) {
7576
var assertions =
@@ -97,6 +98,11 @@ protected void assertAwsAttributes(
9798
.isEqualTo(AppSignalsConstants.AWS_REMOTE_OPERATION);
9899
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbOperation);
99100
})
101+
.satisfiesOnlyOnce(
102+
attribute -> {
103+
assertThat(attribute.getKey()).isEqualTo(AppSignalsConstants.AWS_REMOTE_DB_USER);
104+
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbUser);
105+
})
100106
.satisfiesOnlyOnce(
101107
attribute -> {
102108
assertThat(attribute.getKey()).isEqualTo(AppSignalsConstants.AWS_SPAN_KIND);
@@ -301,7 +307,7 @@ protected void assertSuccess(
301307
assertThat(response.status().isSuccess()).isTrue();
302308

303309
var traces = mockCollectorClient.getTraces();
304-
assertAwsSpanAttributes(traces, method, path, dbSystem, dbOperation, type, identifier);
310+
assertAwsSpanAttributes(traces, method, path, dbSystem, dbOperation, dbUser, type, identifier);
305311
assertSemanticConventionsSpanAttributes(
306312
traces, otelStatusCode, dbSqlTable, dbSystem, dbOperation, dbUser, dbName, jdbcUrl);
307313

@@ -359,7 +365,8 @@ protected void assertFault(
359365
assertThat(response.status().isServerError()).isTrue();
360366

361367
var traces = mockCollectorClient.getTraces();
362-
assertAwsSpanAttributes(traces, method, path, dbSystem, dbOperation, type, identifier);
368+
System.out.println("Traces----------" + traces);
369+
assertAwsSpanAttributes(traces, method, path, dbSystem, dbOperation, dbUser, type, identifier);
363370
assertSemanticConventionsSpanAttributes(
364371
traces, otelStatusCode, dbSqlTable, dbSystem, dbOperation, dbUser, dbName, jdbcUrl);
365372

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/utils/AppSignalsConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ public class AppSignalsConstants {
3232
public static final String AWS_REMOTE_RESOURCE_TYPE = "aws.remote.resource.type";
3333
public static final String AWS_REMOTE_RESOURCE_IDENTIFIER = "aws.remote.resource.identifier";
3434
public static final String AWS_SPAN_KIND = "aws.span.kind";
35+
public static final String AWS_REMOTE_DB_USER = "aws.remote.db.user";
3536
}

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/AwsAttributeKeys.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ private AwsAttributeKeys() {}
4141
static final AttributeKey<String> AWS_REMOTE_RESOURCE_TYPE =
4242
AttributeKey.stringKey("aws.remote.resource.type");
4343

44+
static final AttributeKey<String> AWS_REMOTE_DB_USER = AttributeKey.stringKey("aws.remote.db.user");
45+
4446
static final AttributeKey<String> AWS_SDK_DESCENDANT =
4547
AttributeKey.stringKey("aws.sdk.descendant");
4648

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/AwsMetricAttributeGenerator.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static io.opentelemetry.semconv.SemanticAttributes.DB_OPERATION;
2222
import static io.opentelemetry.semconv.SemanticAttributes.DB_STATEMENT;
2323
import static io.opentelemetry.semconv.SemanticAttributes.DB_SYSTEM;
24+
import static io.opentelemetry.semconv.SemanticAttributes.DB_USER;
2425
import static io.opentelemetry.semconv.SemanticAttributes.FAAS_INVOKED_NAME;
2526
import static io.opentelemetry.semconv.SemanticAttributes.FAAS_TRIGGER;
2627
import static io.opentelemetry.semconv.SemanticAttributes.GRAPHQL_OPERATION_TYPE;
@@ -41,6 +42,7 @@
4142
import static io.opentelemetry.semconv.SemanticAttributes.SERVER_SOCKET_ADDRESS;
4243
import static io.opentelemetry.semconv.SemanticAttributes.SERVER_SOCKET_PORT;
4344
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_BUCKET_NAME;
45+
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_REMOTE_DB_USER;
4446
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_LOCAL_OPERATION;
4547
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_LOCAL_SERVICE;
4648
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_QUEUE_NAME;
@@ -151,6 +153,7 @@ private Attributes generateDependencyMetricAttributes(SpanData span, Resource re
151153
setRemoteResourceTypeAndIdentifier(span, builder);
152154
setSpanKindForDependency(span, builder);
153155
setHttpStatus(span, builder);
156+
setRemoteDbUser(span, builder);
154157

155158
return builder.build();
156159
}
@@ -526,6 +529,12 @@ private static void setHttpStatus(SpanData span, AttributesBuilder builder) {
526529
}
527530
}
528531

532+
private static void setRemoteDbUser(SpanData span, AttributesBuilder builder) {
533+
if (isDBSpan(span) && isKeyPresent(span, DB_USER)) {
534+
builder.put(AWS_REMOTE_DB_USER, span.getAttributes().get(DB_USER));
535+
}
536+
}
537+
529538
/**
530539
* Attempt to pull status code from spans produced by AWS SDK instrumentation (both v1 and v2).
531540
* AWS SDK instrumentation does not populate http.status_code when non-200 status codes are

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/AwsSpanProcessingUtil.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static io.opentelemetry.semconv.SemanticAttributes.DB_OPERATION;
1919
import static io.opentelemetry.semconv.SemanticAttributes.DB_STATEMENT;
2020
import static io.opentelemetry.semconv.SemanticAttributes.DB_SYSTEM;
21+
import static io.opentelemetry.semconv.SemanticAttributes.DB_USER;
2122
import static io.opentelemetry.semconv.SemanticAttributes.HTTP_METHOD;
2223
import static io.opentelemetry.semconv.SemanticAttributes.HTTP_TARGET;
2324
import static io.opentelemetry.semconv.SemanticAttributes.MESSAGING_OPERATION;
@@ -226,6 +227,7 @@ private static String generateIngressOperation(SpanData span) {
226227
static boolean isDBSpan(SpanData span) {
227228
return isKeyPresent(span, DB_SYSTEM)
228229
|| isKeyPresent(span, DB_OPERATION)
230+
|| isKeyPresent(span, DB_USER)
229231
|| isKeyPresent(span, DB_STATEMENT);
230232
}
231233
}

awsagentprovider/src/test/java/software/amazon/opentelemetry/javaagent/providers/AwsMetricAttributeGeneratorTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.mockito.Mockito.mock;
2323
import static org.mockito.Mockito.when;
2424
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_BUCKET_NAME;
25+
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_REMOTE_DB_USER;
2526
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_LOCAL_OPERATION;
2627
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_LOCAL_SERVICE;
2728
import static software.amazon.opentelemetry.javaagent.providers.AwsAttributeKeys.AWS_QUEUE_NAME;
@@ -1029,6 +1030,49 @@ private void validateHttpStatusForNonLocalRootWithThrowableForClient(
10291030
}
10301031
}
10311032

1033+
@Test
1034+
void testDBUserAttribute() {
1035+
String dbUser = "test_user";
1036+
mockAttribute(DB_USER, dbUser);
1037+
when(spanDataMock.getKind()).thenReturn(SpanKind.CLIENT);
1038+
1039+
Attributes actualAttributes =
1040+
GENERATOR.generateMetricAttributeMapFromSpan(spanDataMock, resource).get(DEPENDENCY_METRIC);
1041+
assertThat(actualAttributes.get(AWS_REMOTE_DB_USER)).isEqualTo(dbUser);
1042+
}
1043+
1044+
@Test
1045+
void testDBUserAttributeAbsent() {
1046+
mockAttribute(DB_USER, null);
1047+
when(spanDataMock.getKind()).thenReturn(SpanKind.CLIENT);
1048+
1049+
Attributes actualAttributes =
1050+
GENERATOR.generateMetricAttributeMapFromSpan(spanDataMock, resource).get(DEPENDENCY_METRIC);
1051+
assertThat(actualAttributes.get(AWS_REMOTE_DB_USER)).isNull();
1052+
}
1053+
1054+
@Test
1055+
void testDBUserAttributeWithDifferentValues() {
1056+
String dbUser = "non_db_user";
1057+
mockAttribute(DB_USER, dbUser);
1058+
when(spanDataMock.getKind()).thenReturn(SpanKind.CLIENT);
1059+
1060+
Attributes actualAttributes =
1061+
GENERATOR.generateMetricAttributeMapFromSpan(spanDataMock, resource).get(DEPENDENCY_METRIC);
1062+
assertThat(actualAttributes.get(AWS_REMOTE_DB_USER)).isEqualTo(dbUser);
1063+
}
1064+
1065+
@Test
1066+
void testDBUserAttributeNotPresentInServiceMetricForServerSpan() {
1067+
String dbUser = "test_user";
1068+
mockAttribute(AWS_REMOTE_DB_USER, dbUser);
1069+
when(spanDataMock.getKind()).thenReturn(SpanKind.SERVER);
1070+
1071+
Attributes actualAttributes =
1072+
GENERATOR.generateMetricAttributeMapFromSpan(spanDataMock, resource).get(SERVICE_METRIC);
1073+
assertThat(actualAttributes.get(AWS_REMOTE_DB_USER)).isNull();
1074+
}
1075+
10321076
@Test
10331077
public void testNormalizeRemoteServiceName_NoNormalization() {
10341078
String serviceName = "non aws service";

0 commit comments

Comments
 (0)