class Lifecycle(models.Model):
"""The Lifecycle table is the Master for a group of
Timing detail records. There is one Lifecycle row for
each instance seen in the event stream. The Timings
relate to the execution time for each .start/.end event
pair for this instance. These pairs are over the entire
lifespan of the instance, even across multiple api requests."""
instance = models.CharField(max_length=50, null=True,
blank=True, db_index=True)
last_state = models.CharField(max_length=50, null=True,
blank=True, db_index=True)
last_task_state = models.CharField(max_length=50, null=True,
blank=True, db_index=True)
last_raw = models.ForeignKey(RawData, null=True)
class Timing(models.Model):
"""Each Timing record corresponds to a .start/.end event pair
for an instance. It tracks how long it took this operation
to execute."""
name = models.CharField(max_length=50, db_index=True)
lifecycle = models.ForeignKey(Lifecycle)
start_raw = models.ForeignKey(RawData, related_name='+', null=True)
end_raw = models.ForeignKey(RawData, related_name='+', null=True)
start_when = models.DecimalField(null=True, max_digits=20,
decimal_places=6)
end_when = models.DecimalField(null=True, max_digits=20, decimal_places=6)
diff = models.DecimalField(null=True, max_digits=20, decimal_places=6,
db_index=True)
def aggregate_lifecycle(raw):
"""Roll up the raw event into a Lifecycle object
and a bunch of Timing objects.
We can use this for summarized timing reports.