/annotations
Annotations are used to mark, or note different points on charts. They query format is \. Like /query a time range is specified and is converted to milliseconds. To avoid marking every point on the graph, only the first annotation in a series is added and future annotations won't be added unless there is a gap of at least sixty seconds.
@app.route('/annotations', methods=methods)
@cross_origin(max_age=600)
def query_annotations():
req = request.get_json()
response = []
start = int(datetime.strptime(req['range']['from'], "%Y-%m-%dT%H:%M:%S.%fZ").timestamp()*1000)
end = int(datetime.strptime(req['range']['to'], "%Y-%m-%dT%H:%M:%S.%fZ").timestamp()*1000)
container, query = req['annotation']['query'].split(':', 1)
ts = gridstore.get_container(container)
tql = "select * where timestamp > TO_TIMESTAMP_MS("+str(start)+") and timestamp < TO_TIMESTAMP_MS("+str(end)+") and ( "+query+" )"
query = ts.query(tql)
rs = query.fetch(False)
last = None
while rs.has_next():
data = rs.next()
if not last or data[0].timestamp() - last[0].timestamp() > 60:
response.append({
"annotation": container, # The original annotation sent from Grafana.
"time": int(data[0].timestamp()*1000), # Time since UNIX Epoch in milliseconds. (required)
"title": container+" "+query, # The title for the annotation tooltip. (required)
})
last = data
return jsonify(response)