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

277 lines
12 KiB
ReStructuredText

=====================
Hashmap rating module
=====================
CloudKitty is shipped with core rating modules.
Hashmap composition
===================
You can see hashmap as a simple tree:
.. graphviz:: 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 :
:math:`\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*:
.. code:: raw
$ 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:
.. code:: raw
$ cloudkitty hashmap service create compute
+---------+--------------------------------------+
| Name | Service ID |
+---------+--------------------------------------+
| compute | b19d801d-e7d4-46f9-970b-3e6d60fc07b5 |
+---------+--------------------------------------+
Create a field matching rule:
.. code:: raw
$ 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:
.. code:: raw
$ 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*:
.. code:: raw
$ 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:
.. code:: raw
$ cloudkitty hashmap service create volume
+--------+--------------------------------------+
| Name | Service ID |
+--------+--------------------------------------+
| volume | 74ad7e4e-9cae-45a8-884b-368a92803afe |
+--------+--------------------------------------+
Now let's setup the price per gigabyte:
.. code:: raw
$ 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):
.. code:: raw
$ 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):
.. code:: raw
$ 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):
.. code:: raw
$ 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.