[go: up one dir, main page]

Skip to content

Commit

Permalink
feat: Add support for batching configuration (#1164)
Browse files Browse the repository at this point in the history
* feat: Add support for batching configuration

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* Remove redundant batchingSettings.toBuilder().build() and rename to defaultBatchSettings

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
  • Loading branch information
losalex and gcf-owl-bot[bot] committed Oct 27, 2022
1 parent f6c4ebe commit 35be8d1
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 10 deletions.
32 changes: 32 additions & 0 deletions .readme-partials.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,38 @@ custom_content: |
> may lead to unexpected results such as absense of expected log entries or abnormal program execution.
> To avoid these unexpected results, it is recommended to use synchronous mode.
#### Controlling the batching settings
As mentioned before, in the asynchronous mode the call(s) to Logging API takes place asynchronously and few calls to `write()`
method may be batched together to compose a single call to Logging API. In order to control the batching settings, the `LoggingOptions`
is enhanced with `BatchingSettings` which can be set as shown in example below:
```java
import com.google.api.gax.batching.BatchingSettings;
import com.google.api.gax.batching.FlowControlSettings;
import com.google.api.gax.batching.FlowController;
LoggingOptions actual =
LoggingOptions.newBuilder()
.setBatchingSettings(
BatchingSettings.newBuilder()
.setIsEnabled(true)
.setElementCountThreshold(1000L)
.setRequestByteThreshold(1048576L)
.setDelayThreshold(Duration.ofMillis(50L))
.setFlowControlSettings(
FlowControlSettings.newBuilder()
.setMaxOutstandingElementCount(100000L)
.setMaxOutstandingRequestBytes(10485760L)
.setLimitExceededBehavior(
FlowController.LimitExceededBehavior.ThrowException)
.build())
.build())
.setProjectId('Your project ID')
.build();
```
You can find more information about batching parameters see [BatchingSettings](https://cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.batching.BatchingSettings).
#### Listing log entries
With Logging you can also list log entries that have been previously written. Add the following
Expand Down
32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,38 @@ NOTE:
> may lead to unexpected results such as absense of expected log entries or abnormal program execution.
> To avoid these unexpected results, it is recommended to use synchronous mode.
#### Controlling the batching settings
As mentioned before, in the asynchronous mode the call(s) to Logging API takes place asynchronously and few calls to `write()`
method may be batched together to compose a single call to Logging API. In order to control the batching settings, the `LoggingOptions`
is enhanced with `BatchingSettings` which can be set as shown in example below:

```java
import com.google.api.gax.batching.BatchingSettings;
import com.google.api.gax.batching.FlowControlSettings;
import com.google.api.gax.batching.FlowController;

LoggingOptions actual =
LoggingOptions.newBuilder()
.setBatchingSettings(
BatchingSettings.newBuilder()
.setIsEnabled(true)
.setElementCountThreshold(1000L)
.setRequestByteThreshold(1048576L)
.setDelayThreshold(Duration.ofMillis(50L))
.setFlowControlSettings(
FlowControlSettings.newBuilder()
.setMaxOutstandingElementCount(100000L)
.setMaxOutstandingRequestBytes(10485760L)
.setLimitExceededBehavior(
FlowController.LimitExceededBehavior.ThrowException)
.build())
.build())
.setProjectId('Your project ID')
.build();
```

You can find more information about batching parameters see [BatchingSettings](https://cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.batching.BatchingSettings).

#### Listing log entries

With Logging you can also list log entries that have been previously written. Add the following
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.google.cloud.logging;

import com.google.api.core.InternalApi;
import com.google.api.gax.batching.BatchingSettings;
import com.google.cloud.ServiceDefaults;
import com.google.cloud.ServiceOptions;
import com.google.cloud.ServiceRpc;
Expand All @@ -40,6 +41,7 @@ public class LoggingOptions extends ServiceOptions<Logging, LoggingOptions> {
private static final long serialVersionUID = 5753499510627426717L;

private Boolean autoPopulateMetadataOnWrite = null;
private BatchingSettings batchingSettings = null;

public static class DefaultLoggingFactory implements LoggingFactory {
private static final LoggingFactory INSTANCE = new DefaultLoggingFactory();
Expand Down Expand Up @@ -76,6 +78,7 @@ protected String getDefaultHost() {
public static class Builder extends ServiceOptions.Builder<Logging, LoggingOptions, Builder> {

private Boolean autoPopulateMetadataOnWrite = true;
private BatchingSettings batchingSettings = null;

private Builder() {}

Expand All @@ -98,6 +101,12 @@ public Builder setAutoPopulateMetadata(boolean autoPopulateMetadataOnWrite) {
return this;
}

@CanIgnoreReturnValue
public Builder setBatchingSettings(BatchingSettings batchingSettings) {
this.batchingSettings = batchingSettings;
return this;
}

@Override
public LoggingOptions build() {
return new LoggingOptions(this);
Expand All @@ -108,6 +117,8 @@ public LoggingOptions build() {
protected LoggingOptions(Builder builder) {
super(LoggingFactory.class, LoggingRpcFactory.class, builder, new LoggingDefaults());
this.autoPopulateMetadataOnWrite = builder.autoPopulateMetadataOnWrite;
this.batchingSettings =
builder.batchingSettings == null ? null : builder.batchingSettings.toBuilder().build();
}

@SuppressWarnings("serial")
Expand Down Expand Up @@ -146,6 +157,10 @@ public Boolean getAutoPopulateMetadata() {
return this.autoPopulateMetadataOnWrite;
}

public BatchingSettings getBatchingSettings() {
return this.batchingSettings;
}

@Override
public boolean equals(Object obj) {
return obj instanceof LoggingOptions && baseEquals((LoggingOptions) obj);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,20 +167,27 @@ public Void apply(UnaryCallSettings.Builder<?, ?> builder) {
// TODO(pongad): Take advantage of
// https://github.com/googleapis/gax-java/pull/452 when it's
// released.
BatchingSettings oldBatchSettings =
BatchingSettings defaultBatchSettings =
logBuilder.writeLogEntriesSettings().getBatchingSettings();

// The BatchingSettings from LoggingOptions should override
// ones provided in defaultBatchSettings
BatchingSettings batchingSettings = options.getBatchingSettings();

logBuilder
.writeLogEntriesSettings()
.setBatchingSettings(
oldBatchSettings
.toBuilder()
.setFlowControlSettings(
oldBatchSettings
.getFlowControlSettings()
.toBuilder()
.setLimitExceededBehavior(LimitExceededBehavior.Block)
.build())
.build());
batchingSettings != null
? batchingSettings
: defaultBatchSettings
.toBuilder()
.setFlowControlSettings(
defaultBatchSettings
.getFlowControlSettings()
.toBuilder()
.setLimitExceededBehavior(LimitExceededBehavior.Block)
.build())
.build());

configClient = ConfigClient.create(confBuilder.build());
loggingClient = LoggingClient.create(logBuilder.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,29 @@

import static org.easymock.EasyMock.createMock;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows;

import com.google.api.gax.batching.BatchingSettings;
import com.google.api.gax.batching.FlowControlSettings;
import com.google.api.gax.batching.FlowController;
import com.google.cloud.NoCredentials;
import com.google.cloud.TransportOptions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.threeten.bp.Duration;

@RunWith(JUnit4.class)
public class LoggingOptionsTest {
private static final Boolean DONT_AUTO_POPULATE_METADATA = false;
private static final String PROJECT_ID = "fake-project-id";
private static final Long ELEMENTS_TRESHOLD_COUNT = 100L;
private static final Long REQUEST_BYTE_TRESHOLD_COUNT = 10485760L;
private static final long DURATION = 501L;
private static final Long MAX_OUTSTANDING_ELEMENTS_COUNT = 1000001L;
private static final Long MAX_OUTSTANDING_REQUEST_BYTES_COUNT = 104857601L;

@Test
public void testNonGrpcTransportOptions() {
Expand All @@ -53,4 +65,59 @@ public void testAutoPopulateMetadataDefaultOption() {
LoggingOptions actual = LoggingOptions.newBuilder().setProjectId(PROJECT_ID).build();
assertEquals(Boolean.TRUE, actual.getAutoPopulateMetadata());
}

@Test
public void testBatchingSettingsDefaultOption() {
LoggingOptions actual = LoggingOptions.newBuilder().setProjectId(PROJECT_ID).build();
assertNull("Batching settings should be null by default!", actual.getBatchingSettings());
}

@Test
public void testBatchingSettingsOption() {
verifyBatchingSettings(generateLoggingOptions().getBatchingSettings());
}

@Test
public void testBatchingSettingsOptionWithGrpc() {
verifyBatchingSettings(
generateLoggingOptions().getService().getOptions().getBatchingSettings());
}

private static LoggingOptions generateLoggingOptions() {
return LoggingOptions.newBuilder()
.setBatchingSettings(
BatchingSettings.newBuilder()
.setIsEnabled(true)
.setElementCountThreshold(ELEMENTS_TRESHOLD_COUNT)
.setRequestByteThreshold(REQUEST_BYTE_TRESHOLD_COUNT)
.setDelayThreshold(Duration.ofMillis(DURATION))
.setFlowControlSettings(
FlowControlSettings.newBuilder()
.setMaxOutstandingElementCount(MAX_OUTSTANDING_ELEMENTS_COUNT)
.setMaxOutstandingRequestBytes(MAX_OUTSTANDING_REQUEST_BYTES_COUNT)
.setLimitExceededBehavior(
FlowController.LimitExceededBehavior.ThrowException)
.build())
.build())
.setProjectId(PROJECT_ID)
.setCredentials(NoCredentials.getInstance())
.build();
}

private static void verifyBatchingSettings(BatchingSettings settings) {
assertEquals(true, settings.getIsEnabled());
assertEquals(ELEMENTS_TRESHOLD_COUNT, settings.getElementCountThreshold());
assertEquals(REQUEST_BYTE_TRESHOLD_COUNT, settings.getRequestByteThreshold());
assertNotNull(settings.getDelayThreshold());
assertEquals(DURATION, settings.getDelayThreshold().toMillis());
assertEquals(
MAX_OUTSTANDING_ELEMENTS_COUNT,
settings.getFlowControlSettings().getMaxOutstandingElementCount());
assertEquals(
MAX_OUTSTANDING_REQUEST_BYTES_COUNT,
settings.getFlowControlSettings().getMaxOutstandingRequestBytes());
assertEquals(
FlowController.LimitExceededBehavior.ThrowException,
settings.getFlowControlSettings().getLimitExceededBehavior());
}
}

0 comments on commit 35be8d1

Please sign in to comment.