Skip to content

Commit 4773130

Browse files
authored
Merge branch 'main' into test/actionable-errors-logging-integration
2 parents 1c338aa + 5944127 commit 4773130

File tree

14 files changed

+590
-47
lines changed

14 files changed

+590
-47
lines changed

.github/workflows/hermetic_library_generation.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,5 @@ jobs:
4343
base_ref: ${{ github.base_ref }}
4444
head_ref: ${{ github.head_ref }}
4545
token: ${{ secrets.CLOUD_JAVA_BOT_GITHUB_TOKEN }}
46+
force_regenerate_all: ${{ github.event.pull_request.head.ref == 'generate-libraries-main' }}
4647
image_tag: 2.68.1-SNAPSHOT # {x-version-update:gapic-generator-java:current}

sdk-platform-java/.github/scripts/action.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ inputs:
3636
token:
3737
description: Personal Access Token
3838
required: true
39+
force_regenerate_all:
40+
description: true if we want to regenerate all libraries
41+
required: false
3942

4043
runs:
4144
using: "composite"
@@ -76,10 +79,12 @@ runs:
7679
--target_branch "${BASE_REF}" \
7780
--current_branch "${HEAD_REF}" \
7881
--showcase_mode "${SHOWCASE_MODE}" \
79-
--image_tag "${IMAGE_TAG}"
82+
--image_tag "${IMAGE_TAG}" \
83+
--force_regenerate_all "${FORCE_REGENERATE_ALL}"
8084
env:
8185
BASE_REF: ${{ inputs.base_ref }}
8286
HEAD_REF: ${{ inputs.head_ref }}
8387
IMAGE_TAG: ${{ inputs.image_tag }}
8488
SHOWCASE_MODE: ${{ inputs.showcase_mode }}
8589
GH_TOKEN: ${{ inputs.token }}
90+
FORCE_REGENERATE_ALL: ${{ inputs.force_regenerate_all }}

sdk-platform-java/.github/scripts/hermetic_library_generation.sh

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ case "${key}" in
5050
showcase_mode="$2"
5151
shift
5252
;;
53+
--force_regenerate_all)
54+
force_regenerate_all="$2"
55+
shift
56+
;;
5357
*)
5458
echo "Invalid option: [$1]"
5559
exit 1
@@ -81,6 +85,10 @@ if [ -z "${image_tag}" ]; then
8185
image_tag=$(grep "gapic_generator_version" "${generation_config}" | cut -d ':' -f 2 | xargs)
8286
fi
8387

88+
if [ -z "${force_regenerate_all}" ]; then
89+
force_regenerate_all="false"
90+
fi
91+
8492
workspace_name="/workspace"
8593
baseline_generation_config="baseline_generation_config.yaml"
8694
message="chore: generate libraries at $(date)"
@@ -109,7 +117,8 @@ fi
109117
changed_libraries_file="$(mktemp)"
110118
python hermetic_build/common/cli/get_changed_libraries.py create \
111119
--baseline-generation-config-path="${baseline_generation_config}" \
112-
--current-generation-config-path="${generation_config}" | tee "${changed_libraries_file}"
120+
--current-generation-config-path="${generation_config}"\
121+
--force-regenerate-all="${force_regenerate_all}" | tee "${changed_libraries_file}"
113122
changed_libraries="$(cat "${changed_libraries_file}")"
114123
echo "Changed libraries are: ${changed_libraries:-"No changed library"}."
115124

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,16 @@
2929
*/
3030
package com.google.api.gax.tracing;
3131

32+
import com.google.api.gax.rpc.LibraryMetadata;
33+
import com.google.common.base.Strings;
3234
import io.opentelemetry.api.OpenTelemetry;
3335
import io.opentelemetry.api.metrics.DoubleHistogram;
3436
import io.opentelemetry.api.metrics.Meter;
37+
import io.opentelemetry.api.metrics.MeterBuilder;
3538
import java.util.Arrays;
3639
import java.util.List;
3740
import java.util.Map;
41+
import javax.annotation.Nullable;
3842

