Hashmap 评级模块

CloudKitty 附带核心评级模块。

Hashmap 组成

HashMap 由不同的资源和组组成。

组是一种对映射计算进行分组的方式。例如,您可能希望将一组规则应用于评级实例的正常运行时间,而将另一组规则应用于块存储卷。您不希望将两者关联起来,因此您将为每个计算创建一个组。

请参阅 映射,了解组如何影响评级。

服务

服务是一种将规则映射到收集的数据类型的方式。必须为要评级的每种指标类型创建一个 hashmap 服务。如果指标具有 alt_name,则 hashmap 服务名称必须与 alt_name 匹配。如果未提供 alt_name,请使用指标的名称。

使用默认配置的示例

metrics:
  cpu:
    unit: instance
    alt_name: instance
  # [...]

  image.size:
    unit: MiB
  # [...]

在这种情况下,cpu 具有 alt_name,而 image.size 没有。因此,cpu 指标的 hashmap 服务必须命名为 instance,而图像的服务必须命名为 image.size

字段

字段是指资源的元数据字段。例如,在实例对象上(在 instance 服务中),您可以使用 flavor 定义特定规则。

配置中指定的每个 groupbymetadata 属性都可以用于字段

metrics:
  cpu:
    unit: instance
    alt_name: instance
    groupby:
      - id
      - project_id
    metadata:
      - flavor_id
    # [...]

  volume.size:
    unit: GiB
    groupby:
      - id
      - project_id
    metadata:
      - volume_type
    # [...]

使用上面的配置,instance 服务可以具有以下字段

  • id

  • project_id

  • flavor_id

volume.size 服务可以具有以下字段

  • id

  • project_id

  • volume_type

在这种情况下,flavor_idvolume_type 可用于根据实例的 flavor 或卷的类型应用不同的定价。

映射

映射是最终对象,它会触发计算,例如实例上 flavor 的特定值。

有两种类型的映射:字段服务 映射。

字段映射

字段映射用于匹配资源的属性/元数据。例如,如果您有三种希望应用不同评级规则的卷类型,则必须按以下方式进行操作

  1. 创建一个与卷指标的名称或 alt_name 匹配的 hashmap 服务(使用默认 gnocchi 的 volume.size)。

  2. 在该服务中,创建一个与卷类型元数据名称相同的字段(使用默认 gnocchi 的 volume_type)。

  3. 在该字段中,为 volume_type 元数据的每个可能值创建一个映射。示例

    • SSD_gold: 0.03

    • SSD_silver: 0.02

    • HDD_bronze: 0.01

现在,该卷指标的每个元素都将基于其 volume_type 元数据。10GiB SSD_gold 卷将在每个收集周期评级为 0.3,1GiB HDD_bronze 卷将在每个收集周期评级为 0.01,0.5GiB SSD_silver 将评级为 0.01…

服务映射

服务映射不与字段关联,而是直接与服务关联。如果直接在 volume.size 服务上创建映射,则将根据此映射评级每个卷,而无需基于元数据的区分。

固定值和费率

映射可以有两种类型:flatrate。固定值映射只是添加到给定项目的总额中,而费率则乘以总额。请参阅下面的用例示例。

注意

如果同一组的多个固定值映射匹配,则仅应用最昂贵的映射。

范围

可以将映射绑定到特定的范围/tenant_id。

阈值

阈值条目用于仅在达到特定级别后应用评级规则。除此之外,它的工作方式与映射相同。

与映射一样,阈值可以绑定到特定的范围/项目。

成本

成本选项是评级周期的实际成本。它在小数点右侧具有 28 位小数精度,在小数点左侧具有 12 位数字(数字的整数部分)。

示例

实例正常运行时间

应用评级规则以根据其 flavor_id 和正常运行时间评级实例

创建一个 instance_uptime_flavor_id

$ cloudkitty hashmap group create instance_uptime_flavor_id
+---------------------------+--------------------------------------+
| Name                      | Group ID                             |
+---------------------------+--------------------------------------+
| instance_uptime_flavor_id | 9a2ff37d-be86-4642-8b7d-567bace61f06 |
+---------------------------+--------------------------------------+

$ cloudkitty hashmap group list
+---------------------------+--------------------------------------+
| Name                      | Group ID                             |
+---------------------------+--------------------------------------+
| instance_uptime_flavor_id | 9a2ff37d-be86-4642-8b7d-567bace61f06 |
+---------------------------+--------------------------------------+

创建匹配规则的服务

$ cloudkitty hashmap service create instance
+----------+--------------------------------------+
| Name     | Service ID                           |
+----------+--------------------------------------+
| instance | b19d801d-e7d4-46f9-970b-3e6d60fc07b5 |
+----------+--------------------------------------+

