Heat had a built in autoscaling thing that listened to a cloudwatch type thing and wanted to move because non-ideal (stats gathering inside image itself, cron job that could be killed, credentials problems), so there was some planning: slides video.
ceilometer gathers most of the required data, from outside the instances, on the compute nodes.
the alarm-evaluator waits for threshold to be crossed and calls a sort of webhook: it polls the api service instead of in-pipeline because of multi-dimensional aggregates of data.
can't be in the collector either because of multiple collectors for horizontal scaling