2025-04-01 10:38:02 +09:00

130 lines
3.5 KiB
TypeScript

import { Factory } from 'fishery';
import { uniqueId } from 'lodash';
import { DataSourceInstanceSettings, PluginType } from '@grafana/data';
import { config } from '@grafana/runtime';
import { FolderDTO } from 'app/types';
import {
PromAlertingRuleDTO,
PromAlertingRuleState,
PromRuleGroupDTO,
PromRuleType,
RulerAlertingRuleDTO,
RulerRecordingRuleDTO,
RulerRuleGroupDTO,
} from 'app/types/unified-alerting-dto';
import { setupDataSources } from '../../testSetup/datasources';
import { DataSourceType } from '../../utils/datasource';
const prometheusRuleFactory = Factory.define<PromAlertingRuleDTO>(({ sequence }) => ({
name: `test-rule-${sequence}`,
query: 'test-query',
state: PromAlertingRuleState.Inactive,
type: PromRuleType.Alerting,
health: 'ok',
labels: { team: 'infra' },
}));
const rulerAlertingRuleFactory = Factory.define<RulerAlertingRuleDTO>(({ sequence }) => ({
alert: `ruler-alerting-rule-${sequence}`,
expr: 'vector(0)',
annotations: { 'annotation-key-1': 'annotation-value-1' },
labels: { 'label-key-1': 'label-value-1' },
for: '5m',
}));
const rulerRecordingRuleFactory = Factory.define<RulerRecordingRuleDTO>(({ sequence }) => ({
record: `ruler-recording-rule-${sequence}`,
expr: 'vector(0)',
labels: { 'label-key-1': 'label-value-1' },
}));
const rulerRuleGroupFactory = Factory.define<RulerRuleGroupDTO>(({ sequence }) => ({
name: `ruler-rule-group-${sequence}`,
rules: [],
interval: '1m',
}));
const prometheusRuleGroupFactory = Factory.define<PromRuleGroupDTO>(({ sequence }) => {
const group = {
name: `test-group-${sequence}`,
file: `test-namespace`,
interval: 10,
rules: prometheusRuleFactory.buildList(10),
};
prometheusRuleFactory.rewindSequence();
return group;
});
const dataSourceFactory = Factory.define<DataSourceInstanceSettings>(({ sequence, params, afterBuild }) => {
afterBuild((dataSource) => {
config.datasources[dataSource.name] = dataSource;
setupDataSources(...Object.values(config.datasources));
});
const uid = params.uid ?? `mock-ds-${sequence}`;
return {
id: params.id ?? sequence,
uid,
type: DataSourceType.Prometheus,
name: `Prometheus-${uid}`,
access: 'proxy',
url: `/api/datasources/proxy/uid/${uid}`,
jsonData: {},
meta: {
info: {
author: { name: 'Grafana Labs' },
description: 'Open source time series database & alerting',
updated: '',
version: '',
logos: {
small: 'https://prometheus.io/assets/prometheus_logo_grey.svg',
large: 'https://prometheus.io/assets/prometheus_logo_grey.svg',
},
links: [],
screenshots: [],
},
name: 'Prometheus',
type: PluginType.datasource,
id: 'prometheus',
baseUrl: '"public/app/plugins/datasource/prometheus"',
module: 'core:plugin/prometheus',
},
readOnly: false,
};
});
const grafanaFolderFactory = Factory.define<FolderDTO>(({ sequence }) => ({
id: sequence,
uid: uniqueId(),
title: `Mock Folder ${sequence}`,
version: 1,
url: '',
canAdmin: true,
canDelete: true,
canEdit: true,
canSave: true,
created: '',
createdBy: '',
hasAcl: false,
updated: '',
updatedBy: '',
}));
export const alertingFactory = {
folder: grafanaFolderFactory,
prometheus: {
group: prometheusRuleGroupFactory,
rule: prometheusRuleFactory,
},
ruler: {
group: rulerRuleGroupFactory,
alertingRule: rulerAlertingRuleFactory,
recordingRule: rulerRecordingRuleFactory,
},
dataSource: dataSourceFactory,
};