2019-06-24 08:42:08 +02:00
|
|
|
import _ from 'lodash';
|
|
|
|
|
import React, { Component } from 'react';
|
|
|
|
|
|
|
|
|
|
import { PrometheusDatasource } from '../datasource';
|
|
|
|
|
import { PromQuery } from '../types';
|
2019-10-31 10:48:05 +01:00
|
|
|
import { DataQueryRequest, PanelData } from '@grafana/data';
|
2019-06-24 08:42:08 +02:00
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
|
datasource: PrometheusDatasource;
|
|
|
|
|
query: PromQuery;
|
2020-04-20 07:34:49 +02:00
|
|
|
panelData?: PanelData;
|
2019-06-24 08:42:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface State {
|
|
|
|
|
href: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default class PromLink extends Component<Props, State> {
|
2020-07-06 21:16:27 +02:00
|
|
|
state: State = { href: '' };
|
|
|
|
|
|
2019-06-24 08:42:08 +02:00
|
|
|
async componentDidUpdate(prevProps: Props) {
|
2020-04-20 07:34:49 +02:00
|
|
|
const { panelData } = this.props;
|
|
|
|
|
|
|
|
|
|
if (panelData && panelData.request && prevProps.panelData !== panelData) {
|
|
|
|
|
const href = await this.getExternalLink(panelData);
|
2019-06-24 08:42:08 +02:00
|
|
|
this.setState({ href });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-20 07:34:49 +02:00
|
|
|
async getExternalLink(panelData: PanelData): Promise<string> {
|
2020-07-13 13:14:50 +02:00
|
|
|
const { query, datasource } = this.props;
|
2020-04-20 07:34:49 +02:00
|
|
|
const { request } = panelData;
|
|
|
|
|
|
|
|
|
|
if (!request) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const range = request.range;
|
2019-06-24 08:42:08 +02:00
|
|
|
const start = datasource.getPrometheusTime(range.from, false);
|
|
|
|
|
const end = datasource.getPrometheusTime(range.to, true);
|
|
|
|
|
const rangeDiff = Math.ceil(end - start);
|
|
|
|
|
const endTime = range.to.utc().format('YYYY-MM-DD HH:mm');
|
|
|
|
|
|
|
|
|
|
const options = {
|
2020-04-20 07:34:49 +02:00
|
|
|
interval: request.interval,
|
2019-06-24 08:42:08 +02:00
|
|
|
} as DataQueryRequest<PromQuery>;
|
2020-04-20 07:34:49 +02:00
|
|
|
|
2019-06-24 08:42:08 +02:00
|
|
|
const queryOptions = datasource.createQuery(query, options, start, end);
|
|
|
|
|
const expr = {
|
|
|
|
|
'g0.expr': queryOptions.expr,
|
|
|
|
|
'g0.range_input': rangeDiff + 's',
|
|
|
|
|
'g0.end_input': endTime,
|
|
|
|
|
'g0.step_input': queryOptions.step,
|
|
|
|
|
'g0.tab': 0,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const args = _.map(expr, (v: string, k: string) => {
|
|
|
|
|
return k + '=' + encodeURIComponent(v);
|
|
|
|
|
}).join('&');
|
|
|
|
|
return `${datasource.directUrl}/graph?${args}`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
render() {
|
|
|
|
|
const { href } = this.state;
|
2020-04-20 07:34:49 +02:00
|
|
|
|
2019-06-24 08:42:08 +02:00
|
|
|
return (
|
2020-11-18 15:36:35 +01:00
|
|
|
<a href={href} target="_blank" rel="noopener noreferrer">
|
2020-04-20 07:34:49 +02:00
|
|
|
Prometheus
|
2019-06-24 08:42:08 +02:00
|
|
|
</a>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|