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)
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:
                "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)