3943
/**
4044
* This class takes an OpenTelemetry object, and creates instruments (meters, histograms etc.) from
@@ -53,8 +57,23 @@ class GoldenSignalsMetricsRecorder {
5357
900.0, 3600.0);
5458
final DoubleHistogram clientRequestDurationRecorder;
5559

56-
GoldenSignalsMetricsRecorder(OpenTelemetry openTelemetry, String libraryName) {
57-
Meter meter = openTelemetry.meterBuilder(libraryName).build();
60+
@Nullable
61+
static GoldenSignalsMetricsRecorder create(
62+
OpenTelemetry openTelemetry, LibraryMetadata libraryMetadata) {
63+
if (libraryMetadata == null || Strings.isNullOrEmpty(libraryMetadata.artifactName())) {
64+
return null;
65+
}
66+
return new GoldenSignalsMetricsRecorder(openTelemetry, libraryMetadata);
67+
}
68+
69+
private GoldenSignalsMetricsRecorder(
70+
OpenTelemetry openTelemetry, LibraryMetadata libraryMetadata) {
71+
MeterBuilder meterBuilder = openTelemetry.meterBuilder(libraryMetadata.artifactName());
72+
String libraryVersion = libraryMetadata.version();
73+
if (!Strings.isNullOrEmpty(libraryVersion)) {
74+
meterBuilder.setInstrumentationVersion(libraryVersion);
75+
}
76+
Meter meter = meterBuilder.build();
5877

5978
this.clientRequestDurationRecorder =
6079
meter

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,12 @@
2929
*/
3030
package com.google.api.gax.tracing;
3131

32-
import static com.google.api.gax.tracing.ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE;
33-
34-
import com.google.api.gax.rpc.StatusCode;
3532
import com.google.common.annotations.VisibleForTesting;
3633
import com.google.common.base.Stopwatch;
3734
import com.google.common.base.Ticker;
3835
import java.util.HashMap;
3936
import java.util.Map;
37+
import java.util.concurrent.CancellationException;
4038
import java.util.concurrent.TimeUnit;
4139

4240
/**
@@ -77,21 +75,25 @@ class GoldenSignalsMetricsTracer implements ApiTracer {
7775
*/
7876
@Override
7977
public void operationSucceeded() {
80-
attributes.put(RPC_RESPONSE_STATUS_ATTRIBUTE, StatusCode.Code.OK.toString());
78+
ObservabilityUtils.populateStatusAttributes(attributes, null, transport);
8179
metricsRecorder.recordOperationLatency(
8280
clientRequestTimer.elapsed(TimeUnit.NANOSECONDS) / 1_000_000_000.0, attributes);
8381
}
8482

8583
@Override
8684
public void operationCancelled() {
87-
attributes.put(RPC_RESPONSE_STATUS_ATTRIBUTE, StatusCode.Code.CANCELLED.toString());
88-
metricsRecorder.recordOperationLatency(
89-
clientRequestTimer.elapsed(TimeUnit.NANOSECONDS) / 1_000_000_000.0, attributes);
85+
recordError(new CancellationException());
9086
}
9187

9288
@Override
9389
public void operationFailed(Throwable error) {
90+
recordError(error);
91+
}
92+
93+
private void recordError(Throwable error) {
9494
ObservabilityUtils.populateStatusAttributes(attributes, error, transport);
95+
attributes.put(
96+
ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE, ObservabilityUtils.extractErrorType(error));
9597
metricsRecorder.recordOperationLatency(
9698
clientRequestTimer.elapsed(TimeUnit.NANOSECONDS) / 1_000_000_000.0, attributes);
9799
}

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@
2929
*/
3030
package com.google.api.gax.tracing;
3131

32-
import com.google.api.client.util.Strings;
3332
import com.google.api.core.BetaApi;
3433
import com.google.api.core.InternalApi;
35-
import com.google.api.gax.rpc.LibraryMetadata;
3634
import io.opentelemetry.api.OpenTelemetry;
3735

