/query

The /query function is used to populate charts. In the reqest a time range is specified and is converted to milliseconds for use with querying GridDB. If intervalMs is set, GridDB's TIME_SAMPLING function is used, otherwise a normal query is ran where the time range is control via where clauses.

@app.route('/query', methods=methods)
@cross_origin(max_age=600)
def query_metrics():
    req = request.get_json()
    results = []

    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)

    if 'intervalMs' in req:
        freq = "TIME_SAMPLING(*, TO_TIMESTAMP_MS("+ str(start) +"), TO_TIMESTAMP_MS("+ str(end) +"), "+ str(req.get('intervalMs'))+", MILLISECOND)"
    else:
        freq = "*"


    for target in req['targets']:
        datapoints= []
        if ':' not in target.get('target', ''):
            abort(404, Exception('Target must be of type: : got instead: ' + target['target']))

        req_type = target.get('type', 'timeserie')
        container, column = target['target'].split(':', 1)
        ts = gridstore.get_container(container)

        tql = "select "+ freq 
        if freq == "*":
            tql = tql + " where timestamp > TO_TIMESTAMP_MS("+str(start)+") and timestamp < TO_TIMESTAMP_MS("+str(end)+")"

        query = ts.query(tql) 
        rs = query.fetch(False) 
        columns = rs.get_column_names()
        
        while rs.has_next():
            data = rs.next()
            datapoints.append((data[int(columns.index(column))], int(data[0].timestamp()*1000)))
        column = {'target': '%s' % (container+" "+column), 'datapoints': datapoints}
        results.append(column)

    return jsonify(results)