53 lines
No EOL
1.5 KiB
Text
53 lines
No EOL
1.5 KiB
Text
# Example of a min_max aggregator implemented with a starlark script.
|
|
|
|
supported_types = (["int", "float"])
|
|
state = {}
|
|
def add(metric):
|
|
gId = groupID(metric)
|
|
aggregate = state.get(gId)
|
|
if aggregate == None:
|
|
aggregate = {
|
|
"name": metric.name,
|
|
"tags": metric.tags,
|
|
"fields": {}
|
|
}
|
|
for k, v in metric.fields.items():
|
|
if type(v) in supported_types:
|
|
aggregate["fields"][k] = {
|
|
"min": v,
|
|
"max": v,
|
|
}
|
|
state[gId] = aggregate
|
|
else:
|
|
for k, v in metric.fields.items():
|
|
if type(v) in supported_types:
|
|
min_max = aggregate["fields"].get(k)
|
|
if min_max == None:
|
|
aggregate["fields"][k] = {
|
|
"min": v,
|
|
"max": v,
|
|
}
|
|
elif v < min_max["min"]:
|
|
aggregate["fields"][k]["min"] = v
|
|
elif v > min_max["max"]:
|
|
aggregate["fields"][k]["max"] = v
|
|
|
|
def push():
|
|
metrics = []
|
|
for a in state:
|
|
fields = {}
|
|
for k in state[a]["fields"]:
|
|
fields[k + "_min"] = state[a]["fields"][k]["min"]
|
|
fields[k + "_max"] = state[a]["fields"][k]["max"]
|
|
m = Metric(state[a]["name"], state[a]["tags"], fields)
|
|
metrics.append(m)
|
|
return metrics
|
|
|
|
def reset():
|
|
state.clear()
|
|
|
|
def groupID(metric):
|
|
key = metric.name + "-"
|
|
for k, v in metric.tags.items():
|
|
key = key + k + "-" + v
|
|
return hash(key) |