IBM Cloud Docs
向服务添加度量值

向服务添加度量值

通过 IBM Cloud® Partner Center,您可以使用基于使用量的定价计划来度量服务的各种度量。 您可以对创建的实例进行度量,并将度量结果提交给度量服务。 评级服务会根据您选择的模式,将提交的使用情况汇总到不同的桶中(实例、资源组和账户)。 套餐中所有度量值的聚集和费率模型包含在套餐的计量和费率定义文档中。 有关更多信息,请参阅 测量集成

要将服务加载到 IBM Cloud,您需要向基于使用量的定价计划添加度量,以确定客户收费方式。 在 Partner Center 中向定价计划添加度量时,必须请求初始核准。 在核准指标之后,您可以从客户的角度测试定价和使用情况,并提供来自测试的证据,以获取定价计划的最终核准。

准备工作

必须先完成以下任务,然后才能向定价计划添加度量值:

  1. 提交税款和电子资金转移文档
  2. 导出控制分类号(ECCN)
  3. 输入联合国标准产品和服务代码(UNSPSC)
  4. 添加付费定价套餐
  5. 确认数字平台经销商协议

向定价计划添加度量

如果您提供付费集成产品,并添加要求客户为其使用付费的付费定价计划,那么必须将度量值添加到定价计划以聚集产品的使用情况。 将度量值添加到套餐后,必须请求初始定价核准,以便您可以提交资源使用情况并开始复审度量值。

要向定价计划添加度量值,请完成以下步骤:

  1. 在 IBM Cloud 控制台中,单击 导航菜单 图标 导航菜单图标 > 合作伙伴中心 > 我的产品
  2. 选择要加入的产品,然后单击 定价
  3. 从表中选择基于使用情况的计划,然后单击 添加度量
  4. 在“使用情况度量”部分中,单击 添加度量
  5. 填写必填字段。
  6. 单击完成
  7. 要提交定价计划和测量以进行复审,请单击“定价核准”部分中的 请求核准

将资源使用情况提交到 IBM Cloud 使用情况测量 API

要查看客户如何理解和体验定价套餐,并验证是否正确配置了计量套餐,必须提交资源使用情况。 提交资源使用情况包括创建测量 JSON,调用 Usage Metering API 以及提供测试证据。

创建测量 JSON

要提交资源使用情况,必须使用测量信息开发 JSON 文件。 开发测量 JSON 后,可以通过调用 Usage Metering API 来提交资源使用情况。 您必须在 JSON 文件的请求主体中包含一些特定字段,以确保其包含所有测量信息。 有关必填字段和提交使用情况记录的更多信息,请参阅 使用情况测量 API

要创建包含所有测量信息的 JSON,必须在请求主体中包含以下字段:

resource_instance_id
plan_id
start
end
measured_usage

请参阅以下包含必需字段的 JSON 示例:

[
  {
    "start": 1485907200001,
    "end": 1485910800000,
    "region": "us-south",
    "resource_instance_id": "crn:v1:bluemix:staging:database-service:us-south:a/1c8ae972c35e470d994b6faff9494ce1:793ff3d3-9fe3-4329-9ea0-404703a3c371::",
    "plan_id": "da40662d-2f72-4a19-8c79-8c77cf285e17",
    "measured_usage": [
      {
        "measure": "QUERIES",
        "quantity": 100
      },
      {
        "measure": "STORAGE",
        "quantity": 123.456
      }
    ]
  },
  {
    "start": 1485910800000,
    "end": 1485910800000,
    "resource_instance_id": "ed20abbe-8870-44e6-90f7-56d764c21127",
    "plan_id": "da40662d-2f72-4a19-8c79-8c77cf285e17",
    "measured_usage": [
      {
        "measure": "instances",
        "quantity": {
          "previous": 0,
          "current": 1
        }
      }
    ]
  }
]

调用 IBM Cloud Usage Metering API

创建测量 JSON 后,可以通过调用 Usage Metering API 来提交资源使用情况。 要成功调用该 API,您必须具有可以包含在 API 请求中的 IBM Cloud Identity and Access Management (IAM) 令牌。 要创建 IAM 访问令牌,请调用 IAM 身份服务 API,如以下样本请求中所示:

curl -X POST \
'https://iam.cloud.ibm.com/identity/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=MY_APIKEY'

有关更多信息,请参阅 IAM 身份服务 API

要提交活动服务实例的使用情况,请调用 使用情况测量 API,如以下样本请求中所示。 要进行 API 调用,定价核准请求必须由 IBM Cloud核准。

curl -X POST -H "Authorization: {iam_token}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \  
  -d "{REQUEST_BODY}" \
  "{base_url}/v4/metering/resources/{resource_id}/usage"
// Report usage for a mythical resource.
// Use zero for quantities since this is only an example.
MeasureAndQuantity lookupMeasure = new MeasureAndQuantity.Builder()
    .measure("LOOKUP")
    .quantity(Long.valueOf(0))
    .build();
MeasureAndQuantity writeMeasure = new MeasureAndQuantity.Builder()
    .measure("WRITE")
    .quantity(Long.valueOf(0))
    .build();
MeasureAndQuantity queryMeasure = new MeasureAndQuantity.Builder()
    .measure("QUERY")
    .quantity(Long.valueOf(0))
    .build();
MeasureAndQuantity gbMeasure = new MeasureAndQuantity.Builder()
    .measure("GIGABYTE")
    .quantity(Long.valueOf(0))
    .build();
List<MeasureAndQuantity> measures = new ArrayList<>();
measures.add(lookupMeasure);
measures.add(writeMeasure);
measures.add(queryMeasure);
measures.add(gbMeasure);

