使用商業市場計量服務按量計費的 Azure 容器
透過商業市集計量服務,您可以建立根據非標準單位收費的 Azure Container 供應專案。 將供應專案發佈至商業市集之前,您可以定義計費維度,例如頻寬、分區、記錄檔、掃描、已處理的電子郵件等。客戶接著會根據這些維度的耗用量付費,您的應用程式會在發生時透過 商業市集計量服務 API 通知Microsoft 計費事件。
計量計費的必要條件
若要讓 Azure Container 供應專案使用計量付費,您必須先檢閱 規劃 Azure 容器供應專案 中所述的 授權 選項,並確定您有六個現有預先定義計費模型之一不符合的自定義計費需求。
然後,Azure Container 方案可以與 商業市集計量服務 API 整合,以通知 Microsoft 可計費的事件。
重要
您的應用程式必須呼叫商業市集計量服務 API。 目前沒有選項可讓您的託管服務(應用程式外部)呼叫計量服務 API。
注意
Marketplace 計量服務僅適用於自定義計費模型,不適用於每個使用者的計費模型。
計量收費如何融入定價策略
瞭解供應專案階層對於定義供應專案及其定價模式而言非常重要。
- 每個供應項目都會設定為透過 Microsoft 銷售或不透過 Microsoft 銷售。 發佈優惠後,此選項無法更改。
- 每個供應項目,設定為透過Microsoft銷售,可以有一或多個方案。
- 每個方案都有與其相關聯的定價模式:以使用量為基礎的每月計費方案 或 自備授權 (BYOL)。 針對以使用量為基礎的每月計費方案,您可以選擇免費、六個預先定義的計費選項之一或自定義。
- 發行之後,就無法更新定價模式和價格輸入選項。
- 每個方案都必須有完整的定價方案。
- 您可以選擇使用自訂維度來向客戶收取費用,以協助滿足您的計費需求。 每個維度都代表一個計費單位,服務可透過 商業市集計量服務 API與 Microsoft 進行通訊。
重要
您必須追蹤程序代碼中的使用量,並只將使用量事件傳送至Microsoft,以取得您想要客戶開立發票的使用量。
注意
使用在建立供應專案時發佈的當地市場價格,以客戶的合約貨幣向客戶收取供應項目費用。 客戶支付的金額和ISV的付費金額取決於客戶交易供應專案時的外匯匯率。 深入瞭解 「如何轉換貨幣?」。
自訂定價選項範例
例如,Contoso 是一個發行者,他們的智慧財產位於其 Kubernetes 應用程式的分片邏輯中。 Contoso 想要根據使用的分區數目向客戶收取費用。 它們也會探索其他方便且具競爭力的計費選項。 Contoso 在商業市集計劃的合作夥伴中心註冊為發行者,並想要將容器供應專案發佈給 Azure 客戶。 Contoso 有四個相關計劃,如下所述:
依每小時使用的分片收費,例如 $1,000/每分片每小時
建立一次性付款或週期性計費模型:假設 Contoso 想要向客戶收取 $449/mo 的費用,以從其應用程式使用最多 100 個記錄檔。 Contoso 的應用程式邏輯會在整個月份內追蹤使用事件,並在月底根據 100 個記錄檔的使用情況觸發費用。
建模階層式計費:假設 Contoso 想要針對最多 100 個分片收取 $449/月 的費用,然後針對任何超過的部分進行分層定價。 其應用程式邏輯會追蹤月份的使用量、據此分割使用量,並在期間結束時使用以下的計量 API 報告它:
多維度計費:Contoso 也可以使用自定義計量,以符合使用多個維度進行進階計費的需求
根據選取的方案,取得 Contoso 容器供應專案的 Azure 客戶會根據其使用量收費。 Contoso 會計算使用量,而不傳送任何使用事件至Microsoft。 當客戶取用足夠的金額或定期使用時,Contoso 會報告使用量。 客戶不需要變更方案或執行任何不同動作。 Contoso 會測量使用量,並開始向 Microsoft 發送使用量事件,以便透過 商業市集計量服務 API收取超額使用量的費用。 Microsoft接著向客戶收取自定義維度中發行者所指定使用量的費用。 計費會在下一個每月計費週期完成。
計費維度
每個計費維度都會定義一個自定義單位,供 ISV 發出使用量事件。 計費維度也用於向客戶說明他們將如何為軟體使用而被收費。 其定義如下:
- 識別碼:發出使用事件時所參考的不可變維度標識符。
- 顯示名稱:與維度相關聯的顯示名稱,例如「已傳送的簡訊」。
- 量值單位:計費單位的描述,例如「每一簡訊」或「每 100 封電子郵件」。
- 每單位價格以美元為單位:維度一個單位的價格。 它可以是 0。
重要
您必須追蹤應用程式程式代碼中的使用量,並根據帳單需求將使用量事件傳送至Microsoft。
計費維度會跨供應專案的所有方案共用。 某些屬性會套用至所有計劃的維度,而其他屬性則為計劃專屬。
定義維度本身的屬性會跨供應專案的所有方案共用。 在發佈供應專案之前,若從任何方案的上下文中變更這些屬性,將會影響所有方案的維度定義。 發佈提供之後,就無法再編輯這些屬性。 這些屬性包括:
- 身份識別碼
- 顯示名稱
- 量值單位
維度的其他屬性是每個計劃特有的,並且在不同的計劃中可以有不同的值。 發佈計畫之前,您可以編輯這些值,而且只會影響這個計畫。 發佈計劃之後,這些屬性將無法再編輯。 這些屬性包括:
- 每單位以美元為單位的價格
維度還有一個被稱為「已啟用」的特殊概念:
- 已啟用 表示此方案參與此維度。 如果您要建立未根據這個維度傳送使用事件的新方案,您可能會想要讓此選項保持未核取狀態。 此外,第一次發行計劃之後新增的任何新維度,都會在已發行的計劃上顯示為「未啟用」。 未啟用的維度將不會出現在客戶可見的方案中任何維度列表中。
注意
明確支援下列案例:
- 您可以將新的維度新增至新的計劃。 新的維度將不會啟用於任何已發行的計劃。
設定每個支持市場的每單位維度價格
如同其他以使用量為基礎的定價,計費維度價格可以針對每個支援的國家/地區設定。 您必須在合作夥伴中心使用定價數據匯入和導出功能,如下所示。
- 定義所需的維度,並標示支援哪些市場。
- 將此數據匯出至檔案。
- 新增每個國家/地區的正確價格,並在合作夥伴中心匯入檔案。
儀表的使用者介面會變更,以顯示維度價格資訊只能在程式檔案中查看。
私人方案
如同預先定義的使用量型計費方案,具有自定義維度的計劃可以設定為私人方案,僅限由計劃的目標受眾存取。
限制
鎖定行為
由於與商業市集計量服務搭配使用的維度代表了客戶將如何支付服務費用,因此在您發佈維度之後,關於該維度的所有詳細資料都無法再編輯。 請務必在發佈之前,針對計劃完整定義維度。
一旦以某個維度發佈報價之後,該維度下的報價層級詳細資訊將無法再變更。
- 身份識別碼
- 顯示名稱
- 量值單位
發行方案之後,就無法再變更此計劃層級的詳細數據:
- 計劃是否啟用了維度
上限
單一供應項目可設定的維度數目上限為30個唯一維度。
Azure 容器計量計費
當發行者為要在合作夥伴中心發佈的產品優惠建立自定義計量維度時,應使用計量計費 API。 任何已購買的供應項目,若包含一或多個具有自定義維度的方案,以發出使用事件,都需要與計量計費 API 進行整合。
重要
如需為 Kubernetes Apps 建立自訂計量維度的詳細資訊,請參閱 建立 Azure 容器供應專案。
強制執行 TLS 1.2 注意事項
TLS 1.2 版會強制執行為 HTTPS 通訊的最低版本。 請確定您在程式代碼中使用這個 TLS 版本。 TLS 1.0 和 1.1 版已被取代,且拒絕連線嘗試。
計量計費單次使用事件
發行者應呼叫使用事件 API,以便針對特定客戶購買的方案觸發已訂閱資源的使用事件。 發行提案時,發行者所定義的方案每個自定義維度都會分別觸發使用事件。
在每個行事曆日中,每個資源和維度每小時只能發出一個使用量事件。 如果在一小時內取用一個以上的單位,則累積一小時內取用的所有單位,然後在單一事件中發出。 僅能發出在過去24小時內發生的使用事件。 如果您在 8:00 到 8:59:59 之間的任何時間發出使用事件(並被接受),並且在同一天 8:00 到 8:59:59 之間再次發送事件,它將被拒絕為重複事件。
POST: https://marketplaceapi.microsoft.com/api/usageEvent?api-version=<ApiVersion>
查詢參數:
參數 | 建議 |
---|---|
ApiVersion |
使用期限:2018-08-31 |
要求標頭:
內容類型 | 使用 application/json |
---|---|
x-ms-requestid |
用於追蹤客戶端請求的唯一字串值,最好使用 GUID。 如果未提供此值,則會在響應標頭中產生並提供一個值。 |
x-ms-correlationid |
用戶端操作的唯一字串值。 此參數會將來自用戶端作業的所有事件與伺服器端上的事件相互關聯。 如果未提供此值,則會在響應標頭中產生並提供一個值。 |
authorization |
識別進行此 API 呼叫之 ISV 的唯一存取令牌。 當發行者擷取令牌值時,格式為 "Bearer <access_token>" ,如同在 Kubernetes 的 驗證策略中所述。 |
要求本文範例:
{
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // unique identifier of the resource against which usage is emitted.
"quantity": 5.0, // how many units were consumed for the date and hour specified in effectiveStartTime, must be greater than 0 or a double integer
"dimension": "dim1", // custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14", // time in UTC when the usage event occurred, from now and until 24 hours back
"planId": "plan1", // id of the plan purchased for the offer
}
注意
對於 Kubernetes 應用程式,resourceUri
是 Kubernetes 應用程式實例的 ARM 資源 URI。
反應
程序代碼:200
還行。 已接受使用量排放數據,並記錄在 Microsoft 方面,以便進一步處理和計費。
響應資料包範例:
{
"usageEventId": <guid>, // unique identifier associated with the usage event in Microsoft records
"status": "Accepted" // this is the only value in case of single usage event
"messageTime": "2020-01-12T13:19:35.3458658Z", // time in UTC this event was accepted
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // unique identifier of the resource against which usage is emitted. For SaaS it's the subscriptionId.
"quantity": 5.0, // amount of emitted units as recorded by Microsoft
"dimension": "dim1", // custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14", // time in UTC when the usage event occurred, as sent by the ISV
"planId": "plan1", // id of the plan purchased for the offer
}
程序代碼:400
錯誤的請求。
- 遺失或無效的請求資料。
-
effectiveStartTime
已經是超過 24 小時前的事。 事件已過期。
響應承載範例:
{
"message": "One or more errors have occurred.",
"target": "usageEventRequest",
"details": [
{
"message": "The resourceUri is required.",
"target": "ResourceUri",
"code": "BadArgument"
}
],
"code": "BadArgument"
}
程序代碼:400
錯誤的請求。
- 資源 URI 先前已註冊,需要等候 24 小時再提交使用量。
響應承載範例:
{
"message": "One or more errors have occurred.",
"target": "usageEventRequest",
"details": [
{
"message": "Invalid usage state.",
"target": "ResourceUri",
"code": "BadArgument"
}
],
"code": "BadArgument"
}
程序代碼:403
禁止。 未提供授權令牌、無效或已過期。
程序代碼:409
衝突。 已針對指定的資源標識碼、有效的使用日期與小時成功報告使用量事件。
回應負載範例:
{
"additionalInfo": {
"acceptedMessage": {
"usageEventId": "<guid>", //unique identifier associated with the usage event in Microsoft records
"status": "Duplicate",
"messageTime": "2020-01-12T13:19:35.3458658Z",
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", //unique identifier of the resource against which usage is emitted.
"quantity": 1.0,
"dimension": "dim1",
"effectiveStartTime": "2020-01-12T11:03:28.14Z",
"planId": "plan1"
}
},
"message": "This usage event already exist.",
"code": "Conflict"
}
計量計費批次用量事件
批次使用量事件 API 可讓您一次發出多個已購買資源的使用量事件。 它也可讓您發出相同資源的數個使用量事件,只要它們適用於不同的行事歷時數。 單一批次中事件的最大數目為25。
POST:https://marketplaceapi.microsoft.com/api/batchUsageEvent?api-version=<ApiVersion>
查詢參數:
參數 | 建議 |
---|---|
ApiVersion |
使用 2018-08-31。 |
要求標頭:
內容類型 | 使用 application/json |
---|---|
x-ms-requestid |
用於追蹤客戶端請求的唯一字串值,最好使用 GUID。 如果未提供此值,則會產生一個值,並在響應標頭中提供。 |
x-ms-correlationid |
用戶端操作的唯一字串值。 此參數會將來自用戶端作業的所有事件與伺服器端上的事件相互關聯。 如果未提供此值,則會產生並在響應標頭中提供。 |
authorization |
識別進行此 API 呼叫之 ISV 的唯一存取令牌。 當發行者擷取令牌值時,格式為 Bearer <access_token> ,如同在 Kubernetes 的 驗證策略中所述。 |
注意
在要求主體中,Kubernetes 應用程式的資源識別碼是 resourceUri
。
Kubernetes 應用程式的請求本文範例:
{
"request": [ // list of usage events for the same or different resources of the publisher
{ // first event
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // Unique identifier of the resource against which usage is emitted.
"quantity": 5.0, // how many units were consumed for the date and hour specified in effectiveStartTime, must be greater than 0 or a double integer
"dimension": "dim1", //Custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14",//Time in UTC when the usage event occurred, from now and until 24 hours back
"planId": "plan1", // id of the plan purchased for the offer
},
{ // next event
"resourceUri": "<ARM resource URI of the Kubernetes app instance>",
"quantity": 39.0,
"dimension": "email",
"effectiveStartTime": "2018-11-01T23:33:10
"planId": "gold", // id of the plan purchased for the offer
}
]
}
反應
程序代碼:200
還行。 批次使用量排放已接受並記錄在Microsoft端,以便進一步處理和計費。 回應清單會傳回批次中每個個別事件的狀態。 您應該迭代回應負載,以瞭解批次事件中的每個個別使用事件的回應。
響應承載範例:
{
"count": 2, // number of records in the response
"result": [
{ // first response
"usageEventId": "<guid>", // unique identifier associated with the usage event in Microsoft records
"status": "Accepted" // see list of possible statuses below,
"messageTime": "2020-01-12T13:19:35.3458658Z", // Time in UTC this event was accepted by Microsoft,
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // unique identifier of the resource against which usage is emitted.
"quantity": 5.0, // amount of emitted units as recorded by Microsoft
"dimension": "dim1", // custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14",// time in UTC when the usage event occurred, as sent by the ISV
"planId": "plan1", // id of the plan purchased for the offer
},
{ // second response
"status": "Duplicate",
"messageTime": "0001-01-01T00:00:00",
"error": {
"additionalInfo": {
"acceptedMessage": {
"usageEventId": "<guid>",
"status": "Duplicate",
"messageTime": "2020-01-12T13:19:35.3458658Z",
"resourceUri": "<ARM resource URI of the Kubernetes app instance>",
"quantity": 1.0,
"dimension": "email",
"effectiveStartTime": "2020-01-12T11:03:28.14Z",
"planId": "gold"
}
},
"message": "This usage event already exist.",
"code": "Conflict"
},
"resourceId": "<guid2>",
"quantity": 1.0,
"dimension": "email",
"effectiveStartTime": "2020-01-12T11:03:28.14Z",
"planId": "gold"
}
]
}
BatchUsageEvent
API 回應中所參考的狀態代碼描述:
狀態代碼 | 描述 |
---|---|
Accepted |
接受。 |
Expired |
使用權限已過期。 |
Duplicate |
提供的使用量重複。 |
Error |
錯誤碼。 |
ResourceNotFound |
提供的使用資源無效。 |
ResourceNotAuthorized |
您無權提供此資源的使用量。 |
ResourceNotActive |
資源已暫停或從未啟用。 |
InvalidDimension |
傳遞的用量維度對於此優惠/計畫而言無效。 |
InvalidQuantity |
傳遞的數量較低或等於 0。 |
BadArgument |
輸入遺失或格式不正確。 |
程序代碼:400
錯誤的請求。 批次包含超過25個使用事件。
程序代碼:403
禁止。 未提供授權令牌、無效或已過期。
按量計費檢索使用事件
您可以呼叫使用量事件 API 來取得使用事件清單。 ISV 可以使用此 API 查看在特定可設定期間內張貼的使用事件,以及這些事件在呼叫 API 時的狀態。
GET:https://marketplaceapi.microsoft.com/api/usageEvents
查詢參數:
參數 | 建議 |
---|---|
ApiVersion | 使用 2018-08-31。 |
使用開始日期 | ISO8601格式的 DateTime。 例如,2020-12-03T15:00 或 2020-12-03 |
UsageEndDate (選擇性) | ISO8601格式的 DateTime。 預設值 = 目前日期 |
offerId (選擇性) | 預設值 = 所有可用 |
planId (選擇性) | 預設值 = 所有可用 |
維度 (選擇性) | 預設值 = 所有可用 |
azureSubscriptionId (選擇性) | 預設值 = 所有可用 |
reconStatus (選擇性) | 預設值 = 所有可用 |
reconStatus的可能值:
ReconStatus | 描述 |
---|---|
提交 | 尚未經過 PC 分析處理 |
已接受 | 與個人電腦分析匹配 |
拒絕 | 流程中遭到拒絕。 請連絡Microsoft支持人員以調查原因。 |
失 配 | MarketplaceAPI 和合作夥伴中心分析的數量雖然都是非零,但並不一致。 |
TestHeaders | 因為訂閱是以測試標頭列出,所以不包括在 PC Analytics 中。 |
DryRun | 使用 SessionMode=DryRun 提交,因此不在 PC 中 |
請求標頭:
內容類型 | 使用 application/json |
---|---|
x-ms-requestid | 唯一字串值(最好是 GUID),用來追蹤來自用戶端的要求。 如果未提供此值,則會在響應標頭中產生並提供一個值。 |
x-ms-correlationid | 用戶端操作的唯一字串值。 此參數會將來自用戶端作業的所有事件與伺服器端上的事件相互關聯。 如果未提供此值,則會在響應標頭中產生並提供一個值。 |
授權 | 識別進行此 API 呼叫之 ISV 的唯一存取令牌。 當發行者擷取令牌值時,其格式為 Bearer <access_token> 。- Kubernetes 應用程式在 驗證策略中的使用 |
反應
響應承載範例:
已接受
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "Silver",
"offerId": "mycooloffer",
"offerName": "My Cool Offer",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Accepted",
"submittedQuantity": 17.0,
"processedQuantity": 17.0,
"submittedCount": 17
}
]
提交
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "",
"offerId": "mycooloffer",
"offerName": "",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Submitted",
"submittedQuantity": 17.0,
"processedQuantity": 0.0,
"submittedCount": 17
}
]
不相符
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "Silver",
"offerId": "mycooloffer",
"offerName": "My Cool Offer",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Mismatch",
"submittedQuantity": 17.0,
"processedQuantity": 16.0,
"submittedCount": 17
}
]
拒絕
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "",
"offerId": "mycooloffer",
"offerName": "",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Rejected",
"submittedQuantity": 17.0,
"processedQuantity": 0.0,
"submittedCount": 17
}
]
狀態代碼
代碼:403 禁止。 未提供授權令牌、無效或已過期。
開發和測試最佳做法
若要測試自定義計量排放,請實作與計量 API 的整合,為已發佈的 Kubernetes Apps 供應專案建立方案,其中包含以每個單位零價格定義的自定義維度。 並將此供應專案發佈為預覽版,因此只有有限的使用者才能存取及測試整合。
您也可以針對現有的即時優惠專案使用私人計劃,將測試期間的存取限制為限量的受眾。
相關內容
- 如需計量服務 API 的詳細資訊,請參閱 Marketplace 計量服務 API 常見問題。
取得支援
如果您有下列問題之一,您可以開啟支援請求。
- 市集計量服務 API 的技術問題。
- 由於您這邊發生錯誤或漏洞,需要升級處理的問題(例如使用事件錯誤)。
- 與計量計費相關的任何其他問題。
若要了解發行者支援選項,並向 Microsoft 提出支援票證,請遵循合作夥伴中心 商業市集方案支援中的指示。