Skip to content

Commit 3d6e6e3

Browse files
committed
CM-1582: Implemented RestApiClient.registerExperiment(). Refactored send/get methods for better clarity.
1 parent da2b00c commit 3d6e6e3

File tree

2 files changed

+65
-55
lines changed

2 files changed

+65
-55
lines changed

comet-java-client/src/main/java/ml/comet/experiment/impl/BaseExperiment.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@
1212
import ml.comet.experiment.Experiment;
1313
import ml.comet.experiment.exception.CometApiException;
1414
import ml.comet.experiment.exception.CometGeneralException;
15-
import ml.comet.experiment.impl.constants.ApiEndpoints;
1615
import ml.comet.experiment.impl.constants.AssetType;
1716
import ml.comet.experiment.impl.constants.QueryParamName;
1817
import ml.comet.experiment.impl.http.Connection;
1918
import ml.comet.experiment.impl.http.ConnectionInitializer;
2019
import ml.comet.experiment.impl.utils.CometUtils;
21-
import ml.comet.experiment.impl.utils.JsonUtils;
2220
import ml.comet.experiment.model.AddExperimentTagsRest;
2321
import ml.comet.experiment.model.AddGraphRest;
2422
import ml.comet.experiment.model.CreateExperimentRequest;
@@ -149,7 +147,7 @@ private void validateInitialParams() throws IllegalArgumentException {
149147
}
150148

151149
/**
152-
* Registers experiment at the Comet server.
150+
* Synchronously registers experiment at the Comet server.
153151
*
154152
* @throws CometGeneralException if failed to register experiment.
155153
*/
@@ -159,19 +157,16 @@ void registerExperiment() throws CometGeneralException {
159157
return;
160158
}
161159

162-
CreateExperimentRequest request = new CreateExperimentRequest(workspaceName, projectName, getExperimentName());
163-
String body = JsonUtils.toJson(request);
164-
165-
this.connection.sendPost(body, ApiEndpoints.NEW_EXPERIMENT, true)
166-
.ifPresent(response -> {
167-
CreateExperimentResponse result = JsonUtils.fromJson(response, CreateExperimentResponse.class);
168-
this.experimentKey = result.getExperimentKey();
169-
this.experimentLink = result.getLink();
160+
// do synchronous call to register experiment
161+
CreateExperimentResponse result = this.restApiClient.registerExperiment(
162+
new CreateExperimentRequest(this.workspaceName, this.projectName, this.experimentName))
163+
.blockingGet();
164+
this.experimentKey = result.getExperimentKey();
165+
this.experimentLink = result.getLink();
170166

171-
getLogger().info("Experiment is live on comet.ml " + this.experimentLink);
172-
});
167+
getLogger().info("Experiment is live on comet.ml " + this.experimentLink);
173168

174-
if (this.experimentKey == null) {
169+
if (StringUtils.isEmpty(this.experimentKey)) {
175170
throw new CometGeneralException("Failed to register onlineExperiment with Comet ML");
176171
}
177172
}

comet-java-client/src/main/java/ml/comet/experiment/impl/RestApiClient.java

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
import ml.comet.experiment.impl.utils.JsonUtils;
1111
import ml.comet.experiment.model.AddExperimentTagsRest;
1212
import ml.comet.experiment.model.AddGraphRest;
13-
import ml.comet.experiment.model.GitMetadata;
13+
import ml.comet.experiment.model.CreateExperimentRequest;
14+
import ml.comet.experiment.model.CreateExperimentResponse;
1415
import ml.comet.experiment.model.ExperimentAssetListResponse;
1516
import ml.comet.experiment.model.ExperimentMetadataRest;
1617
import ml.comet.experiment.model.ExperimentStatusResponse;
@@ -21,6 +22,7 @@
2122
import ml.comet.experiment.model.GetOutputResponse;
2223
import ml.comet.experiment.model.GetProjectsResponse;
2324
import ml.comet.experiment.model.GetWorkspacesResponse;
25+
import ml.comet.experiment.model.GitMetadata;
2426
import ml.comet.experiment.model.GitMetadataRest;
2527
import ml.comet.experiment.model.HtmlRest;
2628
import ml.comet.experiment.model.LogDataResponse;
@@ -34,7 +36,6 @@
3436
import java.util.Collections;
3537
import java.util.HashMap;
3638
import java.util.Map;
37-
import java.util.Optional;
3839