创建一个匹配规则的字段

$ cloudkitty hashmap field create b19d801d-e7d4-46f9-970b-3e6d60fc07b5 flavor_id
+-----------+--------------------------------------+--------------------------------------+
| Name      | Field ID                             | Service ID                           |
+-----------+--------------------------------------+--------------------------------------+
| flavor_id | 18aa50b6-6da8-4c47-8a1f-43236b971625 | b19d801d-e7d4-46f9-970b-3e6d60fc07b5 |
+-----------+--------------------------------------+--------------------------------------+

instance_uptime_flavor 组中创建一个映射,该映射会将 m1.tiny 实例映射到 0.01 的成本

$ openstack flavor show m1.tiny
+----------------------------+----------------------------------------+
| Field                      | Value                                  |
+----------------------------+----------------------------------------+
| OS-FLV-DISABLED:disabled   | False                                  |
| OS-FLV-EXT-DATA:ephemeral  | 0                                      |
| access_project_ids         | None                                   |
| disk                       | 20                                     |
| id                         | 93195dd4-bbf3-4b13-929d-8293ae72e056   |
| name                       | m1.tiny                                |
| os-flavor-access:is_public | True                                   |
| properties                 | baremetal='false', flavor-type='small' |
| ram                        | 512                                    |
| rxtx_factor                | 1.0                                    |
| swap                       |                                        |
| vcpus                      | 1                                      |
+----------------------------+----------------------------------------+

$ cloudkitty hashmap mapping create 0.01 \
 --field-id 18aa50b6-6da8-4c47-8a1f-43236b971625 \
 --value 93195dd4-bbf3-4b13-929d-8293ae72e056 \
 -g 9a2ff37d-be86-4642-8b7d-567bace61f06 \
 -t flat
+--------------------------------------+--------------------------------------+---------------------+---------------------+------+------+-------------+---------+----------------------------------+------------+------------+------------+------+--------------------------------------+------------+--------------------------------------+------------+
| Mapping ID                           | Value                                | Created At          | Start               | End  | Name | Description | Deleted | Created By                       | Updated By | Deleted By | Cost       | Type | Field ID                             | Service ID | Group ID                             | Project ID |
+--------------------------------------+--------------------------------------+---------------------+---------------------+------+------+-------------+---------+----------------------------------+------------+------------+------------+------+--------------------------------------+------------+--------------------------------------+------------+
| 9c2418dc-99d3-44b6-8fdf-e9fa02f3ceb5 | 93195dd4-bbf3-4b13-929d-8293ae72e056 | 2023-01-01T10:00:00 | 2023-01-01T10:00:00 | None | None | None        | None    | 7977999e2e2511e6a8b2df30b233ffcb | None       | None       | 0.01000000 | flat | 18aa50b6-6da8-4c47-8a1f-43236b971625 | None       | 9a2ff37d-be86-4642-8b7d-567bace61f06 | None       |
+--------------------------------------+--------------------------------------+---------------------+---------------------+------+------+-------------+---------+----------------------------------+------------+------------+------------+------+--------------------------------------+------------+--------------------------------------+------------+

在此示例中,任何项目中的每台机器,其 flavor 为 m1.tiny,将在 2023-01-01T10:00:00 之后从收集周期开始评级为 0.01。要使用自定义周期(startend)hashmap 映射有效,可以使用参数 --start--end。要使用过去 start 值,请使用 --force 参数。

按 GiB 计费的卷,并附带折扣

现在让我们进行一些基于阈值的评级。

创建一个 volume_thresholds

$ cloudkitty hashmap group create volume_thresholds
+-------------------+--------------------------------------+
| Name              | Group ID                             |
+-------------------+--------------------------------------+
| volume_thresholds | 9736bbc0-8888-4700-96fc-58db5fded493 |
+-------------------+--------------------------------------+

$ cloudkitty hashmap group list
+-------------------+--------------------------------------+
| Name              | Group ID                             |
+-------------------+--------------------------------------+
| volume_thresholds | 9736bbc0-8888-4700-96fc-58db5fded493 |
+-------------------+--------------------------------------+

创建匹配规则的服务

$ cloudkitty hashmap service create volume.size
+-------------+--------------------------------------+
| Name        | Service ID                           |
+-------------+--------------------------------------+
| volume.size | 74ad7e4e-9cae-45a8-884b-368a92803afe |
+-------------+--------------------------------------+

现在让我们设置每千兆字节的价格

