/// <summary>
        /// Update a ScraperTarget.
        /// </summary>
        /// <param name="scraperTargetId">id of the scraper target (required)</param>
        /// <param name="scraperTargetRequest">ScraperTargetRequest update to apply</param>
        /// <returns>updated ScraperTarget</returns>
        public Task <ScraperTargetResponse> UpdateScraperTargetAsync(string scraperTargetId,
                                                                     ScraperTargetRequest scraperTargetRequest)
        {
            Arguments.CheckNonEmptyString(scraperTargetId, nameof(scraperTargetId));
            Arguments.CheckNotNull(scraperTargetRequest, nameof(scraperTargetRequest));

            return(_service.PatchScrapersIDAsync(scraperTargetId, scraperTargetRequest));
        }
        /// <summary>
        /// Creates a new ScraperTarget and sets <see cref="ScraperTargetResponse.Id" /> with the new identifier.
        /// </summary>
        /// <param name="name">the name of the new ScraperTarget</param>
        /// <param name="url">the url of the new ScraperTarget</param>
        /// <param name="bucketId">the id of the bucket that its use to writes</param>
        /// <param name="orgId">the id of the organization that owns new ScraperTarget</param>
        /// <returns>created ScraperTarget</returns>
        public Task <ScraperTargetResponse> CreateScraperTargetAsync(string name, string url,
                                                                     string bucketId, string orgId)
        {
            Arguments.CheckNonEmptyString(name, nameof(name));
            Arguments.CheckNonEmptyString(url, nameof(url));
            Arguments.CheckNonEmptyString(bucketId, nameof(bucketId));
            Arguments.CheckNonEmptyString(orgId, nameof(orgId));

            var scrapperTarget =
                new ScraperTargetRequest(name, ScraperTargetRequest.TypeEnum.Prometheus, url, orgId, bucketId);

            return(CreateScraperTargetAsync(scrapperTarget));
        }
        /// <summary>
        /// Clone a ScraperTarget.
        /// </summary>
        /// <param name="clonedName">name of cloned ScraperTarget</param>
        /// <param name="scraperTargetResponse">ScraperTarget to clone</param>
        /// <returns>cloned ScraperTarget</returns>
        public async Task <ScraperTargetResponse> CloneScraperTargetAsync(string clonedName,
                                                                          ScraperTargetResponse scraperTargetResponse)
        {
            Arguments.CheckNonEmptyString(clonedName, nameof(clonedName));
            Arguments.CheckNotNull(scraperTargetResponse, nameof(scraperTargetResponse));

            var cloned = new ScraperTargetRequest(clonedName, scraperTargetResponse.Type, scraperTargetResponse.Url,
                                                  scraperTargetResponse.OrgID, scraperTargetResponse.BucketID);

            var created = await CreateScraperTargetAsync(cloned).ConfigureAwait(false);

            var labels = await GetLabelsAsync(scraperTargetResponse).ConfigureAwait(false);

            foreach (var label in labels)
            {
                await AddLabelAsync(label, created).ConfigureAwait(false);
            }

            return(created);
        }
        /// <summary>
        /// Clone a ScraperTarget.
        /// </summary>
        /// <param name="clonedName">name of cloned ScraperTarget</param>
        /// <param name="scraperTargetResponse">ScraperTarget to clone</param>
        /// <returns>cloned ScraperTarget</returns>
        public async Task <ScraperTargetResponse> CloneScraperTarget(string clonedName,
                                                                     ScraperTargetResponse scraperTargetResponse)
        {
            Arguments.CheckNonEmptyString(clonedName, nameof(clonedName));
            Arguments.CheckNotNull(scraperTargetResponse, nameof(scraperTargetResponse));

            var cloned = new ScraperTargetRequest(clonedName, scraperTargetResponse.Type, scraperTargetResponse.Url,
                                                  scraperTargetResponse.OrgID, scraperTargetResponse.BucketID);

            return(await CreateScraperTarget(cloned).ContinueWith(created =>
            {
                //
                // Add labels
                //
                return GetLabels(scraperTargetResponse)
                .ContinueWith(labels => { return labels.Result.Select(label => AddLabel(label, created.Result)); })
                .ContinueWith(async tasks =>
                {
                    await Task.WhenAll(tasks.Result);
                    return created.Result;
                })
                .Unwrap();
            }).Unwrap());
        }
        /// <summary>
        /// Creates a new ScraperTarget and sets <see cref="ScraperTargetResponse.Id" /> with the new identifier.
        /// </summary>
        /// <param name="scraperTargetRequest">the scraper to create</param>
        /// <returns>created ScraperTarget</returns>
        public Task <ScraperTargetResponse> CreateScraperTargetAsync(ScraperTargetRequest scraperTargetRequest)
        {
            Arguments.CheckNotNull(scraperTargetRequest, nameof(scraperTargetRequest));

            return(_service.PostScrapersAsync(scraperTargetRequest));
        }