cloudkitty/doc/source/user/rating/hashmap.rst

12 KiB

Hashmap rating module

CloudKitty is shipped with core rating modules.

Hashmap composition

You can see hashmap as a simple tree:

graph/hashmap.dot

HashMap is composed of different resources and groups.

Group

A group is a way to group calculations of mappings. For example you might want to apply a set of rules to charge instance_uptime and another set to block storage volume. You don't want the two to be linked so you'll create one group for each calculation.

Service

A service is a way to map the rule to the type of data collected. Currently, the following services are available:

  • compute
  • image
  • volume
  • network.bw.in
  • network.bw.out
  • network.floating
  • radosgw.usage

Enabled services are defined in the configuration file. By default, only the compute service is enabled.

Field

A field is referring to a metadata field of a resource. For example on an instance object (compute), you can use the flavor to define specific rules.

With Gnocchi as collector, the following fields are available for each service:

  • Compute: flavor_id, vcpus, image_id, memory (MB)
  • Image: container_format, disk_format

Mapping

A mapping is the final object, it's what triggers calculation, for example a specific value of flavor on an instance. It maps cost to a value of metadata in case of field mapping. And directly a cost in case of service mapping.

A mapping can be project specific by providing a project id at creation and supports overloading, i.e. you can specify multiple mappings for the same value with different project ids and costs.

Threshold

A threshold entry is used to apply rating rules base on level. Its behaviour is similar to a mapping except that it applies the cost base on the level.

As for mapping, a threshold can be project specific by providing a project id at creation.

HashMap formula

Based on all the previous objects here's the calculation formula : $\sum_{n=1}^N G_n(qty.(T_{rate}\prod(M_{rate})(T_{flat}+M_{flat})))$

G

Group

qty

Quantity of resource

T

Threshold

M

Mapping

For an active resource on a collection period, quantity is defined as follow:

  • compute: 1 (unit: instance)
  • image: upload image size (unit: MB)
  • volume: volume size (unit: GB)
  • network.bw.in: ingoing network usage (unit: MB)
  • network.bw.out: outgoing network usage (unit: MB)
  • network.floating: 1 (unit: ip)
  • radosgw.usage: Ceph object storage usage (unit: GB)

Example

Compute uptime

Apply rating rule on the compute service to charge the instance based on it's flavor and uptime:

Create a group instance_uptime_flavor:

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

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

Create the service matching rule:

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

Create a field matching rule:

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

Create a mapping in the group instance_uptime_flavor that will map m1.tiny instance to a cost of 0.01:

$ cloudkitty hashmap mapping create 0.01 \
 --field-id 18aa50b6-6da8-4c47-8a1f-43236b971625 \
 --value m1.tiny -t flat -g 9a2ff37d-be86-4642-8b7d-567bace61f06
+--------------------------------------+---------+------------+------+--------------------------------------+------------+--------------------------------------+------------+
| Mapping ID                           | Value   | Cost       | Type | Field ID                             | Service ID | Group ID                             | Project ID |
+--------------------------------------+---------+------------+------+--------------------------------------+------------+--------------------------------------+------------+
| 9c2418dc-99d3-44b6-8fdf-e9fa02f3ceb5 | m1.tiny | 0.01000000 | flat | 18aa50b6-6da8-4c47-8a1f-43236b971625 | None       | 9a2ff37d-be86-4642-8b7d-567bace61f06 | None       |
+--------------------------------------+---------+------------+------+--------------------------------------+------------+--------------------------------------+------------+

In this example every machine in any project with the flavor m1.tiny will be charged 0.01 per collection period.

Volume per gb with discount

Now let's do some threshold based rating.

Create a group 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 |
+------------------------+--------------------------------------+

Create the service matching rule:

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

Now let's setup the price per gigabyte:

$ cloudkitty hashmap mapping create 0.001 \
 -s 74ad7e4e-9cae-45a8-884b-368a92803afe \
 -t flat -g 9736bbc0-8888-4700-96fc-58db5fded493
+--------------------------------------+-------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| Mapping ID                           | Value | Cost       | Type | Field ID | Service ID                           | Group ID                             | Project ID |
+--------------------------------------+-------+------------+------+----------+--------------------------------------+--------------------------------------+------------+
| 09e36b13-ce89-4bd0-bbf1-1b80577031e8 | None  | 0.00100000 | flat | None     | 74ad7e4e-9cae-45a8-884b-368a92803afe | 9736bbc0-8888-4700-96fc-58db5fded493 | None       |
+--------------------------------------+-------+------------+------+----------+--------------------------------------+--------------------------------------+------------+

We have the basic price per gigabyte be we now want to apply a discount on huge data volumes. Create the thresholds in the group volume_thresholds that will map different volume quantity to costs:

Here we set a threshold when going past 50GB, and apply a 2% discount (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       |
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+

Here we set the same threshold for project 2d5b39657dc542d4b2a14b685335304e but with a 3% discount (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 |
+--------------------------------------+-------------+------------+------+----------+--------------------------------------+--------------------------------------+----------------------------------+

Here we set a threshold when going past 200GB, and apply a 5% discount (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       |
+--------------------------------------+--------------+------------+------+----------+--------------------------------------+--------------------------------------+------------+

In this example every volume is charged 0.001 per GB but if the size goes past 50GB you'll get a 2% discount, if you even go further you'll get 5% discount (only one level apply at a time).

For project 2d5b39657dc542d4b2a14b685335304e only, you'll get a 3% discount instead of 2% when the size goes past 50GB and the same %5 discount it goes further.

20GB

0.02 per collection period.

50GB

0.049 per collection period (0.0485 for project 2d5b39657dc542d4b2a14b685335304e).

80GB

0.0784 per collection period (0.0776 for project 2d5b39657dc542d4b2a14b685335304e).

250GB

0.2375 per collection period.