3836
/**
@@ -85,14 +83,12 @@ public ApiTracerFactory withContext(ApiTracerContext context) {
8583
if (context == null) {
8684
return new BaseApiTracerFactory();
8785
}
88-
LibraryMetadata metadata = context.libraryMetadata();
89-
if (metadata == null || metadata.isEmpty() || Strings.isNullOrEmpty(metadata.artifactName())) {
86+
this.metricsRecorder =
87+
GoldenSignalsMetricsRecorder.create(openTelemetry, context.libraryMetadata());
88+
if (this.metricsRecorder == null) {
9089
return new BaseApiTracerFactory();
9190
}
9291
this.clientLevelTracerContext = context;
93-
this.metricsRecorder =
94-
new GoldenSignalsMetricsRecorder(
95-
openTelemetry, clientLevelTracerContext.libraryMetadata().artifactName());
9692
return this;
9793
}
9894
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,10 @@ static void populateStatusAttributes(
175175
@Nullable Throwable error,
176176
ApiTracerContext.Transport transport) {
177177
StatusCode.Code code = extractStatus(error);
178+
attributes.put(ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE, code.toString());
178179
if (transport == ApiTracerContext.Transport.HTTP) {
179180
attributes.put(
180181
ObservabilityAttributes.HTTP_RESPONSE_STATUS_ATTRIBUTE, (long) code.getHttpStatusCode());
181-
} else {
182-
attributes.put(ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE, code.toString());
183182
}
184183
}
185184

sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/GoldenSignalsMetricsRecorderTest.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import static com.google.api.gax.tracing.GoldenSignalsMetricsRecorder.CLIENT_REQUEST_DURATION_METRIC_NAME;
3535
import static com.google.common.truth.Truth.assertThat;
3636

37+
import com.google.api.gax.rpc.LibraryMetadata;
3738
import com.google.common.collect.ImmutableMap;
3839
import io.opentelemetry.api.OpenTelemetry;
3940
import io.opentelemetry.api.common.AttributeKey;
@@ -62,7 +63,13 @@ void setUp() {
6263
SdkMeterProvider.builder().registerMetricReader(metricReader).build();
6364
OpenTelemetry openTelemetry =
6465
OpenTelemetrySdk.builder().setMeterProvider(meterProvider).build();
65-
recorder = new GoldenSignalsMetricsRecorder(openTelemetry, ARTIFACT_NAME);
66+
recorder =
67+
GoldenSignalsMetricsRecorder.create(
68+
openTelemetry,
69+
LibraryMetadata.newBuilder()
70+
.setArtifactName(ARTIFACT_NAME)
71+
.setVersion("1.2.3")
72+
.build());
6673
}
6774

6875
@Test
@@ -114,4 +121,27 @@ void recordOperationLatency_shouldRecordMetricAttributes() {
114121
assertThat(metricData.getHistogramData().getPoints().iterator().next().getAttributes())
115122
.isEqualTo(Attributes.of(AttributeKey.stringKey(ATTRIBUTE_1), VALUE_1));
116123
}
124+
125+
@Test
126+
void create_shouldReturnNull_whenLibraryMetadataIsNull() {
127+
GoldenSignalsMetricsRecorder actual =
128+
GoldenSignalsMetricsRecorder.create(OpenTelemetry.noop(), null);
129+
assertThat(actual).isNull();
130+
}
131+
132+
@Test
133+
void create_shouldReturnNull_whenArtifactNameIsNull() {
134+
LibraryMetadata metadata = LibraryMetadata.newBuilder().setVersion("1.0.0").build();
135+
GoldenSignalsMetricsRecorder actual =
136+
GoldenSignalsMetricsRecorder.create(OpenTelemetry.noop(), metadata);
137+
assertThat(actual).isNull();
138+
}
139+
140+
@Test
141+
void create_shouldReturnNull_whenArtifactNameIsEmpty() {
142+
LibraryMetadata metadata = LibraryMetadata.newBuilder().setArtifactName("").build();
143+
GoldenSignalsMetricsRecorder actual =
144+
GoldenSignalsMetricsRecorder.create(OpenTelemetry.noop(), metadata);
145+
assertThat(actual).isNull();
146+
}
117147
}

sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerTest.java

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import static com.google.common.truth.Truth.assertThat;
3434

3535
import com.google.api.gax.rpc.ApiException;
36+
import com.google.api.gax.rpc.LibraryMetadata;
3637
import com.google.api.gax.rpc.StatusCode;
3738
import com.google.api.gax.rpc.testing.FakeStatusCode;
3839
import com.google.common.testing.FakeTicker;
@@ -68,7 +69,12 @@ void setUp() {
6869
ticker = new FakeTicker();
6970
tracer =
7071
new GoldenSignalsMetricsTracer(
71-
new GoldenSignalsMetricsRecorder(openTelemetry, ARTIFACT_NAME),
72+
GoldenSignalsMetricsRecorder.create(
73+
openTelemetry,
74+
LibraryMetadata.newBuilder()
75+
.setArtifactName(ARTIFACT_NAME)
76+
.setVersion("1.2.3")
77+
.build()),
7278
ApiTracerContext.empty(),
7379
ticker);
7480
}
@@ -129,6 +135,8 @@ void operationCancelled_shouldRecordsOKStatus() {
129135
assertThat(metricData.getHistogramData().getPoints().iterator().next().getAttributes())
130136
.isEqualTo(
131137
Attributes.of(
138+
AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE),
139+
"CancellationException",
132140
AttributeKey.stringKey(RPC_RESPONSE_STATUS_ATTRIBUTE),
133141
StatusCode.Code.CANCELLED.toString()));
134142
}
@@ -163,7 +171,67 @@ void operationFailed_shouldRecordsOKStatus() {
163171
assertThat(metricData.getHistogramData().getPoints().iterator().next().getAttributes())
164172
.isEqualTo(
165173
Attributes.of(
174+
AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE),
175+
"INTERNAL",
166176
AttributeKey.stringKey(RPC_RESPONSE_STATUS_ATTRIBUTE),
167177
StatusCode.Code.INTERNAL.toString()));
168178
}
179+
180+
@Test
181+
void operationFailed_shouldRecordCancellationException() {
182+
java.util.concurrent.CancellationException error =
183+
new java.util.concurrent.CancellationException("test cancellation");
184+
tracer.operationFailed(error);
185+
186+
Collection<MetricData> metrics = metricReader.collectAllMetrics();
187+
assertThat(metrics).hasSize(1);
188+
MetricData metricData = metrics.iterator().next();
189+
190+
assertThat(metricData.getHistogramData().getPoints()).hasSize(1);
191+
assertThat(metricData.getHistogramData().getPoints().iterator().next().getAttributes())
192+
.isEqualTo(
193+
Attributes.of(
194+
AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE),
195+
"CancellationException",
196+
AttributeKey.stringKey(RPC_RESPONSE_STATUS_ATTRIBUTE),
197+
StatusCode.Code.CANCELLED.toString()));
198+
}
199+
200+
@Test
201+
void operationFailed_shouldRecordClientTimeout() {
202+
java.net.SocketTimeoutException error = new java.net.SocketTimeoutException("test timeout");
203+
tracer.operationFailed(error);
204+
205+
Collection<MetricData> metrics = metricReader.collectAllMetrics();
206+
assertThat(metrics).hasSize(1);
207+
MetricData metricData = metrics.iterator().next();
208+
209+
assertThat(metricData.getHistogramData().getPoints()).hasSize(1);
210+
assertThat(metricData.getHistogramData().getPoints().iterator().next().getAttributes())
211+
.isEqualTo(
212+
Attributes.of(
213+
AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE),
214+
"CLIENT_TIMEOUT",
215+
AttributeKey.stringKey(RPC_RESPONSE_STATUS_ATTRIBUTE),
216+
StatusCode.Code.UNKNOWN.toString()));
217+
}
218+
219+
@Test
220+
void operationFailed_shouldRecordClientRequestError() {
221+
IllegalArgumentException error = new IllegalArgumentException("test illegal argument");
222+
tracer.operationFailed(error);
223+
224+
Collection<MetricData> metrics = metricReader.collectAllMetrics();
225+
assertThat(metrics).hasSize(1);
226+
MetricData metricData = metrics.iterator().next();
227+
228+
assertThat(metricData.getHistogramData().getPoints()).hasSize(1);
229+
assertThat(metricData.getHistogramData().getPoints().iterator().next().getAttributes())
230+
.isEqualTo(
231+
Attributes.of(
232+
AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE),
233+
"CLIENT_REQUEST_ERROR",
234+
AttributeKey.stringKey(RPC_RESPONSE_STATUS_ATTRIBUTE),
235+
StatusCode.Code.UNKNOWN.toString()));
236+
}
169237
}

sdk-platform-java/hermetic_build/DEVELOPMENT.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,21 @@ python hermetic_build/library_generation/cli/entry_point.py generate \
190190
2. Set the version of gapic-generator-java
191191

192192
```shell
193-
LOCAL_GENERATOR_VERSION=$(mvn \
193+
export LOCAL_GENERATOR_VERSION=$(mvn \
194194
org.apache.maven.plugins:maven-help-plugin:evaluate \
195195
-Dexpression=project.version \
196-
-pl gapic-generator-java \
196+
-pl sdk-platform-java/gapic-generator-java \
197197
-DforceStdout \
198198
-q)
199199
```
200200

201-
3. Run the image
201+
3. Clone the googleapis repository (API definitions)
202+
```shell
203+
cd google-cloud-java
204+
git clone https://github.com/googleapis/googleapis
205+
```
206+
207+
4. Run the image
202208

203209
```shell
204210
# Assume you want to generate the library in the current working directory
@@ -208,13 +214,13 @@ python hermetic_build/library_generation/cli/entry_point.py generate \
208214
--quiet \
209215
-u "$(id -u):$(id -g)" \
210216
-v "$(pwd):/workspace" \
211-
-v /path/to/api-definitions:/workspace/apis \
217+
-v "$(pwd)/googleapis:/googleapis" \
212218
-e GENERATOR_VERSION="${LOCAL_GENERATOR_VERSION}" \
213219
local:image-tag \
214-
--generation-config-path=/workspace/generation_config_file \
215-
--library-names=apigee-connect,asset \
220+
--generation-config-path=/workspace/generation_config.yaml \
221+
--library-names=translate \
216222
--repository-path=/workspace \
217-
--api-definitions-path=/workspace/apis
223+
--api-definitions-path=/googleapis
218224
```
219225

220226
# Debugging tips

0 commit comments

Comments
 (0)