Skip to content

Commit c0622b5

Browse files
committed
fix: Add more attributes. Refactor attributes from String to Object for metrics.
1 parent ef59e3e commit c0622b5

17 files changed

Lines changed: 237 additions & 464 deletions

gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,6 @@
3838
import java.util.HashMap;
3939
import java.util.Map;
4040
import javax.annotation.Nullable;
41-
//gcp.client.service [consistent across T4 spans]
42-
//gcp.client.version [consistent across T4 spans]
43-
// rpc.system.name (e.g., grpc, http) [consistent across T4 spans]
44-
// rpc.response.status_code (for gRPC and HTTP) [from last T4 span]
45-
// rpc.method (for gRPC and HTTP) [from the last T4 span]
46-
//url.domain [consistent across T4 spans]
47-
// url.template (for HTTP) [from the first T4 span]
48-
// http.response.status_code (for HTTP) [from the last T4 span]
49-
//server.address [from the last T4 span]
50-
//server.port [from the last T4 span]
51-
// error.type (if the overall T3 operation failed)
5241

5342
/**
5443
* A context object that contains information used to infer attributes that are common for all
@@ -147,12 +136,15 @@ String rpcSystemName() {
147136
@Nullable
148137
public abstract OperationType operationType();
149138

139+
/** The service name of a client (e.g. "bigtable", "spanner"). */
150140
@Nullable
151141
public abstract String serviceName();
152142

143+
/** The url domain of the request (e.g. "pubsub.googleapis.com"). */
153144
@Nullable
154145
public abstract String urlDomain();
155146

147+
/** The url template of the request (e.g. /v1/{name}:access). */
156148
@Nullable
157149
public abstract String urlTemplate();
158150

@@ -185,20 +177,29 @@ public Map<String, Object> getAttemptAttributes() {
185177
return attributes;
186178
}
187179