3940
import static ml.comet.experiment.impl.constants.ApiEndpoints.ADD_GIT_METADATA;
4041
import static ml.comet.experiment.impl.constants.ApiEndpoints.ADD_GRAPH;
@@ -56,6 +57,7 @@
5657
import static ml.comet.experiment.impl.constants.ApiEndpoints.GET_OUTPUT;
5758
import static ml.comet.experiment.impl.constants.ApiEndpoints.GET_PARAMETERS;
5859
import static ml.comet.experiment.impl.constants.ApiEndpoints.GET_TAGS;
60+
import static ml.comet.experiment.impl.constants.ApiEndpoints.NEW_EXPERIMENT;
5961
import static ml.comet.experiment.impl.constants.ApiEndpoints.PROJECTS;
6062
import static ml.comet.experiment.impl.constants.ApiEndpoints.SET_EXPERIMENT_STATUS;
6163
import static ml.comet.experiment.impl.constants.ApiEndpoints.WORKSPACES;
@@ -78,113 +80,118 @@ final class RestApiClient implements Disposable {
7880
}
7981

8082
Single<GetWorkspacesResponse> getAllWorkspaces() {
81-
return singleGetResponse(WORKSPACES, Collections.emptyMap(), GetWorkspacesResponse.class);
83+
return singleFromSyncGet(WORKSPACES, Collections.emptyMap(), GetWorkspacesResponse.class);
8284
}
8385

