如何将您的计费系统与使用情况计量系统集成
本博文是“Windows Server 和 System Center 2012 R2 新增功能”系列博文(共 9 篇)之一,该系列是 Brad Anderson 的云端瞭望博客中的精选内容。今天的博文将介绍服务提供商在启用租户资源利用率的计费和退款方面的使用体验,以及它如何应用于 Brad 的“转型数据中心”这一更大的主题。若要阅读该博文并查看讨论的其他技术,请阅读今天的博文:2012 R2 新增功能:服务提供商和租户 IaaS 使用体验。
如该博文中所述,为服务提供商启用计费方案是该版本的一个主要投入方面。服务提供商在缺少跟踪并报告租户资源利用率的系统的情况下无法成功地将所提供的服务实现货币化。这些服务需要订阅才能提供,因此,在订阅粒度上报告资源利用率以协助计费方案至关重要。
使用情况计量系统概述
使用情况计量系统与服务管理 API 同样位于 Windows Azure Pack (WAP) 堆栈中,从而使其能够访问 WAP 堆栈中提供的所有服务的租户利用率数据,并提供用于与提供商的计费系统集成的 REST API,如下图中所示。
服务提供商对其自有计费系统已投入很多,2012 R2 版本能够与现有系统集成至关重要。因此,我们进行了目标明确的投资,以确保 2012 R2 与各计费提供程序和市场中的 ITFM(IT 财务管理)产品轻松集成。
值得注意的是,2012 R2 版本中没有推出计费系统。服务提供商必须创建计费集成模块(也称为“计费适配器”)才能为其所使用的计费系统提供数据。
现在,让我们更加深入地了解一下使用情况计量系统的构建基块以及它是如何架构的。
使用情况计量系统拥有四个主要组件。其中三个组件(数据生成器、数据收集器和使用率数据库)是系统内部组件,第四个组件(使用情况 API)是一个面向外部的 API,计费适配器其交互以提取租户资源利用率数据。
数据生成器
数据生成器层代表注册作为系统一部分的服务(资源提供程序)。它们收集特定于订阅的信息并将其提供给使用情况收集器。使用情况收集器希望信息在某个特定数据协定签订后可用。该协定在所有提供程序之间都是相同的。系统中的所有提供程序都遵守此协定来提供信息。Windows Azure Pack 中的 IaaS 指标由虚拟机云资源提供程序提供。
数据收集器
数据收集器是内部组件,用于定期收集来自所有注册数据生成器的使用情况信息并将其存储在使用率数据库中。
使用率数据库
使用率数据库是一个临时存储区,将来自各个数据生成器的所有数据存储 30-40 天的期限。希望的情况就是在此期间,计费系统已出于计费目的从此数据库中提取数据。
使用情况 API
这是一个基于 REST 的 API,是从使用率数据库提取数据的唯一方式。由于服务提供程序通常拥有一个允许它们每月为其订户生成帐单的计费系统。客户可以凭借通过使用情况 API 从使用率数据库提取数据来轻松创建与其计费系统的集成。客户开发用于与其计费系统集成的组件称为“计费适配器”,其作为使用情况计量系统与客户计费系统之间的桥梁。
在下面的图文块中,在红色圆圈中,您可以看到虚拟机云资源提供程序,旁边是其他资源提供程序,如服务总线,生成 IaaS 资源利用率数据,该数据收集并存储在使用率数据库中并通过使用情况 API 可用。
使用情况 API 可用于创建计费适配器并与提供程序数据中心内的计费系统交互。在下面的图文块中,您可以看到用于集成使用情况计量系统和提供程序数据中心内的计费提供程序的“计费适配器”的角色。
“服务报告”组件及其提供的分析在标题为“使用 Excel 和 Performance Point 创建使用情况分析报告”的博文中进行了论述,而该博文也详细介绍了如何创建“计费适配器”。
与使用情况计量系统交互
本部分介绍了外部系统与使用情况计量系统交互的方式。通过使用情况 API 可使用两种不同类型的信息:
- 所有订阅的租户资源利用率
- 计划、附加项、订阅和帐户信息
该信息通过两个通道提供:
- 查询所有历史数据的使用情况 API
- 实时 CRUD 事件,通过事件通知系统。
计费适配器使用这些通道能够有效创建计费报告,同时能够在计划、订阅和帐户在环境中得以创建和管理时实时作出响应。
使用情况 API(在使用情况端点上公开)
使用情况数据
使用情况端点公开 API 以返回与各服务中的每一个订阅有关的租户资源利用率数据。调用方(“计费适配器”)需要提供“startid”。此参数会通知使用情况计量系统从该 ID 开始返回使用情况数据。计费适配器根据为后续调用返回的记录数量向前推进“startid”。
方法名称 |
API |
响应 |
GET |
UsageRecordList<UsageRecord> |
计划\附加项\订阅数据
使用情况端点还会公开 API 以返回有关现有计划、附加项、订阅等信息。
方法名称 |
API |
响应 |
|||||||||||||||
GET |
billing/plans?startId={startId}&batchSize={batchSize} |
UsageEventList<Plan> |
GET |
billing/addons?startId={startId}&batchSize={batchSize} |
UsageEventList<AddOn> |
GET |
billing/subscriptions?startId={startId}&batchSize={batchSize} |
UsageEventList<Subscription> |
GET |
billing/planServices?startId={startId}&batchSize={batchSize} |
UsageEventList<ResourceProviderReference> |
GET |
billing/planAddons?startId={startId}&batchSize={batchSize} |
UsageEventList<AddOnReference> |
GET |
billing/subscriptionAddons?startId={startId}&batchSize={batchSize} |
UsageEventList<AddOnReference> |
说明:
STARTID 是您想要在特定周期中提取的第一条记录的记录 ID。
BATCHSIZE 是您想要提取的最大记录数。
USAGE-RESTAPI-ENDPOINT 可以在 :30022">https://<Admin-API-Machine-Name>:30022)
- 定义请求头
- 设置媒体类型(application/json 或 application/xml)
- 授权类型(基本)
- 用户名和密码
- 构造 URI 以查询使用情况计量服务
- StartID 是您要提取的第一条记录的记录 ID,BatchSize 是您需要提取的最大记录数。
- 执行 API 调用并读取使用情况数据
- 数据合约可用于反序列化返回的响应(如下面的示例中所示)
使用情况数据模型
下面的图文块中显示的使用情况数据模型可用于关联使用情况 API 返回的数据。
事件通知系统
服务管理 API 跟踪使用情况计量系统内的事件,并向任何注册的订户(例如,计费适配器)发送通知。这些事件的示例包括计划、附加项、订阅创建\更新和帐户创建。
通知作为 Post 调用被发送至通过使用情况计量系统注册的端点。管理服务 PowerShell 模块应用于定义所需通知端点。请注意,notificationEndPoint 必须以尾部反斜杠结束。
描述:
订阅计划、附加项和帐户更改。
|
命令 | 参数 | ||||||||||||||||
|
|
|
SubscriberType:
- BillingService
- MandatoryService
- OptionalService
示例:
Set-MgmtSvcNotificationSubscriber -Name Billing –SubscriberType BillingService -Enabled $false -Endpoint https://localhost/ -AuthenticationMode Basic
可设置计费适配器以采用阻止或非阻止方式处理事件。SubscriberType BillingService 和 MandatoryService 均为阻止。唯一的非阻止选项为 OptionalService。如果计费适配器设置为阻止,服务管理 API 中的计划创建事件应触发要在计费系统中创建的相应计划。如果此操作不成功,在服务管理 API 上的计划创建也将失败。这实现了平台与计费系统之间的一致性。
通知数据合约
发送给计费适配器的通知符合类型 - NotificationEvent<T> 类型。T 可由以下对象取代。
- Plan
- PlanAddOn
- AdminSubscription
- ResourceProviderReference
- PlanAddOnReference
- PlanAddOnReference
当下载 WAP (Windows Azure Pack) 时,可通过以下路径找到数据合约:
· \SampleBillingAdapter\DataContracts\*
下面是 NotificationEvent 的两个重要属性
1.NotificationEvent Method 可以具有以下值:
1.Post,用以创建新的帐户/订阅/附加项/计划
2.Delete,用以删除帐户/订阅/加载项/计划
3.将更新发布到计划
2.当创建\更新\删除任何上述对象时,NotificationEvent Entity 都会发送一个事件。
定价 API
定价 API 为服务提供程序数据中心中的计费系统而设计,用于指定流入 2012 R2 系统的计划和附加项的价格。计费适配器可选择实时为每个计划或计划附加项提供价格。作为实施通知订户的一部分,我们拥有以下 API 的规范,以便可以实施计费服务以使定价数据能够流回系统中。这些 API 的实施是可选的。如果以下 API 启用,计划和附加项的价格值将在添加计划\附加项时在 WAP 租户站点中可见。
方法名称 |
API |
响应 |
|||
GET |
/planPrice?id={id}®ion={region}&username={username} |
String |
GET |
/addonPrice?id={id}®ion={region}&username={username}&subscriptionId={subscriptionId} |
String |
说明:
- 预计此 API 将返回一个带定价信息的字符串。2012 R2 系统将在该订户的计划旁显示此信息,但这些信息为系统原文,并非键入。
适配器项目文件示例的详细说明
本部分说明了示例计费适配器 (SampleBillingAdapter.sln) 的内容。在较高级别,计费适配器包括以下部分:
1.SampleBillingAdapter.cs 提供对使用情况 REST API 的不同调用的示例
2.可用于反序列化 API 响应的数据合约集
SampleBillingAdapter.cs
这是应用程序的入口点。该文件包含以下内容:
1.UserServiceHttpClient 的实例化,带所需配置数据。
2.然后,此 UsageServiceHttpClient 用于查询使用情况服务。可对计费数据进行七种类型的调用。此数据被反序列化为 DataContracts 目录中包含的数据合约的实例。
3.然后,数据被打印至控制台。
示例:
using Microsoft.WindowsAzurePack.Usage.DataContracts;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;static void Main(string[] args)
{
// create a WAP usage service http client (this data can be read from a config file)
string mediaType = "application/json"; // application/json or application/xml
string authenticationType = "basic";
string Username = "UsageClient";
string Password = "specify the correct pwd";
string Machine = "specify the machine where the usage service is running";
string Port = "30022";
string BaseAddress = String.Format("https://{0}:{1}/", Machine, Port);
var usageService = new WAPUsageServiceHttpClient(Username, Password, authenticationType, BaseAddress, mediaType);// gather usage and billing data asynchronously using the Usage API
var usage = usageService.GetDataAsync<UsageRecordList>("usage", 0, 50);
var plans = usageService.GetDataAsync<UsageEventList<Plan>>("billing/plans", 0, 50);
var subscriptions = usageService.GetDataAsync<UsageEventList<Subscription>>("billing/subscriptions", 0, 50);
var addOns = usageService.GetDataAsync<UsageEventList<AddOn>>("billing/addons", 0, 50);
var planAddOns = usageService.GetDataAsync<UsageEventList<AddOnReference>>("billing/planAddons", 0, 50);
var subscriptionAddOns = usageService.GetDataAsync<UsageEventList<AddOnReference>>("billing/subscriptionAddons", 0, 50);
var planServices = usageService.GetDataAsync<UsageEventList<ResourceProviderReference>>("billing/planServices", 0, 50);#region Print the usage and billing data to the console ...
Console.WriteLine("Printing Usage Data - Press Enter to Proceed...");
Console.ReadLine();
usageService.PrintUsageData(usage.Result);
usageService.PrintPlanData(plans.Result);
usageService.PrintSubscriptionData(subscriptions.Result);
usageService.PrintAddOnsData(addOns.Result);
usageService.PrintPlanAddOnsData(planAddOns.Result);
usageService.PrintSubscriptionAddOnsData(subscriptionAddOns.Result);
usageService.PrintPlanServicesData(planServices.Result);
#endregion
}
数据合约
DataContracts 目录包含与使用情况 API 有效交互的所有所需数据合约。
通过使用情况 API 收集的虚拟机数据
虚拟机提供程序 |
度量值 |
单位 |
描述 |
MemoryAllocated-Min |
MB |
一小时内为虚拟机分配的最低内存大小 |
|
MemoryAllocated-Max |
MB |
一小时内为虚拟机分配的最高内存大小 |
|
MemoryConsumed-Min |
MB |
一小时内虚拟机使用的最低内存大小 |
|
MemoryConsumed-Max |
MB |
一小时内虚拟机使用的最高内存大小 |
|
MemoryConsumed-Median |
MB |
一小时内虚拟机使用的内存大小中值 |
|
CPUAllocationCount-Min |
每个 |
一小时内为虚拟机分配的最低 CPU 内核数 |
|
CPUAllocationCount-Max |
每个 |
一小时内为虚拟机分配的最高 CPU 内核数 |
|
CPUPercentUtilization-Median |
% |
一小时内虚拟机的 CPU 使用率中值 |
|
CrossDiskIOPerSecond-Min |
MB |
一小时内虚拟机连接的所有磁盘间的最低每秒输入/输出 (IOPS) |
|
CrossDiskIOPerSecond-Max |
MB |
一小时内虚拟机连接的所有磁盘间的最高每秒输入/输出 (IOPS) |
|
CrossDiskIOPerSecond-Median |
MB |
一小时内虚拟机连接的所有磁盘间的每秒输入/输出 (IOPS) 中值 |
|
CrossDiskSizeAllocated-Min |
MB |
一小时内虚拟机连接的所有磁盘间分配的最低磁盘大小 |
|
CrossDiskSizeAllocated-Max |
MB |
一小时内虚拟机连接的所有磁盘间分配的最高磁盘大小 |
|
PerNICKBSentPerSecond-Min |
MB |
一小时内连接到虚拟机的网络适配器上每秒发送的最低字节数 |
|
PerNICKBSentPerSecond-Max |
MB |
一小时内连接到虚拟机的网络适配器上每秒发送的最高字节数 |
|
PerNICKBSentPerSecond-Median |
MB |
一小时内连接到虚拟机的网络适配器上每秒发送的字节数中值 |
|
PerNICKBSentPerSecond-Average |
MB |
一小时内连接到虚拟机的网络适配器上每秒发送的字节数标准均值 |
|
PerNICKBReceivedPerSecond-Min |
MB |
一小时内连接到虚拟机的网络适配器上每秒接收的最低字节数 |
|
PerNICKBReceivedPerSecond-Max |
MB |
一小时内连接到虚拟机的网络适配器上每秒接收的最高字节数 |
|
PerNICKBReceivedPerSecond-Median |
MB |
一小时内连接到虚拟机的网络适配器上每秒接收的字节数中值 |
|
PerNICKBReceivedPerSecond-Average |
MB |
一小时内连接到虚拟机的网络适配器上每秒接收的字节数标准均值 |
正如您所看到的,这是一个功能强大的 API,它允许双向数据流。使用情况数据从 2012 R2 堆栈流入计费适配器,定价数据(业务逻辑决定价格)和该数据从计费系统流入 2012 R2 堆栈。
在后面的博文中,随着我们从客户那里接收到更多信息,我们将提供更多详细信息。
如希望阅读本系列中的所有博文,请查看 Windows Server 和 System Center 2012 R2 新增功能存档。