188-
Map<String, String> getMetricsAttributes() {
189-
Map<String, String> attributes = new HashMap<>();
190-
if (serverAddress() != null) {
180+
Map<String, Object> getMetricsAttributes() {
181+
Map<String, Object> attributes = new HashMap<>();
182+
if (!Strings.isNullOrEmpty(serverAddress())) {
191183
attributes.put(ObservabilityAttributes.SERVER_ADDRESS_ATTRIBUTE, serverAddress());
192184
}
193-
if (serviceName() != null) {
194-
attributes.put("gcp.client.service", serviceName());
185+
if (serverPort() != null) {
186+
attributes.put(ObservabilityAttributes.SERVER_PORT_ATTRIBUTE, serverPort());
187+
}
188+
if (!Strings.isNullOrEmpty(serviceName())) {
189+
attributes.put(ObservabilityAttributes.GCP_CLIENT_SERVICE_ATTRIBUTE, serviceName());
190+
}
191+
if (!Strings.isNullOrEmpty(rpcSystemName())) {
192+
attributes.put(ObservabilityAttributes.RPC_SYSTEM_NAME_ATTRIBUTE, rpcSystemName());
195193
}
196-
if (transport() == HTTP) {
197-
if (urlDomain() != null) {
198-
attributes.put("url.domain", serviceName());
194+
if (!Strings.isNullOrEmpty(fullMethodName())) {
195+
attributes.put(ObservabilityAttributes.GRPC_RPC_METHOD_ATTRIBUTE, fullMethodName());
196+
}
197+
if (transport() == Transport.HTTP) {
198+
if (!Strings.isNullOrEmpty(urlDomain())) {
199+
attributes.put(ObservabilityAttributes.URL_DOMAIN_ATTRIBUTE, urlDomain());
199200
}
200-
if (serviceName() != null) {
201-
attributes.put("url.template", serviceName());
201+
if (!Strings.isNullOrEmpty(urlTemplate())) {
202+
attributes.put(ObservabilityAttributes.URL_TEMPLATE_ATTRIBUTE, urlTemplate());
202203
}
203204
}
204205
return attributes;
@@ -230,6 +231,15 @@ ApiTracerContext merge(ApiTracerContext other) {
230231
if (other.operationType() != null) {
231232
builder.setOperationType(other.operationType());
232233
}
234+
if (other.serviceName() != null) {
235+
builder.setServiceName(other.serviceName());
236+
}
237+
if (other.urlDomain() != null) {
238+
builder.setUrlDomain(other.urlDomain());
239+
}
240+
if (other.urlTemplate() != null) {
241+
builder.setUrlTemplate(other.urlTemplate());
242+
}
233243
return builder.build();
234244
}
235245

@@ -257,6 +267,12 @@ public abstract static class Builder {
257267

258268
public abstract Builder setServerPort(@Nullable Integer serverPort);
259269

270+
public abstract Builder setServiceName(@Nullable String serviceName);
271+
272+
public abstract Builder setUrlDomain(@Nullable String urlDomain);
273+
274+
public abstract Builder setUrlTemplate(@Nullable String urlTemplate);
275+
260276
public abstract ApiTracerContext build();
261277
}
262278
}

gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalMetricsTracer.java

Lines changed: 0 additions & 90 deletions
This file was deleted.

gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalMetricsTracerFactory.java

Lines changed: 0 additions & 71 deletions
This file was deleted.

gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsRecorder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class GoldenSignalsMetricsRecorder {
6565
.build();
6666
}
6767

68-
void recordOperationLatency(double operationLatency, Map<String, String> attributes) {
68+
void recordOperationLatency(double operationLatency, Map<String, Object> attributes) {
6969
clientRequestDurationRecorder.record(
7070
operationLatency, ObservabilityUtils.toOtelAttributes(attributes));
7171
}

gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracer.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,26 +48,23 @@
4848
class GoldenSignalsMetricsTracer implements ApiTracer {
4949
private final Stopwatch clientRequestTimer;
5050
private final GoldenSignalsMetricsRecorder metricsRecorder;
51-
private final Map<String, String> attributes = new HashMap<>();
51+
private final Map<String, Object> attributes;
5252

53-
/**
54-
* Creates the following instruments for the following metrics:
55-
*
56-
* <ul>
57-
* <li>Client Request Duration: Histogram
58-
* </ul>
59-
*
60-
* @param metricsRecorder OpenTelemetry
61-
*/
62-
GoldenSignalsMetricsTracer(GoldenSignalsMetricsRecorder metricsRecorder) {
53+
GoldenSignalsMetricsTracer(
54+
GoldenSignalsMetricsRecorder metricsRecorder, ApiTracerContext apiTracerContext) {
6355
this.clientRequestTimer = Stopwatch.createStarted();
6456
this.metricsRecorder = metricsRecorder;
57+
this.attributes = apiTracerContext.getMetricsAttributes();
6558
}
6659

6760
@VisibleForTesting
68-
GoldenSignalsMetricsTracer(GoldenSignalsMetricsRecorder metricsRecorder, Ticker ticker) {
61+
GoldenSignalsMetricsTracer(
62+
GoldenSignalsMetricsRecorder metricsRecorder,
63+
ApiTracerContext apiTracerContext,
64+
Ticker ticker) {
6965
this.clientRequestTimer = Stopwatch.createStarted(ticker);
7066
this.metricsRecorder = metricsRecorder;
67+
this.attributes = new HashMap<>(apiTracerContext.getMetricsAttributes());
7168
}
7269

7370
/**

gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class GoldenSignalsMetricsTracerFactory implements ApiTracerFactory {
4848

4949
public GoldenSignalsMetricsTracerFactory(OpenTelemetry openTelemetry) {
5050
this.openTelemetry = openTelemetry;
51+
this.apiTracerContext = ApiTracerContext.empty();
5152
}
5253

5354
@Override
@@ -57,7 +58,7 @@ public ApiTracer newTracer(ApiTracer parent, SpanName spanName, OperationType op
5758
// regular requests.
5859
return new BaseApiTracer();
5960
}
60-
return new GoldenSignalsMetricsTracer(metricsRecorder);
61+
return new GoldenSignalsMetricsTracer(metricsRecorder, apiTracerContext);
6162
}
6263

6364
@Override

gax-java/gax/src/main/java/com/google/api/gax/tracing/ObservabilityAttributes.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,13 @@ public class ObservabilityAttributes {
6464
* gRPC status code (e.g., "OK", "INTERNAL").
6565
*/
6666
public static final String RPC_RESPONSE_STATUS_ATTRIBUTE = "rpc.response.status_code";
67+
68+
/** The service name of a client (e.g. "bigtable", "spanner"). */
69+
public static final String GCP_CLIENT_SERVICE_ATTRIBUTE = "gcp.client.service";
70+
71+
/** The url domain of the request (e.g. "pubsub.googleapis.com"). */
72+
public static final String URL_DOMAIN_ATTRIBUTE = "url.domain";
73+
74+
/** The url template of the request (e.g. /v1/{name}:access). */
75+
public static final String URL_TEMPLATE_ATTRIBUTE = "url.template";
6776
}

gax-java/gax/src/main/java/com/google/api/gax/tracing/ObservabilityUtils.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131

3232
import com.google.api.gax.rpc.ApiException;
3333
import com.google.api.gax.rpc.StatusCode;
34-
import com.google.common.base.Preconditions;
3534
import io.opentelemetry.api.common.Attributes;
3635
import io.opentelemetry.api.common.AttributesBuilder;
3736
import java.util.Map;
@@ -57,10 +56,19 @@ static String extractStatus(@Nullable Throwable error) {
5756
return statusString;
5857
}
5958

60-
static Attributes toOtelAttributes(Map<String, String> attributes) {
61-
Preconditions.checkNotNull(attributes, "Attributes map cannot be null");
59+
static Attributes toOtelAttributes(Map<String, Object> attributes) {
6260
AttributesBuilder attributesBuilder = Attributes.builder();
63-
attributes.forEach(attributesBuilder::put);
61+
if (attributes == null) {
62+
return attributesBuilder.build();
63+
}
64+
attributes.forEach(
65+
(k, v) -> {
66+
if (v instanceof String) {
67+
attributesBuilder.put(k, (String) v);
68+
} else if (v instanceof Integer) {
69+
attributesBuilder.put(k, (long) (Integer) v);
70+
}
71+
});
6472
return attributesBuilder.build();
6573
}
6674
}

0 commit comments

Comments
 (0)