/// <summary> /// Manage Subscription Batch Usage. /// </summary> /// <param name="subscriptionBatchUsageRequest">The subscription batch usage request.</param> /// <returns> /// Subscription Usage. /// </returns> public async Task <MeteringBatchUsageResult> EmitBatchUsageEventAsync(IEnumerable <MeteringUsageRequest> subscriptionBatchUsageRequest) { this.Logger?.Info($"Inside ManageSubscriptionUsageAsync() of FulfillmentApiClient, with number of request items :: {subscriptionBatchUsageRequest.Count()} and trying to Manage Subscription Batch Usage :: {subscriptionBatchUsageRequest.FirstOrDefault()?.ResourceId}"); BatchUsageEvent batchUsageEvent = new BatchUsageEvent(); foreach (MeteringUsageRequest usage in subscriptionBatchUsageRequest) { batchUsageEvent.Request.Add(new UsageEvent() { ResourceId = usage.ResourceId, PlanId = usage.PlanId, Dimension = usage.Dimension, Quantity = usage.Quantity, EffectiveStartTime = usage.EffectiveStartTime, }); } try { var updateResult = (await this.meteringClient.Metering.PostBatchUsageEventAsync(batchUsageEvent)).Value; } catch (Exception ex) { this.ProcessErrorResponse(MarketplaceActionEnum.SUBSCRIPTION_BATCHUSAGEEVENT, ex); return(null); } return(new MeteringBatchUsageResult()); }
public virtual Response <BatchUsageEventOkResponse> PostBatchUsageEvent(BatchUsageEvent body, Guid?requestId = null, Guid?correlationId = null, CancellationToken cancellationToken = default) { using var scope = _clientDiagnostics.CreateScope("MeteringOperations.PostBatchUsageEvent"); scope.Start(); try { return(RestClient.PostBatchUsageEvent(body, requestId, correlationId, cancellationToken)); } catch (Exception e) { scope.Failed(e); throw; } }
public async Task PostBatchUsage() { var sut = this.InstrumentClient(this.GetMarketplaceMeteringClient()); var usageEvent1 = new Metering.Models.UsageEvent { ResourceId = Guid.Parse("da8dc4ae-4cdf-ed6b-e12e-9d0219306842"), Quantity = 20.5, Dimension = "dim1", // The time passed to Parse method should be the same as the recording EffectiveStartTime = this.Mode == RecordedTestMode.Playback ? DateTime.Parse("2021-03-15T18:06:00.4578027Z").ToUniversalTime() : DateTime.UtcNow.AddMinutes(-300), PlanId = "silver", }; var usageEvent2 = new Metering.Models.UsageEvent { ResourceUri = "/subscriptions/bf7adf12-c3a8-426c-9976-29f145eba70f/resourceGroups/ercmngd/providers/Microsoft.Solutions/applications/ercmdngd2231", Quantity = 20.5, Dimension = "dim1", // The time passed to Parse method should be the same as the recording EffectiveStartTime = this.Mode == RecordedTestMode.Playback ? DateTime.Parse("2021-03-15T18:06:00.4580942Z").ToUniversalTime() : DateTime.UtcNow.AddMinutes(-300), PlanId = "userassigned", }; var usageBatch = new BatchUsageEvent { Request = { usageEvent1, usageEvent2 } }; var result = await sut.Metering.PostBatchUsageEventAsync(usageBatch); Assert.IsTrue(result.Value.Result.All(r => r.Status == UsageEventStatusEnum.Accepted)); Assert.IsTrue(result.Value.Result.All(r => r.Quantity == 20.5)); Assert.AreEqual(result.Value.Count, 2); Assert.IsTrue(result.Value.Result.All(r => r.Error == default)); // Now get duplicates result = await sut.Metering.PostBatchUsageEventAsync(usageBatch); Assert.IsTrue(result.Value.Result.All(r => r.Status == UsageEventStatusEnum.Duplicate)); Assert.IsTrue(result.Value.Result.All(r => r.Error != default)); Assert.IsTrue(result.Value.Result.All(r => r.UsageEventId == default)); }