Skip to content

Commit 36c22b4

Browse files
authored
feat: non-transaction write fix, retry improvements, telemetry export (#206)
* feat: non-transaction write fix, retry improvements, telemetry export * revert back gradle (from upstream generator)
1 parent 7de8899 commit 36c22b4

File tree

13 files changed

+472
-50
lines changed

13 files changed

+472
-50
lines changed

.openapi-generator/FILES

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ src/main/java/dev/openfga/sdk/api/client/model/ClientWriteAssertionsResponse.jav
164164
src/main/java/dev/openfga/sdk/api/client/model/ClientWriteAuthorizationModelResponse.java
165165
src/main/java/dev/openfga/sdk/api/client/model/ClientWriteRequest.java
166166
src/main/java/dev/openfga/sdk/api/client/model/ClientWriteResponse.java
167+
src/main/java/dev/openfga/sdk/api/client/model/ClientWriteSingleResponse.java
168+
src/main/java/dev/openfga/sdk/api/client/model/ClientWriteStatus.java
167169
src/main/java/dev/openfga/sdk/api/configuration/AdditionalHeadersSupplier.java
168170
src/main/java/dev/openfga/sdk/api/configuration/ApiToken.java
169171
src/main/java/dev/openfga/sdk/api/configuration/BaseConfiguration.java
@@ -302,7 +304,10 @@ src/main/java/dev/openfga/sdk/telemetry/Histograms.java
302304
src/main/java/dev/openfga/sdk/telemetry/Metric.java
303305
src/main/java/dev/openfga/sdk/telemetry/Metrics.java
304306
src/main/java/dev/openfga/sdk/telemetry/Telemetry.java
307+
src/main/java/dev/openfga/sdk/util/ExponentialBackoff.java
305308
src/main/java/dev/openfga/sdk/util/Pair.java
309+
src/main/java/dev/openfga/sdk/util/RetryAfterHeaderParser.java
310+
src/main/java/dev/openfga/sdk/util/RetryStrategy.java
306311
src/main/java/dev/openfga/sdk/util/StringUtil.java
307312
src/main/java/dev/openfga/sdk/util/Validation.java
308313
src/test-integration/java/dev/openfga/sdk/api/OpenFgaApiIntegrationTest.java
@@ -317,6 +322,7 @@ src/test/java/dev/openfga/sdk/api/OpenFgaApiTest.java
317322
src/test/java/dev/openfga/sdk/api/auth/AccessTokenTest.java
318323
src/test/java/dev/openfga/sdk/api/auth/OAuth2ClientTest.java
319324
src/test/java/dev/openfga/sdk/api/client/ApiClientTest.java
325+
src/test/java/dev/openfga/sdk/api/client/HttpRequestAttemptRetryTest.java
320326
src/test/java/dev/openfga/sdk/api/client/OpenFgaClientTest.java
321327
src/test/java/dev/openfga/sdk/api/configuration/ClientCredentialsTest.java
322328
src/test/java/dev/openfga/sdk/api/configuration/ConfigurationTest.java
@@ -330,6 +336,9 @@ src/test/java/dev/openfga/sdk/telemetry/HistogramsTest.java
330336
src/test/java/dev/openfga/sdk/telemetry/MetricTest.java
331337
src/test/java/dev/openfga/sdk/telemetry/MetricsTest.java
332338
src/test/java/dev/openfga/sdk/telemetry/TelemetryTest.java
339+
src/test/java/dev/openfga/sdk/util/ExponentialBackoffTest.java
333340
src/test/java/dev/openfga/sdk/util/PairTest.java
341+
src/test/java/dev/openfga/sdk/util/RetryAfterHeaderParserTest.java
342+
src/test/java/dev/openfga/sdk/util/RetryStrategyTest.java
334343
src/test/java/dev/openfga/sdk/util/StringUtilTest.java
335344
src/test/java/dev/openfga/sdk/util/ValidationTest.java

example/example1/src/main/java/dev/openfga/sdk/example/Example1.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public void run(String apiUrl) throws Exception {
1818
if (System.getenv("FGA_CLIENT_ID") != null) {
1919
credentials = new Credentials(new ClientCredentials()
2020
.apiAudience(System.getenv("FGA_API_AUDIENCE"))
21-
.apiTokenIssuer(System.getenv("FGA_TOKEN_ISSUER"))
22-
.clientId("FGA_CLIENT_ID")
23-
.clientSecret("FGA_CLIENT_SECRET"));
21+
.apiTokenIssuer(System.getenv("FGA_API_TOKEN_ISSUER"))
22+
.clientId(System.getenv("FGA_CLIENT_ID"))
23+
.clientSecret(System.getenv("FGA_CLIENT_SECRET")));
2424
} else {
2525
System.out.println("Proceeding with no credentials (expecting localhost)");
2626
}
@@ -102,10 +102,20 @@ public void run(String apiUrl) throws Exception {
102102
fgaClient
103103
.write(
104104
new ClientWriteRequest()
105-
.writes(List.of(new ClientTupleKey()
106-
.user("user:anne")
107-
.relation("writer")
108-
._object("document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a"))),
105+
.writes(List.of(
106+
new ClientTupleKey()
107+
.user("user:anne")
108+
.relation("writer")
109+
._object("document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a"),
110+
new ClientTupleKey()
111+
.user("user:anne")
112+
.relation("writer")
113+
._object("document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a"), // duplicate
114+
new ClientTupleKey()
115+
.user("user:anne")
116+
.relation("owner")
117+
._object("document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a") // different relation
118+
)),
109119
new ClientWriteOptions()
110120
.disableTransactions(true)
111121
.authorizationModelId(authorizationModel.getAuthorizationModelId()))

settings.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
1+
pluginManagement {
2+
repositories {
3+
gradlePluginPortal()
4+
mavenCentral()
5+
}
6+
}
7+
18
rootProject.name = 'openfga-sdk'

src/main/java/dev/openfga/sdk/api/client/HttpRequestAttempt.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ private CompletableFuture<ApiResponse<T>> handleHttpErrorRetry(
125125
Duration retryDelay =
126126
RetryStrategy.calculateRetryDelay(retryAfterDelay, retryNumber, configuration.getMinimumRetryDelay());
127127

128+
// Add telemetry for HTTP error retry
129+
addTelemetryAttribute(Attributes.HTTP_REQUEST_RESEND_COUNT, String.valueOf(retryNumber + 1));
130+
128131
return delayedRetry(retryDelay, retryNumber + 1, error);
129132
}
130133

@@ -184,8 +187,13 @@ private CompletableFuture<ApiResponse<T>> processHttpResponse(
184187
response.headers().firstValue("fga-query-duration-ms").orElse(null);
185188

186189
if (!isNullOrWhitespace(queryDuration)) {
187-
double queryDurationDouble = Double.parseDouble(queryDuration);
188-
telemetry.metrics().queryDuration(queryDurationDouble, this.getTelemetryAttributes());
190+
try {
191+
double queryDurationDouble = Double.parseDouble(queryDuration);
192+
telemetry.metrics().queryDuration(queryDurationDouble, this.getTelemetryAttributes());
193+
} catch (NumberFormatException e) {
194+
// Ignore malformed fga-query-duration-ms header values to prevent exceptions
195+
// on otherwise valid responses. The telemetry metric will simply not be recorded.
196+
}
189197
}
190198
}
191199

0 commit comments

Comments
 (0)