Skip to content

Commit

Permalink
Convert ES node detail route to TS
Browse files Browse the repository at this point in the history
  • Loading branch information
weltenwort committed Apr 26, 2022
1 parent b947717 commit 1ebc79f
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
* 2.0.
*/

export * from './post_elasticsearch_node_detail';
export * from './post_elasticsearch_nodes';
export * from './post_elasticsearch_overview';
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import * as rt from 'io-ts';
import { ccsRT, clusterUuidRT, timeRangeRT } from '../shared';

export const postElasticsearchNodeDetailRequestParamsRT = rt.type({
clusterUuid: clusterUuidRT,
nodeUuid: rt.string,
});

export const postElasticsearchNodeDetailRequestPayloadRT = rt.intersection([
rt.partial({
ccs: ccsRT,
showSystemIndices: rt.boolean, // show/hide system indices in shard allocation table
}),
rt.type({
is_advanced: rt.boolean,
timeRange: timeRangeRT,
}),
]);

export type PostElasticsearchNodeDetailRequestPayload = rt.TypeOf<
typeof postElasticsearchNodeDetailRequestPayloadRT
>;

export const postElasticsearchNodeDetailResponsePayloadRT = rt.type({
// TODO: add payload entries
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
* 2.0.
*/

export const metricSets = {
import { MetricDescriptor } from '../../../../lib/details/get_metrics';

export const metricSets: {
advanced: MetricDescriptor[];
overview: MetricDescriptor[];
} = {
advanced: [
{
keys: ['node_jvm_mem_max_in_bytes', 'node_jvm_mem_used_in_bytes'],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,44 +6,43 @@
*/

import { get } from 'lodash';
import { schema } from '@kbn/config-schema';
import { prefixIndexPatternWithCcs } from '../../../../../common/ccs_utils';
import { CCS_REMOTE_PATTERN } from '../../../../../common/constants';
import {
postElasticsearchNodeDetailRequestParamsRT,
postElasticsearchNodeDetailRequestPayloadRT,
postElasticsearchNodeDetailResponsePayloadRT,
} from '../../../../../common/http_api/elasticsearch';
import { getClusterStats } from '../../../../lib/cluster/get_cluster_stats';
import { createValidationFunction } from '../../../../lib/create_route_validation_function';
import {
getMetrics,
MetricDescriptor,
NamedMetricDescriptor,
} from '../../../../lib/details/get_metrics';
import { getNodeSummary } from '../../../../lib/elasticsearch/nodes';
import { getShardStats, getShardAllocation } from '../../../../lib/elasticsearch/shards';
import { getMetrics } from '../../../../lib/details/get_metrics';
import { getShardAllocation, getShardStats } from '../../../../lib/elasticsearch/shards';
import { handleError } from '../../../../lib/errors/handle_error';
import { prefixIndexPatternWithCcs } from '../../../../../common/ccs_utils';
import { metricSets } from './metric_set_node_detail';
import { getLogs } from '../../../../lib/logs/get_logs';
import { CCS_REMOTE_PATTERN } from '../../../../../common/constants';
import { MonitoringCore } from '../../../../types';
import { metricSets } from './metric_set_node_detail';

const { advanced: metricSetAdvanced, overview: metricSetOverview } = metricSets;

export function esNodeRoute(server) {
export function esNodeRoute(server: MonitoringCore) {
const validateParams = createValidationFunction(postElasticsearchNodeDetailRequestParamsRT);
const validateBody = createValidationFunction(postElasticsearchNodeDetailRequestPayloadRT);

server.route({
method: 'POST',
method: 'post',
path: '/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/nodes/{nodeUuid}',
config: {
validate: {
params: schema.object({
clusterUuid: schema.string(),
nodeUuid: schema.string(),
}),
body: schema.object({
ccs: schema.maybe(schema.string()),
showSystemIndices: schema.boolean({ defaultValue: false }), // show/hide system indices in shard allocation table
timeRange: schema.object({
min: schema.string(),
max: schema.string(),
}),
is_advanced: schema.boolean(),
}),
},
validate: {
params: validateParams,
body: validateBody,
},
async handler(req) {
const config = server.config;
const ccs = req.payload.ccs;
const showSystemIndices = req.payload.showSystemIndices;
const showSystemIndices = req.payload.showSystemIndices ?? false;
const clusterUuid = req.params.clusterUuid;
const nodeUuid = req.params.nodeUuid;
const start = req.payload.timeRange.min;
Expand All @@ -55,23 +54,27 @@ export function esNodeRoute(server) {
);
const isAdvanced = req.payload.is_advanced;

let metricSet;
let metricSet: MetricDescriptor[];
if (isAdvanced) {
metricSet = metricSetAdvanced;
} else {
metricSet = metricSetOverview;
// set the cgroup option if needed
const showCgroupMetricsElasticsearch = config.ui.container.elasticsearch.enabled;
const metricCpu = metricSet.find((m) => m.name === 'node_cpu_metric');
if (showCgroupMetricsElasticsearch) {
metricCpu.keys = ['node_cgroup_quota_as_cpu_utilization'];
} else {
metricCpu.keys = ['node_cpu_utilization'];
const metricCpu = metricSet.find(
(m): m is NamedMetricDescriptor => typeof m === 'object' && m.name === 'node_cpu_metric'
);
if (metricCpu) {
if (showCgroupMetricsElasticsearch) {
metricCpu.keys = ['node_cgroup_quota_as_cpu_utilization'];
} else {
metricCpu.keys = ['node_cpu_utilization'];
}
}
}

try {
const cluster = await getClusterStats(req, clusterUuid, ccs);
const cluster = await getClusterStats(req, clusterUuid);

const clusterState = get(
cluster,
Expand Down Expand Up @@ -132,12 +135,12 @@ export function esNodeRoute(server) {
});
}

return {
return postElasticsearchNodeDetailResponsePayloadRT.encode({
nodeSummary,
metrics,
logs,
...shardAllocation,
};
});
} catch (err) {
throw handleError(err, req);
}
Expand Down

0 comments on commit 1ebc79f

Please sign in to comment.