diff --git a/packages/kbn-apm-synthtrace-client/index.ts b/packages/kbn-apm-synthtrace-client/index.ts index 4eb96051bb5ba..1441e9ecc4de4 100644 --- a/packages/kbn-apm-synthtrace-client/index.ts +++ b/packages/kbn-apm-synthtrace-client/index.ts @@ -22,6 +22,7 @@ export { httpExitSpan } from './src/lib/apm/span'; export { DistributedTrace } from './src/lib/dsl/distributed_trace_client'; export { serviceMap } from './src/lib/dsl/service_map'; export type { Fields } from './src/lib/entity'; +export { Entity } from './src/lib/entity'; export { infra, type InfraDocument } from './src/lib/infra'; export { parseInterval } from './src/lib/interval'; export { monitoring, type MonitoringDocument } from './src/lib/monitoring'; diff --git a/packages/kbn-apm-synthtrace-client/src/lib/assets/asset.ts b/packages/kbn-apm-synthtrace-client/src/lib/assets/asset.ts index e91c1b2869aa0..592c89d15a2fd 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/assets/asset.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/assets/asset.ts @@ -9,7 +9,7 @@ import { Fields } from '../entity'; import { Serializable } from '../serializable'; -type AssetType = 'host' | 'pod' | 'container' | 'service'; +type AssetType = 'host' | 'pod' | 'container' | 'service' | 'aws_rds'; export interface AssetDocument extends Fields { 'asset.id': string; diff --git a/packages/kbn-apm-synthtrace-client/src/lib/infra/aws/rds.ts b/packages/kbn-apm-synthtrace-client/src/lib/infra/aws/rds.ts new file mode 100644 index 0000000000000..a869e0a981bb1 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/infra/aws/rds.ts @@ -0,0 +1,49 @@ +/* + * 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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable max-classes-per-file */ +import { Entity, Fields } from '../../entity'; +import { Serializable } from '../../serializable'; + +export interface AWSRdsDocument extends Fields { + 'aws.rds.db_instance.arn': string; + 'aws.rds.db_instance.identifier': string; + 'metricset.name'?: string; + 'event.dataset'?: string; +} + +export interface AWSRdsMetricsDocument extends AWSRdsDocument { + 'aws.rds.cpu.total.pct'?: number; + 'aws.rds.database_connections'?: number; + 'aws.rds.latency.dml'?: number; + 'aws.rds.latency.read'?: number; + 'aws.rds.latency.write'?: number; + 'aws.rds.latency.insert'?: number; + 'aws.rds.latency.update'?: number; + 'aws.rds.latency.commit'?: number; + 'aws.rds.queries'?: number; +} + +class AWSRdsMetrics extends Serializable {} + +export class AWSRds extends Entity { + metrics(metricsFields: AWSRdsMetricsDocument) { + return new AWSRdsMetrics({ + ...this.fields, + ...metricsFields, + }); + } +} + +export function awsRds(arn: string, name: string): AWSRds { + return new AWSRds({ + 'aws.rds.db_instance.arn': arn, + 'aws.rds.db_instance.identifier': name, + 'event.dataset': 'aws.rds', + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/infra/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/infra/index.ts index fb81b595c7e2f..c325635e27098 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/infra/index.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/infra/index.ts @@ -10,16 +10,19 @@ import { dockerContainer, DockerContainerMetricsDocument } from './docker_contai import { host, HostMetricsDocument } from './host'; import { k8sContainer, K8sContainerMetricsDocument } from './k8s_container'; import { pod, PodMetricsDocument } from './pod'; +import { awsRds, AWSRdsMetricsDocument } from './aws/rds'; export type InfraDocument = | HostMetricsDocument | PodMetricsDocument | DockerContainerMetricsDocument - | K8sContainerMetricsDocument; + | K8sContainerMetricsDocument + | AWSRdsMetricsDocument; export const infra = { host, pod, dockerContainer, k8sContainer, + awsRds, }; diff --git a/packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_es_client.ts b/packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_es_client.ts index 031c40c9ccf19..6c42d7051a9b0 100644 --- a/packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_es_client.ts +++ b/packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_es_client.ts @@ -64,6 +64,8 @@ function getRoutingTransform() { document._index = 'metrics-kubernetes.container-default'; } else if ('kubernetes.pod.uid' in document) { document._index = 'metrics-kubernetes.pod-default'; + } else if ('aws.rds.db_instance.arn' in document) { + document._index = 'metrics-aws.rds-default'; } else { throw new Error('Cannot determine index for event'); } diff --git a/packages/kbn-apm-synthtrace/src/scenarios/infra_aws_rds.ts b/packages/kbn-apm-synthtrace/src/scenarios/infra_aws_rds.ts new file mode 100644 index 0000000000000..4a1c575b904ba --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/infra_aws_rds.ts @@ -0,0 +1,56 @@ +/* + * 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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { InfraDocument, ApmFields, infra } from '@kbn/apm-synthtrace-client'; +import { Scenario } from '../cli/scenario'; +import { withClient } from '../lib/utils/with_client'; + +const numRds = 50; +const scenario: Scenario = async (runOptions) => { + return { + generate: ({ range, clients: { infraEsClient } }) => { + const { logger } = runOptions; + + // Infra hosts Data logic + + const RDS = Array(numRds) + .fill(0) + .map((_, idx) => infra.awsRds(`redis-${idx}`, `redis-${idx}`)); + + const rds = range + .interval('30s') + .rate(1) + .generator((timestamp) => + RDS.flatMap((item) => [ + item + .metrics({ + ...item.fields, + 'aws.rds.cpu.total.pct': 0.4, + 'aws.rds.database_connections': 5, + 'aws.rds.latency.read': 500 * 1000, + 'aws.rds.latency.write': 500 * 1000, + 'aws.rds.latency.insert': 500 * 1000, + 'aws.rds.latency.update': 500 * 1000, + 'aws.rds.latency.commit': 500 * 1000, + 'aws.rds.latency.dml': 500 * 1000, + 'aws.rds.queries': 100, + }) + .timestamp(timestamp), + ]) + ); + + return [ + withClient( + infraEsClient, + logger.perf('generating_infra_aws_rds', () => rds) + ), + ]; + }, + }; +}; + +export default scenario; diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/snapshot/cpu.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/snapshot/cpu.ts index d001e144c5408..1323021d28be3 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/snapshot/cpu.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/snapshot/cpu.ts @@ -19,7 +19,7 @@ export const cpu: MetricsUIAggregation = { cpu: 'cpu_avg', }, script: { - source: 'params.cpu / 100', + source: 'params.cpu', lang: 'painless', }, gap_policy: 'skip', diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/tsvb/aws_ec2_cpu_utilization.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/tsvb/aws_ec2_cpu_utilization.ts index e434ba6154e54..3748454766470 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/tsvb/aws_ec2_cpu_utilization.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_ec2/metrics/tsvb/aws_ec2_cpu_utilization.ts @@ -22,7 +22,7 @@ export const awsEC2CpuUtilization = createTSVBModel( }, { id: 'convert-to-percent', - script: 'params.avg / 100', + script: 'params.avg', type: 'calculation', variables: [ { diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/snapshot/cpu.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/snapshot/cpu.ts index aff6e5149238d..609251e49304a 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/snapshot/cpu.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/snapshot/cpu.ts @@ -19,7 +19,7 @@ export const cpu: MetricsUIAggregation = { cpu: 'cpu_avg', }, script: { - source: 'params.cpu / 100', + source: 'params.cpu', lang: 'painless', }, gap_policy: 'skip', diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/tsvb/aws_rds_cpu_total.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/tsvb/aws_rds_cpu_total.ts index c8762aaab2c20..577187ca9afad 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/tsvb/aws_rds_cpu_total.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/aws_rds/metrics/tsvb/aws_rds_cpu_total.ts @@ -22,7 +22,7 @@ export const awsRDSCpuTotal = createTSVBModel( }, { id: 'convert-to-percent', - script: 'params.avg / 100', + script: 'params.avg', type: 'calculation', variables: [ {