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 定义特定规则。
配置中指定的每个 groupby 和 metadata 属性都可以用于字段
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_id 和 volume_type 可用于根据实例的 flavor 或卷的类型应用不同的定价。
映射¶
映射是最终对象,它会触发计算,例如实例上 flavor 的特定值。
有两种类型的映射:字段 和 服务 映射。
字段映射¶
字段映射用于匹配资源的属性/元数据。例如,如果您有三种希望应用不同评级规则的卷类型,则必须按以下方式进行操作
创建一个与卷指标的名称或
alt_name匹配的 hashmap 服务(使用默认 gnocchi 的volume.size)。在该服务中,创建一个与卷类型元数据名称相同的字段(使用默认 gnocchi 的
volume_type)。在该字段中,为
volume_type元数据的每个可能值创建一个映射。示例SSD_gold: 0.03SSD_silver: 0.02HDD_bronze: 0.01
现在,该卷指标的每个元素都将基于其 volume_type 元数据。10GiB SSD_gold 卷将在每个收集周期评级为 0.3,1GiB HDD_bronze 卷将在每个收集周期评级为 0.01,0.5GiB SSD_silver 将评级为 0.01…
服务映射¶
服务映射不与字段关联,而是直接与服务关联。如果直接在 volume.size 服务上创建映射,则将根据此映射评级每个卷,而无需基于元数据的区分。
固定值和费率¶
映射可以有两种类型:flat 或 rate。固定值映射只是添加到给定项目的总额中,而费率则乘以总额。请参阅下面的用例示例。
注意
如果同一组的多个固定值映射匹配,则仅应用最昂贵的映射。
范围¶
可以将映射绑定到特定的范围/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。要使用自定义周期(start 和 end)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。