123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import { QueryResultMetaNotice } from '@grafana/data';
- import { MetricTankSeriesMeta } from './types';
- // https://github.com/grafana/metrictank/blob/master/scripts/config/storage-schemas.conf#L15-L46
- export interface RetentionInfo {
- interval: string;
- retention?: string;
- chunkspan?: string;
- numchunks?: number;
- ready?: boolean | number; // whether, or as of what data timestamp, the archive is ready for querying.
- }
- function toInteger(val?: string): number | undefined {
- if (val) {
- return parseInt(val, 10);
- }
- return undefined;
- }
- function toBooleanOrTimestamp(val?: string): number | boolean | undefined {
- if (val) {
- if (val === 'true') {
- return true;
- }
- if (val === 'false') {
- return false;
- }
- return parseInt(val, 10);
- }
- return undefined;
- }
- export function getRollupNotice(metaList: MetricTankSeriesMeta[]): QueryResultMetaNotice | null {
- for (const meta of metaList) {
- const archiveIndex = meta['archive-read'];
- if (archiveIndex > 0) {
- const schema = parseSchemaRetentions(meta['schema-retentions']);
- const intervalString = schema[archiveIndex].interval;
- const func = (meta['consolidator-normfetch'] ?? '').replace('Consolidator', '');
- return {
- text: `Data is rolled up, aggregated over ${intervalString} using ${func} function`,
- severity: 'info',
- inspect: 'meta',
- };
- }
- }
- return null;
- }
- export function getRuntimeConsolidationNotice(metaList: MetricTankSeriesMeta[]): QueryResultMetaNotice | null {
- for (const meta of metaList) {
- const runtimeNr = meta['aggnum-rc'];
- if (runtimeNr > 0) {
- const func = (meta['consolidator-rc'] ?? '').replace('Consolidator', '');
- return {
- text: `Data is runtime consolidated, ${runtimeNr} datapoints combined using ${func} function`,
- severity: 'info',
- inspect: 'meta',
- };
- }
- }
- return null;
- }
- export function parseSchemaRetentions(spec: string): RetentionInfo[] {
- if (!spec) {
- return [];
- }
- return spec.split(',').map((str) => {
- const vals = str.split(':');
- return {
- interval: vals[0],
- retention: vals[1],
- chunkspan: vals[2],
- numchunks: toInteger(vals[3]),
- ready: toBooleanOrTimestamp(vals[4]),
- };
- });
- }
|