All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.azure.ai.metricsadvisor.MetricsAdvisorClientBuilder Maven / Gradle / Ivy

The newest version!
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.ai.metricsadvisor;

import com.azure.ai.metricsadvisor.implementation.MetricsAdvisorImpl;
import com.azure.ai.metricsadvisor.implementation.MetricsAdvisorImplBuilder;
import com.azure.ai.metricsadvisor.models.MetricsAdvisorKeyCredential;
import com.azure.core.annotation.ServiceClientBuilder;
import com.azure.core.client.traits.ConfigurationTrait;
import com.azure.core.client.traits.EndpointTrait;
import com.azure.core.client.traits.HttpTrait;
import com.azure.core.client.traits.TokenCredentialTrait;
import com.azure.core.credential.TokenCredential;
import com.azure.core.http.ContentType;
import com.azure.core.http.HttpClient;
import com.azure.core.http.HttpHeaders;
import com.azure.core.http.HttpPipeline;
import com.azure.core.http.HttpPipelineBuilder;
import com.azure.core.http.policy.AddDatePolicy;
import com.azure.core.http.policy.AddHeadersPolicy;
import com.azure.core.http.policy.BearerTokenAuthenticationPolicy;
import com.azure.core.http.policy.HttpLogDetailLevel;
import com.azure.core.http.policy.HttpLogOptions;
import com.azure.core.http.policy.HttpLoggingPolicy;
import com.azure.core.http.policy.HttpPipelinePolicy;
import com.azure.core.http.policy.HttpPolicyProviders;
import com.azure.core.http.policy.RequestIdPolicy;
import com.azure.core.http.policy.RetryOptions;
import com.azure.core.http.policy.RetryPolicy;
import com.azure.core.http.policy.UserAgentPolicy;
import com.azure.core.util.ClientOptions;
import com.azure.core.util.Configuration;
import com.azure.core.util.CoreUtils;
import com.azure.core.util.HttpClientOptions;
import com.azure.core.util.TracingOptions;
import com.azure.core.util.builder.ClientBuilderUtil;
import com.azure.core.util.logging.ClientLogger;
import com.azure.core.util.tracing.Tracer;
import com.azure.core.util.tracing.TracerProvider;

