[APM] Add scenario for AWS lambda to synthtrace (#135019)

* Add a scenario for AWS lambda to synthtrace
This commit is contained in:
Giorgos Bamparopoulos 2022-07-07 15:48:03 +01:00 committed by GitHub
parent ff6137fa1c
commit 876f9d5884
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 66 additions and 2 deletions

View file

@ -39,6 +39,11 @@ export class Instance extends Entity<ApmFields> {
});
}
containerId(containerId: string) {
this.fields['container.id'] = containerId;
return this;
}
podId(podId: string) {
this.fields['kubernetes.pod.uid'] = podId;
return this;

View file

@ -16,7 +16,6 @@ export class Service extends Entity<ApmFields> {
...this.fields,
['service.node.name']: instanceName,
'host.name': instanceName,
'container.id': instanceName,
});
}
}

View file

@ -0,0 +1,58 @@
/*
* 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 { apm, timerange } from '..';
import { ApmFields } from '../lib/apm/apm_fields';
import { Scenario } from '../scripts/scenario';
import { getLogger } from '../scripts/utils/get_common_services';
import { RunOptions } from '../scripts/utils/parse_run_cli_flags';
const scenario: Scenario<ApmFields> = async (runOptions: RunOptions) => {
const logger = getLogger(runOptions);
return {
generate: ({ from, to }) => {
const range = timerange(from, to);
const timestamps = range.interval('1s').rate(3);
const instance = apm.service('lambda-python', 'production', 'python').instance('instance');
const traceEventsSetups = [
{ functionName: 'lambda-python-1', coldStart: true },
{ functionName: 'lambda-python-2', coldStart: false },
];
const traceEvents = ({ functionName, coldStart }: typeof traceEventsSetups[0]) => {
return timestamps.generator((timestamp) =>
instance
.transaction('GET /order/{id}')
.defaults({
'service.runtime.name': 'AWS_Lambda_python3.8',
'cloud.provider': 'aws',
'cloud.service.name': 'lambda',
'cloud.region': 'us-east-1',
'faas.id': `arn:aws:lambda:us-west-2:123456789012:function:${functionName}`,
'faas.coldstart': coldStart,
'faas.trigger.type': 'other',
})
.timestamp(timestamp)
.duration(1000)
.success()
);
};
return traceEventsSetups
.map((traceEventsSetup) =>
logger.perf('generating_apm_events', () => traceEvents(traceEventsSetup))
)
.reduce((p, c) => p.merge(c));
},
};
};
export default scenario;

View file

@ -17,7 +17,7 @@ describe('simple trace', () => {
beforeEach(() => {
const javaService = apm.service('opbeans-java', 'production', 'java');
const javaInstance = javaService.instance('instance-1');
const javaInstance = javaService.instance('instance-1').containerId('instance-1');
const range = timerange(
new Date('2021-01-01T00:00:00.000Z'),

View file

@ -64,6 +64,7 @@ export default function ApiTest({ getService }: FtrProviderContext) {
.rate(1)
.generator((timestamp) =>
instance
.containerId(instanceName)
.transaction('GET /api/product/list')
.timestamp(timestamp)
.duration(1000)

View file

@ -73,6 +73,7 @@ export async function generateData({
.rate(rate)
.generator((timestamp) =>
instance
.containerId('instance-a')
.transaction(transaction.name)
.timestamp(timestamp)
.defaults({