$ cloudkitty hashmap mapping create 0.001 \
 -s 74ad7e4e-9cae-45a8-884b-368a92803afe \
 -t flat -g 9736bbc0-8888-4700-96fc-58db5fded493
+--------------------------------------+-------+---------------------+---------------------+------+------+-------------+---------+----------------------------------+------------+------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| Mapping ID                           | Value | Created At          | Start               | End  | Name | Description | Deleted | Created By                       | Updated By | Deleted By | Cost       | Type | Field ID | Service ID                           | Group ID                             | Project ID |
+--------------------------------------+-------+---------------------+---------------------+------+------+-------------+---------+----------------------------------+------------+------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| 09e36b13-ce89-4bd0-bbf1-1b80577031e8 | None  | 2023-01-01T10:00:00 | 2023-01-01T10:00:00 | None | None | None        | None    | 7977999e2e2511e6a8b2df30b233ffcb | None       | None       | 0.00100000 | flat | None     | 74ad7e4e-9cae-45a8-884b-368a92803afe | 9736bbc0-8888-4700-96fc-58db5fded493 | None       |
+--------------------------------------+-------+---------------------+---------------------+------+------+-------------+---------+----------------------------------+------------+------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+

我们有每千兆字节的基本价格,但现在我们希望对大型数据量应用折扣。在组 volume_thresholds 中创建阈值,该阈值会将不同的卷量映射到成本

在这里,我们设置了一个超过 50GiB 的阈值,并应用 2% 的折扣(0.98)

$ cloudkitty hashmap threshold create 50 0.98 \
 -s 74ad7e4e-9cae-45a8-884b-368a92803afe \
 -t rate -g 9736bbc0-8888-4700-96fc-58db5fded493
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| Threshold ID                         | Level       | Cost       | Type | Field ID | Service ID                           | Group ID                             | Project ID |
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| ae02175d-beff-4b01-bb3a-00907b05fe66 | 50.00000000 | 0.98000000 | rate | None     | 74ad7e4e-9cae-45a8-884b-368a92803afe | 9736bbc0-8888-4700-96fc-58db5fded493 | None       |
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+

在这里,我们为项目 2d5b39657dc542d4b2a14b685335304e 设置了相同的阈值,但折扣为 3%(0.97)

$ cloudkitty hashmap threshold create 50 0.97 \
 -s 74ad7e4e-9cae-45a8-884b-368a92803afe \
 -t rate -g 9736bbc0-8888-4700-96fc-58db5fded493 \
 -p 2d5b39657dc542d4b2a14b685335304e
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+----------------------------------+
| Threshold ID                         | Level       | Cost       | Type | Field ID | Service ID                           | Group ID                             | Project ID                       |
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+----------------------------------+
| b20504bf-da34-434c-909d-46c2168c6166 | 50.00000000 | 0.97000000 | rate | None     | 74ad7e4e-9cae-45a8-884b-368a92803afe | 9736bbc0-8888-4700-96fc-58db5fded493 | 2d5b39657dc542d4b2a14b685335304e |
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+----------------------------------+

在这里,我们设置了一个超过 200GiB 的阈值,并应用 5% 的折扣(0.95)

$ cloudkitty hashmap threshold create 200 0.95 \
 -s 74ad7e4e-9cae-45a8-884b-368a92803afe \
 -t rate -g 9736bbc0-8888-4700-96fc-58db5fded493
+--------------------------------------+--------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| Threshold ID                         | Level        | Cost       | Type | Field ID | Service ID                           | Group ID                             | Project ID |
+--------------------------------------+--------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| ed9fd297-37d4-4d9c-8f65-9919d554617b | 200.00000000 | 0.95000000 | rate | None     | 74ad7e4e-9cae-45a8-884b-368a92803afe | 9736bbc0-8888-4700-96fc-58db5fded493 | None       |
+--------------------------------------+--------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+

在此示例中,每个卷的评级为每 GiB 0.001,但如果大小超过 50GiB,您将获得 2% 的折扣,如果您进一步增加,您将获得 5% 的折扣(一次仅应用一个级别)。

对于项目 2d5b39657dc542d4b2a14b685335304e,当大小超过 50GiB 时,您将获得 3% 的折扣,而不是 2%,并且进一步增加时,您将获得相同的 5% 的折扣。

20GiB:

每个收集周期 0.02。

50GiB:

每个收集周期 0.049(对于项目 2d5b39657dc542d4b2a14b685335304e 为 0.0485)。

80GiB:

每个收集周期 0.0784(对于项目 2d5b39657dc542d4b2a14b685335304e 为 0.0776)。

250GiB:

每个收集周期 0.2375。