ResourceInstanceUsage resourceInstanceUsageModel = new ResourceInstanceUsage.Builder()
    .resourceInstanceId(resourceInstanceId)
    .planId(planId)
    .region(region)
    .start(startTime)
    .end(endTime)
    .measuredUsage(measures)
    .build();

ReportResourceUsageOptions reportResourceUsageOptions = new ReportResourceUsageOptions.Builder()
    .resourceId(resourceId)
    .resourceUsage(new java.util.ArrayList<ResourceInstanceUsage>(
        java.util.Arrays.asList(resourceInstanceUsageModel)))
    .build();

Response<ResponseAccepted> response = service.reportResourceUsage(reportResourceUsageOptions).execute();
ResponseAccepted responseAccepted = response.getResult();

System.out.println(responseAccepted);
// Report usage for a mythical resource.
// Use zero for quantities since this is only an example.
const measures = [{
  measure: 'LOOKUP',
  quantity: 0,
},
{
  measure: 'WRITE',
  quantity: 0,
},
{
  measure: 'QUERY',
  quantity: 0,
},
{
  measure: 'GIGABYTE',
  quantity: 0,
}];

const resourceInstanceUsageModel = {
  resource_instance_id: resourceInstanceId,
  plan_id: planId,
  region: region,
  start: startTime,
  end: endTime,
  measured_usage: measures,
};

const params = {
  resourceId: resourceId,
  resourceUsage: [resourceInstanceUsageModel],
};

usageMeteringService.reportResourceUsage(params)
  .then(res => {
    console.log(JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
//  Report usage for a mythical resource.
//  Use zero for quantities since this is only an example.
measures = [
  {
    'measure': 'LOOKUP',
    'quantity': 0,
  },
  {
    'measure': 'WRITE',
    'quantity': 0,
  },
  {
    'measure': 'QUERY',
    'quantity': 0,
  },
  {
    'measure': 'GIGABYTE',
    'quantity': 0,
  },
]

resource_instance_usage_model = {
  'resource_instance_id': resource_instance_id,
  'plan_id': plan_id,
  'region': region,
  'start': start_time,
  'end': end_time,
  'measured_usage': measures,
}

response_accepted = usage_metering_service.report_resource_usage(
  global_catalog_id=global_catalog_id,
  resource_usage=[resource_instance_usage_model]).get_result()

print(json.dumps(response_accepted, indent=2))
// Report usage for a mythical resource.
// Use zero for quantities since this is only an example.
resourceInstanceUsageModel := usagemeteringv4.ResourceInstanceUsage{
  ResourceInstanceID: &resourceInstanceID,
  PlanID:             &planID,
  Region:             &region,
  Start:              &startTime,
  End:                &endTime,
  MeasuredUsage: []usagemeteringv4.MeasureAndQuantity{
    usagemeteringv4.MeasureAndQuantity{
      Measure:  core.StringPtr("LOOKUP"),
      Quantity: core.Int64Ptr(0),
    },
    usagemeteringv4.MeasureAndQuantity{
      Measure:  core.StringPtr("WRITE"),
      Quantity: core.Int64Ptr(0),
    },
    usagemeteringv4.MeasureAndQuantity{
      Measure:  core.StringPtr("QUERY"),
      Quantity: core.Int64Ptr(0),
    },
    usagemeteringv4.MeasureAndQuantity{
      Measure:  core.StringPtr("GIGABYTE"),
      Quantity: core.Int64Ptr(0),
    },
  },
}
reportResourceUsageOptions := usageMeteringService.NewReportResourceUsageOptions(
  resourceID,
  []usagemeteringv4.ResourceInstanceUsage{resourceInstanceUsageModel},
)

responseAccepted, response, err := usageMeteringService.ReportResourceUsage(reportResourceUsageOptions)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(responseAccepted, "", "  ")
fmt.Println(string(b))

响应

响应主体包括每个使用量记录的接受状态。 成功提交会返回 201 的响应代码。 如果返回任何其他响应代码,请更新并重新发送数据,直到收到 201 代码。 请参阅成功响应的以下示例:

{
    "resources": [
        {
            "code": "successful_submission",
            "status": 201,
            "message": "Payload was successfully submitted",
            "details": [
                {
                    "field": "data.resource_instance_id",
                    "message": "is required",
                    "value": {
                        "start": 1501282845663,
                        "end": 1501282845664,
                        "region": "us-south",
                        "plan_id": "04082014.ibm.node.default",
                        "measured_usage": [
                            {
                                "measure": "current_running_instances",
                                "quantity": 1
                            },
                            {
                                "measure": "current_instance_memory",
                                "quantity": 1
                            }
                        ]
                    },
                    "type": "object"
                }
            ]
   }

有关状态码的更多信息,请参阅 响应状态码

查看度量值并提供测试证据

创建测量 JSON 后,通过调用 Usage Metering API 来提交使用情况记录,并从 IBM接收核准,您可以开始查看和测试客户如何理解和体验定价套餐。

要测试并提交定价计划的证据,请完成以下步骤:

  1. 单击测试估算和计量

  2. 在目录中预览产品,并通过单击 添加到估算来生成估算。

  3. 输入预期使用情况,然后单击 计算成本

  4. 上载使用情况的证据。

    1. 要上载估算器生成的使用情况数据的截屏,请单击 添加文件
    2. 要上载额定使用情况的截屏,请单击 添加文件。 要查找额定使用情况,请在 IBM Cloud 控制台中,转至 管理 > 计费和使用情况 > 使用情况
    3. 要上载先前提交到 IBM Cloud Usage Metering API 的资源使用情况数据 JSON 的截屏,请单击 添加文件

    只能上载 .jpeg.pdf.png 文件格式的文件。

  5. 单击完成