mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
* change APM nodejs agent default By default APM agent instruments the code to be a base for log correlation. But it doesn't send transactions to the APM server. * emit trace IDs into the logs * use ELASTIC_APM_DISABLE_SEND to keep APM agent active but disable send when necessary * send data whenver active is set to "true" * update tests * keep APM agent active. control disableSend instead * update snapshot tests * add debug logging * REMOVE me. log path to the agent * init APM agent explicitly in test plugin. it uses another package instance * REMOVE me. create transaction explicitly * increase timeout setting for the test * refactor tests * remove debug logs * remove explicit transaction creation * Revert "remove explicit transaction creation" This reverts commitcdf2d308e0
. * point to apm nodejs agent commit temporary until a new version is released * migrate from disableSend to contextPropagationOnly * TO DISCUSS. what if we enforce contextPropagationOnly to be configured when active is defined * Revert "TO DISCUSS. what if we enforce contextPropagationOnly to be configured when active is defined" This reverts commit62dda4fb27
. * bump to version with fix * commit using @elastic.co Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
2416e6eb68
commit
114c690799
19 changed files with 360 additions and 24 deletions
|
@ -21,7 +21,7 @@ describe('ApmConfiguration', () => {
|
|||
beforeEach(() => {
|
||||
// start with an empty env to avoid CI from spoiling snapshots, env is unique for each jest file
|
||||
process.env = {};
|
||||
|
||||
devConfigMock.raw = {};
|
||||
packageMock.raw = {
|
||||
version: '8.0.0',
|
||||
build: {
|
||||
|
@ -86,10 +86,11 @@ describe('ApmConfiguration', () => {
|
|||
let config = new ApmConfiguration(mockedRootDir, {}, false);
|
||||
expect(config.getConfig('serviceName')).toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"active": false,
|
||||
"active": true,
|
||||
"breakdownMetrics": true,
|
||||
"captureSpanStackTraces": false,
|
||||
"centralConfig": false,
|
||||
"contextPropagationOnly": true,
|
||||
"environment": "development",
|
||||
"globalLabels": Object {},
|
||||
"logUncaughtExceptions": true,
|
||||
|
@ -105,12 +106,13 @@ describe('ApmConfiguration', () => {
|
|||
config = new ApmConfiguration(mockedRootDir, {}, true);
|
||||
expect(config.getConfig('serviceName')).toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"active": false,
|
||||
"active": true,
|
||||
"breakdownMetrics": false,
|
||||
"captureBody": "off",
|
||||
"captureHeaders": false,
|
||||
"captureSpanStackTraces": false,
|
||||
"centralConfig": false,
|
||||
"contextPropagationOnly": true,
|
||||
"environment": "development",
|
||||
"globalLabels": Object {
|
||||
"git_rev": "sha",
|
||||
|
@ -162,13 +164,12 @@ describe('ApmConfiguration', () => {
|
|||
|
||||
it('does not load the configuration from the dev config in distributable', () => {
|
||||
devConfigMock.raw = {
|
||||
active: true,
|
||||
serverUrl: 'https://dev-url.co',
|
||||
active: false,
|
||||
};
|
||||
const config = new ApmConfiguration(mockedRootDir, {}, true);
|
||||
expect(config.getConfig('serviceName')).toEqual(
|
||||
expect.objectContaining({
|
||||
active: false,
|
||||
active: true,
|
||||
})
|
||||
);
|
||||
});
|
||||
|
@ -224,4 +225,130 @@ describe('ApmConfiguration', () => {
|
|||
})
|
||||
);
|
||||
});
|
||||
|
||||
describe('contextPropagationOnly', () => {
|
||||
it('sets "active: true" and "contextPropagationOnly: true" by default', () => {
|
||||
expect(new ApmConfiguration(mockedRootDir, {}, false).getConfig('serviceName')).toEqual(
|
||||
expect.objectContaining({
|
||||
active: true,
|
||||
contextPropagationOnly: true,
|
||||
})
|
||||
);
|
||||
|
||||
expect(new ApmConfiguration(mockedRootDir, {}, true).getConfig('serviceName')).toEqual(
|
||||
expect.objectContaining({
|
||||
active: true,
|
||||
contextPropagationOnly: true,
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('value from config overrides the default', () => {
|
||||
const kibanaConfig = {
|
||||
elastic: {
|
||||
apm: {
|
||||
active: false,
|
||||
contextPropagationOnly: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, false).getConfig('serviceName')
|
||||
).toEqual(
|
||||
expect.objectContaining({
|
||||
active: false,
|
||||
contextPropagationOnly: false,
|
||||
})
|
||||
);
|
||||
|
||||
expect(
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, true).getConfig('serviceName')
|
||||
).toEqual(
|
||||
expect.objectContaining({
|
||||
active: false,
|
||||
contextPropagationOnly: false,
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('is "false" if "active: true" configured and "contextPropagationOnly" is not specified', () => {
|
||||
const kibanaConfig = {
|
||||
elastic: {
|
||||
apm: {
|
||||
active: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, false).getConfig('serviceName')
|
||||
).toEqual(
|
||||
expect.objectContaining({
|
||||
active: true,
|
||||
contextPropagationOnly: false,
|
||||
})
|
||||
);
|
||||
|
||||
expect(
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, true).getConfig('serviceName')
|
||||
).toEqual(
|
||||
expect.objectContaining({
|
||||
active: true,
|
||||
contextPropagationOnly: false,
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('throws if "active: false" set without configuring "contextPropagationOnly: false"', () => {
|
||||
const kibanaConfig = {
|
||||
elastic: {
|
||||
apm: {
|
||||
active: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(() =>
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, false).getConfig('serviceName')
|
||||
).toThrowErrorMatchingInlineSnapshot(
|
||||
`"APM is disabled, but context propagation is enabled. Please disable context propagation with contextPropagationOnly:false"`
|
||||
);
|
||||
|
||||
expect(() =>
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, true).getConfig('serviceName')
|
||||
).toThrowErrorMatchingInlineSnapshot(
|
||||
`"APM is disabled, but context propagation is enabled. Please disable context propagation with contextPropagationOnly:false"`
|
||||
);
|
||||
});
|
||||
|
||||
it('does not throw if "active: false" and "contextPropagationOnly: false" configured', () => {
|
||||
const kibanaConfig = {
|
||||
elastic: {
|
||||
apm: {
|
||||
active: false,
|
||||
contextPropagationOnly: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, false).getConfig('serviceName')
|
||||
).toEqual(
|
||||
expect.objectContaining({
|
||||
active: false,
|
||||
contextPropagationOnly: false,
|
||||
})
|
||||
);
|
||||
|
||||
expect(
|
||||
new ApmConfiguration(mockedRootDir, kibanaConfig, true).getConfig('serviceName')
|
||||
).toEqual(
|
||||
expect.objectContaining({
|
||||
active: false,
|
||||
contextPropagationOnly: false,
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -16,7 +16,8 @@ import type { AgentConfigOptions } from 'elastic-apm-node';
|
|||
|
||||
// https://www.elastic.co/guide/en/apm/agent/nodejs/current/configuration.html
|
||||
const DEFAULT_CONFIG: AgentConfigOptions = {
|
||||
active: false,
|
||||
active: true,
|
||||
contextPropagationOnly: true,
|
||||
environment: 'development',
|
||||
logUncaughtExceptions: true,
|
||||
globalLabels: {},
|
||||
|
@ -71,6 +72,8 @@ export class ApmConfiguration {
|
|||
|
||||
private getBaseConfig() {
|
||||
if (!this.baseConfig) {
|
||||
const configFromSources = this.getConfigFromAllSources();
|
||||
|
||||
this.baseConfig = merge(
|
||||
{
|
||||
serviceVersion: this.kibanaVersion,
|
||||
|
@ -79,9 +82,7 @@ export class ApmConfiguration {
|
|||
this.getUuidConfig(),
|
||||
this.getGitConfig(),
|
||||
this.getCiConfig(),
|
||||
this.getConfigFromKibanaConfig(),
|
||||
this.getDevConfig(),
|
||||
this.getConfigFromEnv()
|
||||
configFromSources
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -114,6 +115,12 @@ export class ApmConfiguration {
|
|||
config.active = true;
|
||||
}
|
||||
|
||||
if (process.env.ELASTIC_APM_CONTEXT_PROPAGATION_ONLY === 'true') {
|
||||
config.contextPropagationOnly = true;
|
||||
} else if (process.env.ELASTIC_APM_CONTEXT_PROPAGATION_ONLY === 'false') {
|
||||
config.contextPropagationOnly = false;
|
||||
}
|
||||
|
||||
if (process.env.ELASTIC_APM_ENVIRONMENT || process.env.NODE_ENV) {
|
||||
config.environment = process.env.ELASTIC_APM_ENVIRONMENT || process.env.NODE_ENV;
|
||||
}
|
||||
|
@ -249,4 +256,28 @@ export class ApmConfiguration {
|
|||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads APM configuration from different sources and merges them together.
|
||||
*/
|
||||
private getConfigFromAllSources(): AgentConfigOptions {
|
||||
const config = merge(
|
||||
{},
|
||||
this.getConfigFromKibanaConfig(),
|
||||
this.getDevConfig(),
|
||||
this.getConfigFromEnv()
|
||||
);
|
||||
|
||||
if (config.active === false && config.contextPropagationOnly !== false) {
|
||||
throw new Error(
|
||||
'APM is disabled, but context propagation is enabled. Please disable context propagation with contextPropagationOnly:false'
|
||||
);
|
||||
}
|
||||
|
||||
if (config.active === true) {
|
||||
config.contextPropagationOnly = config.contextPropagationOnly ?? false;
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue