Jump to: navigation, search

Ceilometer/blueprints/api-group-by

< Ceilometer‎ | blueprints
Revision as of 15:33, 15 January 2013 by JulienDanjou (talk)

Summary

The API should allow to do GROUP BY type operation.

User stories

  • I had an instance running for 6h. It started as a m1.tiny flavor during the first 2 hours and then grew up to a m1.large flavor for the next 4 hours. I need to get this two durations so I can bill them with different rates.

Design

Enhance API v2 so it implements a new arguments to do GROUP BY operations.

For exemple add:

g[].field=<field name>


That solves the user story above with:


/v2/meters/instance?
 q[0].field=resource&
 q[0].op=eq&
 q[0].value=<my-resource-id>&
 q[1].field=timestamp&
 q[1].op=lt&
 q[1].value=<now>&
 q[2].field=timestamp&
 q[2].op=gt&
 q[2].value=<now - 6 hours>&
 g[0].field=metadata.flavor&
 c[0]=sum&
 period=360


Would return

{[
  { "m1.tiny": 1 },
  { "m1.tiny": 1 },
  { "m1.large": 1 },
  { "m1.large": 1 },
  { "m1.large": 1 },
  { "m1.large": 1 },
]}


Further more, dropping the q[0] request that narrows the search to only one resource allows to retrieve this information for all instances over that period of time:

/v2/meters/instance?
 q[0].field=timestamp&
 q[0].op=lt&
 q[0].value=<now>&
 q[1].field=timestamp&
 q[1].op=gt&
 q[1].value=<now - 6 hours>&
 g[0].field=metadata.flavor&
 c[0]=sum&
 period=360


If there was another large instance, that would return:


{[
  { "m1.tiny": 1, "m1.large": 1 },
  { "m1.tiny": 1, "m1.large": 1 },
  { "m1.large": 2 },
  { "m1.large": 2 },
  { "m1.large": 2 },
  { "m1.large": 2 },
]}


Be careful that specifying a c[] is mandatory in a GROUP BY operation (as in SQL).