import java.net.MalformedURLException;
import java.net.URL;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * This class provides a fluent builder API to help instantiation of {@link MetricsAdvisorClient MetricsAdvisorClients}
 * and {@link MetricsAdvisorAsyncClient MetricsAdvisorAsyncClients}, call {@link #buildClient()} buildClient} and
 * {@link #buildAsyncClient() buildAsyncClient} respectively to construct an instance of the desired client.
 *
 * 

* The client needs the service endpoint of the Azure Metrics Advisor to access the resource service. * {@link #credential(MetricsAdvisorKeyCredential)} gives the builder access to credential. *

* *

Instantiating an asynchronous Metrics Advisor Client

* * *
 * MetricsAdvisorAsyncClient metricsAdvisorAsyncClient =
 *     new MetricsAdvisorClientBuilder()
 *         .credential(new MetricsAdvisorKeyCredential("{subscription_key}", "{api_key}"))
 *         .endpoint("{endpoint}")
 *         .buildAsyncClient();
 * 
* * *

Instantiating a synchronous Metrics Advisor Client

* * *
 * MetricsAdvisorClient metricsAdvisorClient =
 *     new MetricsAdvisorClientBuilder()
 *         .credential(new MetricsAdvisorKeyCredential("{subscription_key}", "{api_key}"))
 *         .endpoint("{endpoint}")
 *         .buildClient();
 * 
* * *

* Another way to construct the client is using a {@link HttpPipeline}. The pipeline gives the client an * authenticated way to communicate with the service. Set the pipeline with {@link #pipeline(HttpPipeline) this} and * set the service endpoint with {@link #endpoint(String) this}. Using a * pipeline requires additional setup but allows for finer control on how the {@link MetricsAdvisorClient} and * {@link MetricsAdvisorAsyncClient} is built. *

* * *
 * HttpPipeline pipeline = new HttpPipelineBuilder()
 *     .policies(/* add policies */)
 *     .build();
 *
 * MetricsAdvisorClient metricsAdvisorClient =
 *     new MetricsAdvisorClientBuilder()
 *         .credential(new MetricsAdvisorKeyCredential("{subscription_key}", "{api_key}"))
 *         .endpoint("{endpoint}")
 *         .pipeline(pipeline)
 *         .buildClient();
 * 
* * * @see MetricsAdvisorAsyncClient * @see MetricsAdvisorClient */ @ServiceClientBuilder(serviceClients = { MetricsAdvisorAsyncClient.class, MetricsAdvisorClient.class }) public final class MetricsAdvisorClientBuilder implements ConfigurationTrait, EndpointTrait, HttpTrait, TokenCredentialTrait { private static final String ECHO_REQUEST_ID_HEADER = "x-ms-return-client-request-id"; private static final String CONTENT_TYPE_HEADER_VALUE = ContentType.APPLICATION_JSON; private static final String ACCEPT_HEADER = "Accept"; private static final String METRICSADVISOR_PROPERTIES = "azure-ai-metricsadvisor.properties"; private static final String NAME = "name"; private static final String VERSION = "version"; private static final String METRICS_ADVISOR_TRACING_NAMESPACE_VALUE = "Microsoft.CognitiveServices"; private static final RetryPolicy DEFAULT_RETRY_POLICY = new RetryPolicy("retry-after-ms", ChronoUnit.MILLIS); private static final String DEFAULT_SCOPE = "https://cognitiveservices.azure.com/.default"; private static final HttpLogOptions DEFAULT_LOG_OPTIONS = new HttpLogOptions(); private static final ClientOptions DEFAULT_CLIENT_OPTIONS = new ClientOptions(); private final ClientLogger logger = new ClientLogger(MetricsAdvisorClientBuilder.class); private final List policies; private final HttpHeaders headers; private final String clientName; private final String clientVersion; private String endpoint; private MetricsAdvisorKeyCredential metricsAdvisorKeyCredential; private TokenCredential tokenCredential; private HttpClient httpClient; private HttpLogOptions httpLogOptions; private ClientOptions clientOptions; private HttpPipeline httpPipeline; private Configuration configuration; private RetryPolicy retryPolicy; private RetryOptions retryOptions; private MetricsAdvisorServiceVersion version; static final String OCP_APIM_SUBSCRIPTION_KEY = "Ocp-Apim-Subscription-Key"; static final String API_KEY = "x-api-key"; /** * The constructor with defaults. */ public MetricsAdvisorClientBuilder() { policies = new ArrayList<>(); httpLogOptions = new HttpLogOptions(); Map properties = CoreUtils.getProperties(METRICSADVISOR_PROPERTIES); clientName = properties.getOrDefault(NAME, "UnknownName"); clientVersion = properties.getOrDefault(VERSION, "UnknownVersion"); headers = new HttpHeaders().set(ECHO_REQUEST_ID_HEADER, "true").set(ACCEPT_HEADER, CONTENT_TYPE_HEADER_VALUE); } /** * Creates a {@link MetricsAdvisorClient} based on options set in the builder. Every time * {@code buildClient()} is called a new instance of {@link MetricsAdvisorClient} is created. * *

* If {@link #pipeline(HttpPipeline) pipeline} is set, then the {@code pipeline} and * {@link #endpoint(String) endpoint} are used to create the {@link MetricsAdvisorClient client}. All other builder * settings are ignored. *

* * @return A MetricsAdvisorClient with the options set from the builder. * @throws NullPointerException if {@link #endpoint(String) endpoint} or * {@link #credential(MetricsAdvisorKeyCredential)} has not been set. * @throws IllegalArgumentException if {@link #endpoint(String) endpoint} cannot be parsed into a valid URL. * @throws IllegalStateException If both {@link #retryOptions(RetryOptions)} * and {@link #retryPolicy(RetryPolicy)} have been set. */ public MetricsAdvisorClient buildClient() { // Endpoint cannot be null, which is required in request authentication Objects.requireNonNull(endpoint, "'Endpoint' is required and can not be null."); // Global Env configuration store final Configuration buildConfiguration = (configuration == null) ? Configuration.getGlobalConfiguration().clone() : configuration; // Service Version final MetricsAdvisorServiceVersion serviceVersion = version != null ? version : MetricsAdvisorServiceVersion.getLatest(); HttpPipeline pipeline = httpPipeline; // Create a default Pipeline if it is not given if (pipeline == null) { pipeline = getDefaultHttpPipeline(buildConfiguration); } final MetricsAdvisorImpl advisorRestAPIOpenAPIV2 = new MetricsAdvisorImplBuilder().endpoint(endpoint).pipeline(pipeline).buildClient(); return new MetricsAdvisorClient(advisorRestAPIOpenAPIV2, serviceVersion); } /** * Creates a {@link MetricsAdvisorAsyncClient} based on options set in the builder. Every time * {@code buildAsyncClient()} is called a new instance of {@link MetricsAdvisorAsyncClient} is created. * *

* If {@link #pipeline(HttpPipeline) pipeline} is set, then the {@code pipeline} and * {@link #endpoint(String) endpoint} are used to create the {@link MetricsAdvisorClient client}. All other builder * settings are ignored. *

* * @return A MetricsAdvisorAsyncClient with the options set from the builder. * @throws NullPointerException if {@link #endpoint(String) endpoint} or * {@link #credential(MetricsAdvisorKeyCredential)} * has not been set. * @throws IllegalArgumentException if {@link #endpoint(String) endpoint} cannot be parsed into a valid URL. * @throws IllegalStateException If both {@link #retryOptions(RetryOptions)} * and {@link #retryPolicy(RetryPolicy)} have been set. */ public MetricsAdvisorAsyncClient buildAsyncClient() { // Endpoint cannot be null, which is required in request authentication Objects.requireNonNull(endpoint, "'Endpoint' is required and can not be null."); // Global Env configuration store final Configuration buildConfiguration = (configuration == null) ? Configuration.getGlobalConfiguration().clone() : configuration; // Service Version final MetricsAdvisorServiceVersion serviceVersion = version != null ? version : MetricsAdvisorServiceVersion.getLatest(); HttpPipeline pipeline = httpPipeline; // Create a default Pipeline if it is not given if (pipeline == null) { pipeline = getDefaultHttpPipeline(buildConfiguration); } final MetricsAdvisorImpl advisorRestAPIOpenAPIV2 = new MetricsAdvisorImplBuilder().endpoint(endpoint).pipeline(pipeline).buildClient(); return new MetricsAdvisorAsyncClient(advisorRestAPIOpenAPIV2, serviceVersion); } private HttpPipeline getDefaultHttpPipeline(Configuration buildConfiguration) { // Closest to API goes first, closest to wire goes last. final List policies = new ArrayList<>(); // Authentications if (tokenCredential != null) { policies.add(new BearerTokenAuthenticationPolicy(tokenCredential, DEFAULT_SCOPE)); } else if (!CoreUtils.isNullOrEmpty(metricsAdvisorKeyCredential.getKeys().getSubscriptionKey()) || !CoreUtils.isNullOrEmpty(metricsAdvisorKeyCredential.getKeys().getApiKey())) { headers.set(OCP_APIM_SUBSCRIPTION_KEY, metricsAdvisorKeyCredential.getKeys().getSubscriptionKey()); headers.set(API_KEY, metricsAdvisorKeyCredential.getKeys().getApiKey()); } else { // Throw exception that credential cannot be null throw logger.logExceptionAsError( new IllegalArgumentException("Missing credential information while building a client.")); } ClientOptions buildClientOptions = this.clientOptions == null ? DEFAULT_CLIENT_OPTIONS : this.clientOptions; HttpLogOptions buildLogOptions = this.httpLogOptions == null ? DEFAULT_LOG_OPTIONS : this.httpLogOptions; final String applicationId = CoreUtils.getApplicationId(buildClientOptions, buildLogOptions); policies.add(new UserAgentPolicy(applicationId, clientName, clientVersion, buildConfiguration)); policies.add(new RequestIdPolicy()); policies.add(new AddHeadersPolicy(headers)); HttpPolicyProviders.addBeforeRetryPolicies(policies); policies.add(ClientBuilderUtil.validateAndGetRetryPolicy(retryPolicy, retryOptions, DEFAULT_RETRY_POLICY)); policies.add(new AddDatePolicy()); policies.add(new HttpLoggingPolicy(httpLogOptions)); policies.addAll(this.policies); HttpPolicyProviders.addAfterRetryPolicies(policies); TracingOptions tracingOptions = null; if (clientOptions != null) { tracingOptions = clientOptions.getTracingOptions(); } Tracer tracer = TracerProvider.getDefaultProvider() .createTracer(clientName, clientVersion, METRICS_ADVISOR_TRACING_NAMESPACE_VALUE, tracingOptions); return new HttpPipelineBuilder().policies(policies.toArray(new HttpPipelinePolicy[0])) .httpClient(httpClient) .tracer(tracer) .build(); } /** * Sets the service endpoint for the Azure Metrics Advisor instance. * * @param endpoint The URL of the Azure Metrics Advisor instance service requests to and receive responses from. * * @return The updated MetricsAdvisorClientBuilder object. * @throws NullPointerException if {@code endpoint} is null * @throws IllegalArgumentException if {@code endpoint} cannot be parsed into a valid URL. */ @Override public MetricsAdvisorClientBuilder endpoint(String endpoint) { Objects.requireNonNull(endpoint, "'endpoint' cannot be null."); try { new URL(endpoint); } catch (MalformedURLException ex) { throw logger.logExceptionAsWarning(new IllegalArgumentException("'endpoint' must be a valid URL.", ex)); } if (endpoint.endsWith("/")) { this.endpoint = endpoint.substring(0, endpoint.length() - 1); } else { this.endpoint = endpoint; } return this; } /** * Sets the {@link TokenCredential} used to authorize requests sent to the service. Refer to the Azure SDK for Java * identity and authentication * documentation for more details on proper usage of the {@link TokenCredential} type. * * @param tokenCredential {@link TokenCredential} used to authorize requests sent to the service. * @return The updated {@link MetricsAdvisorClientBuilder} object. * @throws NullPointerException If {@code tokenCredential} is null. */ @Override public MetricsAdvisorClientBuilder credential(TokenCredential tokenCredential) { this.tokenCredential = Objects.requireNonNull(tokenCredential, "'tokenCredential' cannot be null."); return this; } /** * Sets the {@link MetricsAdvisorKeyCredential} to use when authenticating HTTP requests for this * MetricsAdvisorClientBuilder. * * @param metricsAdvisorKeyCredential {@link MetricsAdvisorKeyCredential} API key credential * * @return The updated MetricsAdvisorClientBuilder object. * @throws NullPointerException If {@code metricsAdvisorKeyCredential} is null. */ public MetricsAdvisorClientBuilder credential(MetricsAdvisorKeyCredential metricsAdvisorKeyCredential) { this.metricsAdvisorKeyCredential = Objects.requireNonNull(metricsAdvisorKeyCredential, "'metricsAdvisorKeyCredential' cannot be null."); return this; } /** * Sets the {@link HttpLogOptions logging configuration} to use when sending and receiving requests to and from * the service. If a {@code logLevel} is not provided, default value of {@link HttpLogDetailLevel#NONE} is set. * *

Note: It is important to understand the precedence order of the HttpTrait APIs. In * particular, if a {@link HttpPipeline} is specified, this takes precedence over all other APIs in the trait, and * they will be ignored. If no {@link HttpPipeline} is specified, a HTTP pipeline will be constructed internally * based on the settings provided to this trait. Additionally, there may be other APIs in types that implement this * trait that are also ignored if an {@link HttpPipeline} is specified, so please be sure to refer to the * documentation of types that implement this trait to understand the full set of implications.

* * @param logOptions The {@link HttpLogOptions logging configuration} to use when sending and receiving requests to * and from the service. * * @return The updated MetricsAdvisorClientBuilder object. */ @Override public MetricsAdvisorClientBuilder httpLogOptions(HttpLogOptions logOptions) { this.httpLogOptions = logOptions; return this; } /** * Allows for setting common properties such as application ID, headers, proxy configuration, etc. Note that it is * recommended that this method be called with an instance of the {@link HttpClientOptions} * class (a subclass of the {@link ClientOptions} base class). The HttpClientOptions subclass provides more * configuration options suitable for HTTP clients, which is applicable for any class that implements this HttpTrait * interface. * *

Note: It is important to understand the precedence order of the HttpTrait APIs. In * particular, if a {@link HttpPipeline} is specified, this takes precedence over all other APIs in the trait, and * they will be ignored. If no {@link HttpPipeline} is specified, a HTTP pipeline will be constructed internally * based on the settings provided to this trait. Additionally, there may be other APIs in types that implement this * trait that are also ignored if an {@link HttpPipeline} is specified, so please be sure to refer to the * documentation of types that implement this trait to understand the full set of implications.

* * @param clientOptions A configured instance of {@link HttpClientOptions}. * @return The updated MetricsAdvisorClientBuilder object. * @see HttpClientOptions */ @Override public MetricsAdvisorClientBuilder clientOptions(ClientOptions clientOptions) { this.clientOptions = clientOptions; return this; } /** * Adds a {@link HttpPipelinePolicy pipeline policy} to apply on each request sent. * *

Note: It is important to understand the precedence order of the HttpTrait APIs. In * particular, if a {@link HttpPipeline} is specified, this takes precedence over all other APIs in the trait, and * they will be ignored. If no {@link HttpPipeline} is specified, a HTTP pipeline will be constructed internally * based on the settings provided to this trait. Additionally, there may be other APIs in types that implement this * trait that are also ignored if an {@link HttpPipeline} is specified, so please be sure to refer to the * documentation of types that implement this trait to understand the full set of implications.

* * @param policy A {@link HttpPipelinePolicy pipeline policy}. * * @return The updated MetricsAdvisorClientBuilder object. * @throws NullPointerException If {@code policy} is null. */ @Override public MetricsAdvisorClientBuilder addPolicy(HttpPipelinePolicy policy) { policies.add(Objects.requireNonNull(policy, "'policy' cannot be null.")); return this; } /** * Sets the {@link HttpClient} to use for sending and receiving requests to and from the service. * *

Note: It is important to understand the precedence order of the HttpTrait APIs. In * particular, if a {@link HttpPipeline} is specified, this takes precedence over all other APIs in the trait, and * they will be ignored. If no {@link HttpPipeline} is specified, a HTTP pipeline will be constructed internally * based on the settings provided to this trait. Additionally, there may be other APIs in types that implement this * trait that are also ignored if an {@link HttpPipeline} is specified, so please be sure to refer to the * documentation of types that implement this trait to understand the full set of implications.

* * @param client The {@link HttpClient} to use for requests. * * @return The updated MetricsAdvisorClientBuilder object. */ @Override public MetricsAdvisorClientBuilder httpClient(HttpClient client) { if (this.httpClient != null && client == null) { logger.info("HttpClient is being set to 'null' when it was previously configured."); } this.httpClient = client; return this; } /** * Sets the {@link HttpPipeline} to use for the service client. * *

Note: It is important to understand the precedence order of the HttpTrait APIs. In * particular, if a {@link HttpPipeline} is specified, this takes precedence over all other APIs in the trait, and * they will be ignored. If no {@link HttpPipeline} is specified, a HTTP pipeline will be constructed internally * based on the settings provided to this trait. Additionally, there may be other APIs in types that implement this * trait that are also ignored if an {@link HttpPipeline} is specified, so please be sure to refer to the * documentation of types that implement this trait to understand the full set of implications.

*

* If {@code pipeline} is set, all other settings are ignored, aside from * {@link MetricsAdvisorClientBuilder#endpoint(String) endpoint} to build {@link MetricsAdvisorAsyncClient} or * {@link MetricsAdvisorClient}. * * @param httpPipeline {@link HttpPipeline} to use for sending service requests and receiving responses. * * @return The updated MetricsAdvisorClientBuilder object. */ @Override public MetricsAdvisorClientBuilder pipeline(HttpPipeline httpPipeline) { if (this.httpPipeline != null && httpPipeline == null) { logger.info("HttpPipeline is being set to 'null' when it was previously configured."); } this.httpPipeline = httpPipeline; return this; } /** * Sets the configuration store that is used during construction of the service client. *

* The default configuration store is a clone of the {@link Configuration#getGlobalConfiguration() global * configuration store}, use {@link Configuration#NONE} to bypass using configuration settings during construction. * * @param configuration The configuration store used to. * * @return The updated MetricsAdvisorClientBuilder object. */ @Override public MetricsAdvisorClientBuilder configuration(Configuration configuration) { this.configuration = configuration; return this; } /** * Sets the {@link RetryPolicy#RetryPolicy()} that is used when each request is sent. *

* The default retry policy will be used if not provided {@link MetricsAdvisorClientBuilder#buildAsyncClient()} * to build {@link MetricsAdvisorAsyncClient} or {@link MetricsAdvisorClient}. *

* Setting this is mutually exclusive with using {@link #retryOptions(RetryOptions)}. * * @param retryPolicy user's retry policy applied to each request. * * @return The updated MetricsAdvisorClientBuilder object. */ public MetricsAdvisorClientBuilder retryPolicy(RetryPolicy retryPolicy) { this.retryPolicy = retryPolicy; return this; } /** * Sets the {@link RetryOptions} for all the requests made through the client. * *

Note: It is important to understand the precedence order of the HttpTrait APIs. In * particular, if a {@link HttpPipeline} is specified, this takes precedence over all other APIs in the trait, and * they will be ignored. If no {@link HttpPipeline} is specified, a HTTP pipeline will be constructed internally * based on the settings provided to this trait. Additionally, there may be other APIs in types that implement this * trait that are also ignored if an {@link HttpPipeline} is specified, so please be sure to refer to the * documentation of types that implement this trait to understand the full set of implications.

*

* Setting this is mutually exclusive with using {@link #retryPolicy(RetryPolicy)}. * * @param retryOptions The {@link RetryOptions} to use for all the requests made through the client. * * @return The updated DocumentModelAdministrationClientBuilder object. */ @Override public MetricsAdvisorClientBuilder retryOptions(RetryOptions retryOptions) { this.retryOptions = retryOptions; return this; } /** * Sets the {@link MetricsAdvisorServiceVersion} that is used when making API requests. *

* If a service version is not provided, the service version that will be used will be the latest known service * version based on the version of the client library being used. If no service version is specified, updating to a * newer version the client library will have the result of potentially moving to a newer service version. * * @param version {@link MetricsAdvisorServiceVersion} of the service to be used when making requests. * * @return The updated MetricsAdvisorClientBuilder object. */ public MetricsAdvisorClientBuilder serviceVersion(MetricsAdvisorServiceVersion version) { this.version = version; return this; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy