sheetsync: Record counts of rows in the DB, segmented by various columns

This lets us view a number of useful graphs in dashboards, eg. rows by state,
errored rows, rows by day, rows by category, meltdowns per day, fraction of
events that are poster moments by category.

Sheetsync was the natural place to do this since it was already periodically scanning
the entire events table.
pull/151/head
Mike Lang 5 years ago
parent 72172024be
commit 89a9e5554c

@ -151,8 +151,12 @@ grafana.dashboard({
{ {
name: "Database events by state", name: "Database events by state",
axis: {min: 0, label: "events"}, axis: {min: 0, label: "events"},
tooltip: "Not implemented", // TODO stack: true,
expressions: {"Not implemented": "0"}, expressions: {
"{{state}}": |||
sum(event_counts) by (state)
|||,
},
}, },
], ],
], ],

@ -3,6 +3,7 @@ import json
import logging import logging
import signal import signal
import uuid import uuid
from collections import defaultdict
import argh import argh
import gevent.backdoor import gevent.backdoor
@ -41,6 +42,12 @@ rows_changed = prom.Counter(
['type', 'worksheet'], ['type', 'worksheet'],
) )
event_counts = prom.Gauge(
'event_counts',
'Number of rows in the database',
['sheet_name', 'category', 'poster_moment', 'state', 'errored'],
)
class SheetSync(object): class SheetSync(object):
# Time between syncs # Time between syncs
@ -190,8 +197,12 @@ class SheetSync(object):
"""Return the entire events table as a map {id: event namedtuple}""" """Return the entire events table as a map {id: event namedtuple}"""
result = query(self.conn, "SELECT * FROM events") result = query(self.conn, "SELECT * FROM events")
by_id = {} by_id = {}
counts = defaultdict(lambda: 0)
for row in result.fetchall(): for row in result.fetchall():
by_id[row.id] = row by_id[row.id] = row
counts[row.sheet_name, row.category, str(row.poster_moment), row.state, str(bool(row.error))] += 1
for labels, count in counts.items():
event_counts.labels(*labels).set(count)
return by_id return by_id
def parse_row(self, row): def parse_row(self, row):

Loading…
Cancel
Save