Skip to content

Commit

Permalink
Merge pull request #2 from alzimmermsft/azcore_tracing
Browse files Browse the repository at this point in the history
Initial Implementation of Passing Tracing Context in Azure Core
  • Loading branch information
JonathanGiles authored May 9, 2019
2 parents 1c6bc90 + fd85f32 commit 111306c
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.azure.applicationconfig.models.SettingSelector;
import com.azure.common.ServiceClient;
import com.azure.common.exception.ServiceRequestException;
import com.azure.common.http.ContextData;
import com.azure.common.http.HttpPipeline;
import com.azure.common.http.rest.PagedResponse;
import com.azure.common.http.rest.Response;
Expand Down Expand Up @@ -71,7 +72,7 @@ public static ConfigurationAsyncClientBuilder builder() {
* string.
*/
public Mono<Response<ConfigurationSetting>> addSetting(String key, String value) {
return addSetting(new ConfigurationSetting().key(key).value(value));
return addSetting(new ConfigurationSetting().key(key).value(value), ContextData.NONE);
}

/**
Expand All @@ -87,12 +88,16 @@ public Mono<Response<ConfigurationSetting>> addSetting(String key, String value)
* {@link ConfigurationSetting#key() key} is an empty string.
*/
public Mono<Response<ConfigurationSetting>> addSetting(ConfigurationSetting setting) {
return addSetting(setting, ContextData.NONE);
}

public Mono<Response<ConfigurationSetting>> addSetting(ConfigurationSetting setting, ContextData contextData) {
// Validate that setting and key is not null. The key is used in the service URL so it cannot be null.
validateSetting(setting);

// This service method call is similar to setSetting except we're passing If-Not-Match = "*". If the service
// finds any existing configuration settings, then its e-tag will match and the service will return an error.
return service.setKey(serviceEndpoint, setting.key(), setting.label(), setting, null, getETagValue(ETAG_ANY));
return service.setKey(contextData, serviceEndpoint, setting.key(), setting.label(), setting, null, getETagValue(ETAG_ANY));
}

/**
Expand Down Expand Up @@ -128,6 +133,10 @@ public Mono<Response<ConfigurationSetting>> setSetting(String key, String value)
* setting exists and is locked, or {@link ConfigurationSetting#key() key} is an empty string.
*/
public Mono<Response<ConfigurationSetting>> setSetting(ConfigurationSetting setting) {
return setSetting(setting, ContextData.NONE);
}

public Mono<Response<ConfigurationSetting>> setSetting(ConfigurationSetting setting, ContextData contextData) {
// Validate that setting and key is not null. The key is used in the service URL so it cannot be null.
validateSetting(setting);

Expand All @@ -137,7 +146,8 @@ public Mono<Response<ConfigurationSetting>> setSetting(ConfigurationSetting sett
// Otherwise, the service throws an exception because the current configuration value was updated and we have an
// old value locally.
// If no etag value was passed in, then the value is always added or updated.
return service.setKey(serviceEndpoint, setting.key(), setting.label(), setting, getETagValue(setting.etag()), null);

return service.setKey(contextData, serviceEndpoint, setting.key(), setting.label(), setting, getETagValue(setting.etag()), null);
}

/**
Expand All @@ -152,7 +162,7 @@ public Mono<Response<ConfigurationSetting>> setSetting(ConfigurationSetting sett
* is locked. Or, if {@code key} is an empty string.
*/
public Mono<Response<ConfigurationSetting>> updateSetting(String key, String value) {
return updateSetting(new ConfigurationSetting().key(key).value(value));
return updateSetting(new ConfigurationSetting().key(key).value(value), ContextData.NONE);
}

/**
Expand All @@ -171,12 +181,16 @@ public Mono<Response<ConfigurationSetting>> updateSetting(String key, String val
* {@link ConfigurationSetting#etag() etag} is specified but does not match the current value.
*/
public Mono<Response<ConfigurationSetting>> updateSetting(ConfigurationSetting setting) {
return updateSetting(setting, ContextData.NONE);
}

public Mono<Response<ConfigurationSetting>> updateSetting(ConfigurationSetting setting, ContextData contextData) {
// Validate that setting and key is not null. The key is used in the service URL so it cannot be null.
validateSetting(setting);

String etag = setting.etag() == null ? ETAG_ANY : setting.etag();

return service.setKey(serviceEndpoint, setting.key(), setting.label(), setting, getETagValue(etag), null);
return service.setKey(contextData, serviceEndpoint, setting.key(), setting.label(), setting, getETagValue(etag), null);
}

/**
Expand All @@ -190,7 +204,7 @@ public Mono<Response<ConfigurationSetting>> updateSetting(ConfigurationSetting s
* empty string.
*/
public Mono<Response<ConfigurationSetting>> getSetting(String key) {
return getSetting(new ConfigurationSetting().key(key));
return getSetting(new ConfigurationSetting().key(key), ContextData.NONE);
}

/**
Expand All @@ -205,10 +219,14 @@ public Mono<Response<ConfigurationSetting>> getSetting(String key) {
* is an empty string.
*/
public Mono<Response<ConfigurationSetting>> getSetting(ConfigurationSetting setting) {
return getSetting(setting, ContextData.NONE);
}

public Mono<Response<ConfigurationSetting>> getSetting(ConfigurationSetting setting, ContextData contextData) {
// Validate that setting and key is not null. The key is used in the service URL so it cannot be null.
validateSetting(setting);

return service.getKeyValue(serviceEndpoint, setting.key(), setting.label(), null, null, null, null);
return service.getKeyValue(contextData, serviceEndpoint, setting.key(), setting.label(), null, null, null, null);
}

/**
Expand All @@ -221,7 +239,7 @@ public Mono<Response<ConfigurationSetting>> getSetting(ConfigurationSetting sett
* @throws ServiceRequestException If {@code key} is an empty string.
*/
public Mono<Response<ConfigurationSetting>> deleteSetting(String key) {
return deleteSetting(new ConfigurationSetting().key(key));
return deleteSetting(new ConfigurationSetting().key(key), ContextData.NONE);
}

/**
Expand All @@ -241,10 +259,14 @@ public Mono<Response<ConfigurationSetting>> deleteSetting(String key) {
* specified, not the wildcard character, and does not match the current etag value.
*/
public Mono<Response<ConfigurationSetting>> deleteSetting(ConfigurationSetting setting) {
return deleteSetting(setting, ContextData.NONE);
}

public Mono<Response<ConfigurationSetting>> deleteSetting(ConfigurationSetting setting, ContextData contextData) {
// Validate that setting and key is not null. The key is used in the service URL so it cannot be null.
validateSetting(setting);

return service.delete(serviceEndpoint, setting.key(), setting.label(), getETagValue(setting.etag()), null);
return service.delete(contextData, serviceEndpoint, setting.key(), setting.label(), getETagValue(setting.etag()), null);
}

/**
Expand All @@ -256,15 +278,19 @@ public Mono<Response<ConfigurationSetting>> deleteSetting(ConfigurationSetting s
* contains all of the current settings in the service.
*/
public Flux<ConfigurationSetting> listSettings(SettingSelector options) {
return listSettings(options, ContextData.NONE);
}

public Flux<ConfigurationSetting> listSettings(SettingSelector options, ContextData contextData) {
Mono<PagedResponse<ConfigurationSetting>> result;
if (options != null) {
String fields = getSelectQuery(options.fields());
result = service.listKeyValues(serviceEndpoint, options.key(), options.label(), fields, options.acceptDateTime());
result = service.listKeyValues(contextData, serviceEndpoint, options.key(), options.label(), fields, options.acceptDateTime());
} else {
result = service.listKeyValues(serviceEndpoint, null, null, null, null);
result = service.listKeyValues(contextData, serviceEndpoint, null, null, null, null);
}

return result.flatMapMany(this::extractAndFetchConfigurationSettings);
return result.flatMapMany(r -> extractAndFetchConfigurationSettings(r, contextData));
}

/**
Expand All @@ -279,15 +305,19 @@ public Flux<ConfigurationSetting> listSettings(SettingSelector options) {
* @return Revisions of the ConfigurationSetting
*/
public Flux<ConfigurationSetting> listSettingRevisions(SettingSelector selector) {
return listSettingRevisions(selector, ContextData.NONE);
}

public Flux<ConfigurationSetting> listSettingRevisions(SettingSelector selector, ContextData contextData) {
Mono<PagedResponse<ConfigurationSetting>> result;
if (selector != null) {
String fields = getSelectQuery(selector.fields());
result = service.listKeyValueRevisions(serviceEndpoint, selector.key(), selector.label(), fields, selector.acceptDateTime(), null);
result = service.listKeyValueRevisions(contextData, serviceEndpoint, selector.key(), selector.label(), fields, selector.acceptDateTime(), null);
} else {
result = service.listKeyValueRevisions(serviceEndpoint, null, null, null, null, null);
result = service.listKeyValueRevisions(contextData, serviceEndpoint, null, null, null, null, null);
}

return result.flatMapMany(this::extractAndFetchConfigurationSettings);
return result.flatMapMany(r -> extractAndFetchConfigurationSettings(r, contextData));
}

/*
Expand All @@ -298,17 +328,17 @@ public Flux<ConfigurationSetting> listSettingRevisions(SettingSelector selector)
* operations.
* @return A stream of {@link ConfigurationSetting} from the next page of results.
*/
private Flux<ConfigurationSetting> listSettings(String nextPageLink) {
Mono<PagedResponse<ConfigurationSetting>> result = service.listKeyValues(serviceEndpoint, nextPageLink);
return result.flatMapMany(this::extractAndFetchConfigurationSettings);
private Flux<ConfigurationSetting> listSettings(String nextPageLink, ContextData contextData) {
Mono<PagedResponse<ConfigurationSetting>> result = service.listKeyValues(contextData, serviceEndpoint, nextPageLink);
return result.flatMapMany(r -> extractAndFetchConfigurationSettings(r, contextData));
}

private Publisher<ConfigurationSetting> extractAndFetchConfigurationSettings(PagedResponse<ConfigurationSetting> page) {
private Publisher<ConfigurationSetting> extractAndFetchConfigurationSettings(PagedResponse<ConfigurationSetting> page, ContextData contextData) {
String nextPageLink = page.nextLink();
if (nextPageLink == null) {
return Flux.fromIterable(page.items());
}
return Flux.fromIterable(page.items()).concatWith(listSettings(nextPageLink));
return Flux.fromIterable(page.items()).concatWith(listSettings(nextPageLink, contextData));
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.azure.common.annotations.ReturnValueWireType;
import com.azure.common.annotations.UnexpectedResponseExceptionType;
import com.azure.common.exception.ServiceRequestException;
import com.azure.common.http.ContextData;
import com.azure.common.http.rest.PagedResponse;
import com.azure.common.http.rest.Response;
import com.azure.common.implementation.http.ContentType;
Expand All @@ -34,53 +35,53 @@ interface ConfigurationService {
@GET("kv/{key}")
@ExpectedResponses({200})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
Mono<Response<ConfigurationSetting>> getKeyValue(@HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
Mono<Response<ConfigurationSetting>> getKeyValue(ContextData contextData, @HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
@QueryParam("$select") String fields, @HeaderParam("Accept-Datetime") String acceptDatetime,
@HeaderParam("If-Match") String ifMatch, @HeaderParam("If-None-Match") String ifNoneMatch);

@PUT("kv/{key}")
@ExpectedResponses({200})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
Mono<Response<ConfigurationSetting>> setKey(@HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
Mono<Response<ConfigurationSetting>> setKey(ContextData contextData, @HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
@BodyParam(ContentType.APPLICATION_JSON) ConfigurationSetting keyValueParameters,
@HeaderParam("If-Match") String ifMatch, @HeaderParam("If-None-Match") String ifNoneMatch);

@DELETE("kv/{key}")
@ExpectedResponses({200, 204})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
Mono<Response<ConfigurationSetting>> delete(@HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
Mono<Response<ConfigurationSetting>> delete(ContextData contextData, @HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
@HeaderParam("If-Match") String ifMatch, @HeaderParam("If-None-Match") String ifNoneMatch);

@PUT("locks/{key}")
@ExpectedResponses({200})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
Mono<Response<ConfigurationSetting>> lockKeyValue(@HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
Mono<Response<ConfigurationSetting>> lockKeyValue(ContextData contextData, @HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
@HeaderParam("If-Match") String ifMatch, @HeaderParam("If-None-Match") String ifNoneMatch);

@DELETE("locks/{key}")
@ExpectedResponses({200})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
Mono<Response<ConfigurationSetting>> unlockKeyValue(@HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
Mono<Response<ConfigurationSetting>> unlockKeyValue(ContextData contextData, @HostParam("url") String url, @PathParam("key") String key, @QueryParam("label") String label,
@HeaderParam("If-Match") String ifMatch, @HeaderParam("If-None-Match") String ifNoneMatch);

@GET("kv")
@ExpectedResponses({200})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
@ReturnValueWireType(ConfigurationSettingPage.class)
Mono<PagedResponse<ConfigurationSetting>> listKeyValues(@HostParam("url") String url, @QueryParam("key") String key, @QueryParam("label") String label,
Mono<PagedResponse<ConfigurationSetting>> listKeyValues(ContextData contextData, @HostParam("url") String url, @QueryParam("key") String key, @QueryParam("label") String label,
@QueryParam("$select") String fields, @HeaderParam("Accept-Datetime") String acceptDatetime);

@GET("{nextUrl}")
@ExpectedResponses({200})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
@ReturnValueWireType(ConfigurationSettingPage.class)
Mono<PagedResponse<ConfigurationSetting>> listKeyValues(@HostParam("url") String url, @PathParam(value = "nextUrl", encoded = true) String nextUrl);
Mono<PagedResponse<ConfigurationSetting>> listKeyValues(ContextData contextData, @HostParam("url") String url, @PathParam(value = "nextUrl", encoded = true) String nextUrl);

@GET("revisions")
@ExpectedResponses({200, 206})
@UnexpectedResponseExceptionType(ServiceRequestException.class)
@ReturnValueWireType(ConfigurationSettingPage.class)
Mono<PagedResponse<ConfigurationSetting>> listKeyValueRevisions(@HostParam("url") String url,
Mono<PagedResponse<ConfigurationSetting>> listKeyValueRevisions(ContextData contextData, @HostParam("url") String url,
@QueryParam("key") String key, @QueryParam("label") String label, @QueryParam("$select") String fields,
@HeaderParam("Accept-Datetime") String acceptDatetime, @HeaderParam("Range") String range);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@
import com.azure.applicationconfig.models.ConfigurationSetting;
import com.azure.applicationconfig.models.SettingFields;
import com.azure.applicationconfig.models.SettingSelector;
import com.azure.common.test.TestBase;
import com.azure.common.test.TestMode;
import com.azure.common.exception.ServiceRequestException;
import com.azure.common.http.HttpClient;
import com.azure.common.http.policy.HttpLogDetailLevel;
import com.azure.common.http.rest.Response;
import com.azure.common.test.TestBase;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.junit.Ignore;
import org.junit.Rule;
Expand All @@ -29,7 +28,6 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.function.BiConsumer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.azure.common.AzureEnvironment;
import com.azure.common.credentials.AsyncServiceClientCredentials;
import com.azure.common.credentials.ServiceClientCredentials;
import com.azure.common.http.ContextData;
import com.azure.common.http.HttpMethod;
import com.azure.common.http.HttpPipeline;
import com.azure.common.http.HttpRequest;
Expand Down Expand Up @@ -256,7 +257,7 @@ public static <A> A create(Class<A> swaggerInterface, AzureEnvironment azureEnvi
}

@Override
protected Object handleHttpResponse(final HttpRequest httpRequest, Mono<HttpDecodedResponse> asyncHttpResponse, final SwaggerMethodParser methodParser, Type returnType) {
protected Object handleHttpResponse(final HttpRequest httpRequest, Mono<HttpDecodedResponse> asyncHttpResponse, final SwaggerMethodParser methodParser, Type returnType, ContextData contextData) {
if (TypeUtil.isTypeOrSubTypeOf(returnType, Flux.class)) {
final Type operationStatusType = ((ParameterizedType) returnType).getActualTypeArguments()[0];
if (!TypeUtil.isTypeOrSubTypeOf(operationStatusType, OperationStatus.class)) {
Expand All @@ -279,7 +280,7 @@ protected Object handleHttpResponse(final HttpRequest httpRequest, Mono<HttpDeco
} else {
final Mono<HttpResponse> lastAsyncHttpResponse = createPollStrategy(httpRequest, asyncHttpResponse, methodParser)
.flatMap((Function<PollStrategy, Mono<HttpResponse>>) pollStrategy -> pollStrategy.pollUntilDone());
return handleRestReturnType(new HttpResponseDecoder(this.serializer()).decode(lastAsyncHttpResponse, methodParser), methodParser, returnType);
return handleRestReturnType(new HttpResponseDecoder(this.serializer()).decode(lastAsyncHttpResponse, methodParser), methodParser, returnType, contextData);
}
}

Expand Down
Loading

0 comments on commit 111306c

Please sign in to comment.