You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.1 KiB
88 lines
2.1 KiB
export type GrafanaDatasource = { |
|
url: string, |
|
type: string, |
|
params: { |
|
db: string, |
|
q: string, |
|
epoch: string |
|
} |
|
} |
|
|
|
export type GrafanaMetricId = string; |
|
|
|
export class GrafanaMetric { |
|
|
|
private _metricQuery: MetricQuery = undefined; |
|
|
|
constructor( |
|
public datasource: GrafanaDatasource, |
|
public targets: any[], |
|
public id?: GrafanaMetricId |
|
) { |
|
if(datasource === undefined) { |
|
throw new Error('datasource is undefined'); |
|
} |
|
if(targets === undefined) { |
|
throw new Error('targets is undefined'); |
|
} |
|
if(targets.length === 0) { |
|
throw new Error('targets is empty'); |
|
} |
|
} |
|
|
|
public get metricQuery() { |
|
if(this._metricQuery === undefined) { |
|
this._metricQuery = new MetricQuery(this); |
|
} |
|
return this._metricQuery; |
|
} |
|
|
|
public toObject() { |
|
return { |
|
datasource: this.datasource, |
|
targets: this.targets, |
|
_id: this.id |
|
}; |
|
} |
|
|
|
static fromObject(obj: any): GrafanaMetric { |
|
if(obj === undefined) { |
|
throw new Error('obj is undefined'); |
|
} |
|
return new GrafanaMetric( |
|
obj.datasource, |
|
obj.targets, |
|
obj._id |
|
); |
|
} |
|
} |
|
|
|
export class MetricQuery { |
|
|
|
private static INFLUX_QUERY_TIME_REGEX = /time >[^A-Z]+/; |
|
|
|
private _queryParts: string[]; |
|
private _type: string; |
|
|
|
constructor(metric: GrafanaMetric) { |
|
this._type = metric.datasource.type; |
|
if (this._type !== 'influxdb') { |
|
throw new Error(`Queries of type "${metric.datasource.type}" are not supported yet.`); |
|
} |
|
var queryStr = metric.datasource.params.q; |
|
this._queryParts = queryStr.split(MetricQuery.INFLUX_QUERY_TIME_REGEX); |
|
if(this._queryParts.length == 1) { |
|
throw new Error( |
|
`Query "${queryStr}" is not replaced with LIMIT/OFFSET oeprators. Missing time clause.` |
|
); |
|
} |
|
if(this._queryParts.length > 2) { |
|
throw new Error(`Query "${queryStr}" has multiple time clauses. Can't parse.`); |
|
} |
|
} |
|
|
|
getQuery(from: number, to: number, limit: number, offset: number): string { |
|
let timeClause = `time >= ${from}ms AND time <= ${to}ms`; |
|
return `${this._queryParts[0]} ${timeClause} ${this._queryParts[1]} LIMIT ${limit} OFFSET ${offset}`; |
|
} |
|
}
|
|
|