skyline/src/stores/prometheus/openstack-service.js
zhuyue e21ddcf1bd feature: Add prometheus base component
add prometheus base component

Change-Id: I4c3c646ddf94ae3c03e98601dbe301fa2ca9e933
2021-11-30 15:55:03 +08:00

315 lines
8.1 KiB
JavaScript

// Copyright 2021 99cloud
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { action, observable, set } from 'mobx';
import { getPromises } from 'components/PrometheusChart/utils/utils';
import MonitorBase from './monitor-base';
const serviceNameMap = {
mysql_up: t('Database Service'),
rabbitmq_identity_info: t('Message Queue Service'),
memcached_up: t('Cache Service'),
};
const indexToServiceName = [
t('Database Service'),
t('Message Queue Service'),
t('Cache Service'),
];
export class OpenstackServiceStore extends MonitorBase {
// @observable
// nodes = [];
// @observable
// node = {};
@observable
nova_service = {
isLoading: false,
data: [],
};
@observable
network_service = {
isLoading: false,
data: [],
};
@observable
cinder_service = {
isLoading: false,
data: [],
};
@observable
other_service = {
isLoading: false,
data: [],
};
@action
getChartData = async () => {
// const { hostname } = this.node.metric;
const defaultPromises = [
this.getNovaService(),
this.getNetworkService(),
this.getCinderService(),
this.getOtherService(),
];
await Promise.all(defaultPromises);
};
@action
getNovaService = async () => {
set(this.nova_service, {
isLoading: true,
data: [],
});
const [currentState, last24State, libvirtdState, libvirtd24State] =
await Promise.all(getPromises.call(this, 'openstackService.novaService'));
const {
data: { result: currentStateResult },
} = currentState;
const tmp = [];
currentStateResult.forEach((service) => {
const {
metric: {
service: serviceName = '',
adminState = '',
hostname = '',
} = {},
} = service;
tmp.push({
hostname,
serviceName,
state: adminState === 'enabled' ? 'up' : 'down',
});
});
const {
data: { result: last24HResult },
} = last24State;
last24HResult.forEach((service) => {
const { metric: { service: serviceName = '', hostname = '' } = {} } =
service;
const idx = tmp.findIndex(
(item) => item.serviceName === serviceName && item.hostname === hostname
);
tmp[idx][`${serviceName}24`] = 'down';
});
const {
data: { result: data },
} = libvirtdState;
data.forEach((item) => {
const { metric, value } = item;
tmp.push({
// hard code
serviceName: 'nova_libvirt',
hostname: metric.hostname,
state: value[1] === 'enabled' ? 'up' : 'down',
});
});
const {
data: { result: libvirtd24Result },
} = libvirtd24State;
libvirtd24Result.forEach((service) => {
const { metric: { hostname = '' } = {} } = service;
const idx = tmp.findIndex(
(item) =>
item.serviceName === 'nova_libvirt' && item.hostname === hostname
);
tmp[idx].nova_libvirt24 = 'down';
});
set(this.nova_service, {
isLoading: false,
data: tmp,
});
};
@action
getNetworkService = async () => {
set(this.network_service, {
isLoading: true,
data: [],
});
const [currentState, last24State] = await Promise.all(
getPromises.call(this, 'openstackService.networkService')
);
const {
data: { result: currentStateResult },
} = currentState;
const tmp = [];
currentStateResult.forEach((service) => {
const {
metric: {
service: serviceName = '',
adminState = '',
hostname = '',
} = {},
} = service;
tmp.push({
serviceName,
hostname,
state: adminState,
});
});
const {
data: { result: last24HResult },
} = last24State;
last24HResult.forEach((service) => {
const { metric: { service: serviceName = '', hostname = '' } = {} } =
service;
const idx = tmp.findIndex(
(item) => item.serviceName === serviceName && item.hostname === hostname
);
tmp[idx][`${serviceName}24`] = 'down';
});
set(this.network_service, {
isLoading: false,
data: tmp,
});
};
@action
getCinderService = async () => {
set(this.cinder_service, {
isLoading: true,
data: [],
});
const [currentState, last24State] = await Promise.all(
getPromises.call(this, 'openstackService.cinderService')
);
const {
data: { result: currentStateResult },
} = currentState;
const tmp = [];
currentStateResult.forEach((service) => {
const {
metric: {
service: serviceName = '',
adminState = '',
hostname = '',
} = {},
} = service;
tmp.push({
serviceName,
hostname,
state: adminState === 'enabled' ? 'up' : 'down',
});
});
const {
data: { result: last24HResult },
} = last24State;
last24HResult.forEach((service) => {
const { metric: { service: serviceName = '', hostname = '' } = {} } =
service;
const idx = tmp.findIndex(
(item) => item.serviceName === serviceName && item.hostname === hostname
);
tmp[idx][`${serviceName}24`] = 'down';
});
set(this.cinder_service, {
isLoading: false,
data: tmp,
});
};
@action
getOtherService = async () => {
set(this.other_service, {
isLoading: true,
data: [],
});
const tmp = [];
let results = await Promise.all(
getPromises.call(this, 'openstackService.otherService')
);
results.forEach((result) => {
const {
data: { result: data },
} = result;
data.forEach((d) => {
const { metric, value } = d;
tmp.push({
serviceName: serviceNameMap[metric.__name__],
hostname: metric.instance,
state: value[1] === '1' ? 'up' : 'down',
});
});
});
results = await Promise.all(
getPromises.call(this, 'openstackService.otherServiceMinOverTime')
);
results.forEach((result, index) => {
const {
data: { result: last24HResult },
} = result;
last24HResult.forEach((service) => {
const { metric: { instance = '' } = {} } = service;
const idx = tmp.findIndex(
(item) =>
item.serviceName === indexToServiceName[index] &&
item.hostname === instance
);
tmp[idx][`${indexToServiceName[index]}24`] = 'down';
});
});
// const [heatResponse, heat24Response] = await Promise.all(
// getPromises.call(this, 'openstackService.heatMinOverTime')
// );
// const {
// data: { result: heatResults },
// } = heatResponse;
// heatResults.forEach((item) => {
// const {
// metric: {
// host = '',
// binary = '',
// engine_id = '',
// services_status = '',
// } = {},
// } = item;
// tmp.push({
// serviceName: binary,
// host,
// state: services_status,
// engine_id,
// });
// });
// const {
// data: { result: heat24Results },
// } = heat24Response;
// heat24Results.forEach((result) => {
// const { metric: { binary = '', engine_id = '', host = '' } = {} } =
// result;
// const idx = tmp.findIndex(
// (item) =>
// item.serviceName === binary &&
// item.host === host &&
// item.engine_id === engine_id
// );
// tmp[idx][`${binary}24`] = 'down';
// });
set(this.other_service, {
isLoading: false,
data: tmp,
});
};
}
const globalOpenstackServiceStore = new OpenstackServiceStore();
export default globalOpenstackServiceStore;