8486
Single<GetProjectsResponse> getAllProjects(String workspaceName) {
85-
return singleGetResponse(
87+
return singleFromSyncGet(
8688
PROJECTS, Collections.singletonMap(WORKSPACE_NAME, workspaceName), GetProjectsResponse.class);
8789
}
8890

8991
Single<GetExperimentsResponse> getAllExperiments(String projectId) {
90-
return singleGetResponse(
92+
return singleFromSyncGet(
9193
EXPERIMENTS, Collections.singletonMap(PROJECT_ID, projectId), GetExperimentsResponse.class);
9294
}
9395

9496
Single<ExperimentMetadataRest> getMetadata(String experimentKey) {
95-
return singleGetForExperiment(GET_METADATA, experimentKey, ExperimentMetadataRest.class);
97+
return singleFromSyncGet(GET_METADATA, experimentKey, ExperimentMetadataRest.class);
9698
}
9799

98100
Single<GitMetadataRest> getGitMetadata(String experimentKey) {
99-
return singleGetForExperiment(GET_GIT_METADATA, experimentKey, GitMetadataRest.class);
101+
return singleFromSyncGet(GET_GIT_METADATA, experimentKey, GitMetadataRest.class);
100102
}
101103

102104
Single<GetHtmlResponse> getHtml(String experimentKey) {
103-
return singleGetForExperiment(GET_HTML, experimentKey, GetHtmlResponse.class);
105+
return singleFromSyncGet(GET_HTML, experimentKey, GetHtmlResponse.class);
104106
}
105107

106108
Single<GetOutputResponse> getOutput(String experimentKey) {
107-
return singleGetForExperiment(GET_OUTPUT, experimentKey, GetOutputResponse.class);
109+
return singleFromSyncGet(GET_OUTPUT, experimentKey, GetOutputResponse.class);
108110
}
109111

110112
Single<GetGraphResponse> getGraph(String experimentKey) {
111-
return singleGetForExperiment(GET_GRAPH, experimentKey, GetGraphResponse.class);
113+
return singleFromSyncGet(GET_GRAPH, experimentKey, GetGraphResponse.class);
112114
}
113115

114116
Single<MinMaxResponse> getParameters(String experimentKey) {
115-
return singleGetForExperiment(GET_PARAMETERS, experimentKey, MinMaxResponse.class);
117+
return singleFromSyncGet(GET_PARAMETERS, experimentKey, MinMaxResponse.class);
116118
}
117119

118120
Single<MinMaxResponse> getMetrics(String experimentKey) {
119-
return singleGetForExperiment(GET_METRICS, experimentKey, MinMaxResponse.class);
121+
return singleFromSyncGet(GET_METRICS, experimentKey, MinMaxResponse.class);
120122
}
121123

122124
Single<MinMaxResponse> getLogOther(String experimentKey) {
123-
return singleGetForExperiment(GET_LOG_OTHER, experimentKey, MinMaxResponse.class);
125+
return singleFromSyncGet(GET_LOG_OTHER, experimentKey, MinMaxResponse.class);
124126
}
125127

126128
Single<TagsResponse> getTags(String experimentKey) {
127-
return singleGetForExperiment(GET_TAGS, experimentKey, TagsResponse.class);
129+
return singleFromSyncGet(GET_TAGS, experimentKey, TagsResponse.class);
128130
}
129131

130132
Single<ExperimentAssetListResponse> getAssetList(String experimentKey, AssetType type) {
131133
HashMap<QueryParamName, String> params = new HashMap<QueryParamName, String>() {{
132134
put(EXPERIMENT_KEY, experimentKey);
133135
put(TYPE, type.type());
134136
}};
135-
return singleGetResponse(GET_ASSET_INFO, params, ExperimentAssetListResponse.class);
137+
return singleFromSyncGet(GET_ASSET_INFO, params, ExperimentAssetListResponse.class);
136138
}
137139

138140
Single<ExperimentStatusResponse> sendExperimentStatus(String experimentKey) {
139-
return singleGetForExperiment(SET_EXPERIMENT_STATUS, experimentKey, ExperimentStatusResponse.class);
141+
return singleFromSyncGet(SET_EXPERIMENT_STATUS, experimentKey, ExperimentStatusResponse.class);
140142
}
141143

142144
Single<LogDataResponse> logMetric(final MetricRest request, String experimentKey) {
143145
request.setExperimentKey(experimentKey);
144-
return singleFromPost(request, ADD_METRIC, LogDataResponse.class);
146+
return singleFromAsyncPost(request, ADD_METRIC, LogDataResponse.class);
145147
}
146148

147149
Single<LogDataResponse> logParameter(final ParameterRest request, String experimentKey) {
148150
request.setExperimentKey(experimentKey);
149-
return singleFromPost(request, ADD_PARAMETER, LogDataResponse.class);
151+
return singleFromAsyncPost(request, ADD_PARAMETER, LogDataResponse.class);
150152
}
151153

152154
Single<LogDataResponse> logOutputLine(final OutputUpdate request, String experimentKey) {
153155
request.setExperimentKey(experimentKey);
154-
return singleFromPost(request, ADD_OUTPUT, LogDataResponse.class);
156+
return singleFromAsyncPost(request, ADD_OUTPUT, LogDataResponse.class);
155157
}
156158

157159
Single<LogDataResponse> logHtml(final HtmlRest request, String experimentKey) {
158160
request.setExperimentKey(experimentKey);
159-
return singleFromPost(request, ADD_HTML, LogDataResponse.class);
161+
return singleFromAsyncPost(request, ADD_HTML, LogDataResponse.class);
160162
}
161163

162164
Single<LogDataResponse> logOther(final LogOtherRest request, String experimentKey) {
163165
request.setExperimentKey(experimentKey);
164-
return singleFromPost(request, ADD_LOG_OTHER, LogDataResponse.class);
166+
return singleFromAsyncPost(request, ADD_LOG_OTHER, LogDataResponse.class);
165167
}
166168

167169
Single<LogDataResponse> addTag(final AddExperimentTagsRest request, String experimentKey) {
168170
request.setExperimentKey(experimentKey);
169-
return singleFromPost(request, ADD_TAG, LogDataResponse.class);
171+
return singleFromAsyncPost(request, ADD_TAG, LogDataResponse.class);
170172
}
171173

172174
Single<LogDataResponse> logGraph(final AddGraphRest request, String experimentKey) {
173175
request.setExperimentKey(experimentKey);
174-
return singleFromPost(request, ADD_GRAPH, LogDataResponse.class);
176+
return singleFromAsyncPost(request, ADD_GRAPH, LogDataResponse.class);
175177
}
176178

177179
Single<LogDataResponse> logStartEndTime(final ExperimentTimeRequest request, String experimentKey) {
178180
request.setExperimentKey(experimentKey);
179-
return singleFromPost(request, ADD_START_END_TIME, LogDataResponse.class);
181+
return singleFromAsyncPost(request, ADD_START_END_TIME, LogDataResponse.class);
180182
}
181183

182-
Single<LogDataResponse>logGitMetadata(final GitMetadata request, String experimentKey) {
184+
Single<LogDataResponse> logGitMetadata(final GitMetadata request, String experimentKey) {
183185
request.setExperimentKey(experimentKey);
184-
return singleFromPost(request, ADD_GIT_METADATA, LogDataResponse.class);
186+
return singleFromAsyncPost(request, ADD_GIT_METADATA, LogDataResponse.class);
187+
}
188+
189+
Single<CreateExperimentResponse> registerExperiment(final CreateExperimentRequest request) {
190+
return singleFromSyncPost(request, NEW_EXPERIMENT, true, CreateExperimentResponse.class);
185191
}
186192

187-
private <T> Single<T> singleFromPost(@NonNull Object payload, @NonNull String endpoint, @NonNull Class<T> clazz) {
193+
private <T> Single<T> singleFromAsyncPost(
194+
@NonNull Object payload, @NonNull String endpoint, @NonNull Class<T> clazz) {
188195
if (isDisposed()) {
189196
return Single.error(ALREADY_DISPOSED);
190197
}
@@ -194,31 +201,39 @@ private <T> Single<T> singleFromPost(@NonNull Object payload, @NonNull String en
194201
.map(response -> JsonUtils.fromJson(response.getResponseBody(), clazz));
195202
}
196203

197-
private <T> Single<T> singleGetForExperiment(@NonNull String endpoint,
198-
@NonNull String experimentKey,
199-
@NonNull Class<T> clazz) {
200-
return singleGetResponse(endpoint, Collections.singletonMap(EXPERIMENT_KEY, experimentKey), clazz);
204+
private <T> Single<T> singleFromSyncPost(@NonNull Object payload,
205+
@NonNull String endpoint,
206+
boolean throwOnFailure,
207+
@NonNull Class<T> clazz) {
208+
if (isDisposed()) {
209+
return Single.error(ALREADY_DISPOSED);
210+
}
211+
212+
String request = JsonUtils.toJson(payload);
213+
return this.connection.sendPostWithRetries(request, endpoint, throwOnFailure)
214+
.map(body -> Single.just(JsonUtils.fromJson(body, clazz)))
215+
.orElse(Single.error(new CometApiException(
216+
String.format("No response was returned by endpoint: %s", endpoint))));
201217
}
202218

203-
private <T> Single<T> singleGetResponse(@NonNull String endpoint,
219+
private <T> Single<T> singleFromSyncGet(@NonNull String endpoint,
220+
@NonNull String experimentKey,
221+
@NonNull Class<T> clazz) {
222+
return singleFromSyncGet(endpoint, Collections.singletonMap(EXPERIMENT_KEY, experimentKey), clazz);
223+
}
224+
225+
private <T> Single<T> singleFromSyncGet(@NonNull String endpoint,
204226
@NonNull Map<QueryParamName, String> params,
205227
@NonNull Class<T> clazz) {
206228
if (isDisposed()) {
207229
return Single.error(ALREADY_DISPOSED);
208230
}
209-
return optionalGetRestObject(endpoint, params, clazz)
210-
.map(Single::just)
231+
return this.connection.sendGetWithRetries(endpoint, params)
232+
.map(body -> Single.just(JsonUtils.fromJson(body, clazz)))
211233
.orElse(Single.error(new CometApiException(
212234
String.format("No response was returned by endpoint: %s", endpoint))));
213235
}
214236

215-
private <T> Optional<T> optionalGetRestObject(@NonNull String endpoint,
216-
@NonNull Map<QueryParamName, String> params,
217-
@NonNull Class<T> clazz) {
218-
return connection.sendGet(endpoint, params)
219-
.map(body -> JsonUtils.fromJson(body, clazz));
220-
}
221-
222237
@Override
223238
public void dispose() {
224239
this.disposed = true;

0 commit comments

Comments
 (0)