Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[APM][Otel] Add Otel client based on PoC data #192293

Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
268638f
[WIP] Add Otel client based on PoC data
jennypavlova Sep 6, 2024
fdf43bd
Add fields and changed indecies
jennypavlova Sep 9, 2024
1c471e4
Add service name and fields
jennypavlova Sep 10, 2024
c023d45
[WIP] Add Otel client based on PoC data
jennypavlova Sep 6, 2024
309487f
Add fields and changed indecies
jennypavlova Sep 9, 2024
e214bfc
Add service name and fields
jennypavlova Sep 10, 2024
5c95114
rename indices and refactor code
MiriamAparicio Sep 24, 2024
2ab2b78
review fields for errors
MiriamAparicio Sep 26, 2024
bff034b
remove redundant trace.is
MiriamAparicio Sep 26, 2024
46b62aa
Merge branch 'main' into 192115-apmotel-add-synthtrace-scenarios-to-t…
jennypavlova Oct 7, 2024
4c827c2
Merge branch '192115-apmotel-add-synthtrace-scenarios-to-test-with-ot…
jennypavlova Oct 7, 2024
71a607d
Resolve conflicts
jennypavlova Oct 7, 2024
0d08420
Fix error docs and update metrics and traces
jennypavlova Oct 7, 2024
d5d9eb0
Merge branch 'main' into 192115-apmotel-add-synthtrace-scenarios-to-t…
jennypavlova Oct 7, 2024
832abf1
Fix types
jennypavlova Oct 8, 2024
d68e935
Merge branch 'main' into 192115-apmotel-add-synthtrace-scenarios-to-t…
jennypavlova Oct 8, 2024
6a59171
Rename to OtelSharedResourceAttributes
jennypavlova Oct 8, 2024
59fa9fd
Merge branch 'main' into 192115-apmotel-add-synthtrace-scenarios-to-t…
jennypavlova Oct 11, 2024
3a66c44
CR changes
jennypavlova Oct 11, 2024
61f38b7
Add exception.handled
jennypavlova Oct 11, 2024
18446fd
Merge branch 'main' into 192115-apmotel-add-synthtrace-scenarios-to-t…
jennypavlova Oct 11, 2024
3d972e7
Merge branch 'main' into 192115-apmotel-add-synthtrace-scenarios-to-t…
jennypavlova Oct 14, 2024
7ce3a70
Move metricset.name to attributes type
jennypavlova Oct 14, 2024
7382cc8
Merge branch 'main' into 192115-apmotel-add-synthtrace-scenarios-to-t…
jennypavlova Oct 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/kbn-apm-synthtrace-client/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ export type { ESDocumentWithOperation, SynthtraceESAction, SynthtraceGenerator }
export { log, type LogDocument, LONG_FIELD_NAME } from './src/lib/logs';
export { type AssetDocument } from './src/lib/assets';
export { syntheticsMonitor, type SyntheticsMonitorDocument } from './src/lib/synthetics';
export { otel, type OtelDocument } from './src/lib/otel';
31 changes: 31 additions & 0 deletions packages/kbn-apm-synthtrace-client/src/lib/otel/error.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import type { OtelDocument } from '../../..';
import { Serializable } from '../serializable';

export interface OtelErrorDocument extends OtelDocument {
'event.name'?: string;
attributes?: {
'exception.message'?: string;
'error.stack_trace'?: string;
jennypavlova marked this conversation as resolved.
Show resolved Hide resolved
'exception.type'?: string;
'processor.event'?: string;
'timestamp.us'?: number;
'event.name'?: string;
};
}

export class OtelError extends Serializable<OtelErrorDocument> {
constructor(fields: OtelErrorDocument) {
super({
...fields,
});
}
}
210 changes: 210 additions & 0 deletions packages/kbn-apm-synthtrace-client/src/lib/otel/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
/*
* 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import { Fields } from '../entity';
import { Serializable } from '../serializable';
import { OtelError } from './error';
import { OtelMetric } from './metric';
import { OtelTransaction } from './transaction';

interface OtelSharedResourceAttributes {
'service.name'?: string;
'agent.name'?: string;
'agent.version'?: string;
'metricset.interval'?: string;
'metricset.name'?: string;
jennypavlova marked this conversation as resolved.
Show resolved Hide resolved
'service.instance.id'?: string;
'telemetry.sdk.language'?: string;
'telemetry.sdk.name'?: string;
'telemetry.sdk.version'?: string;
'some.resource.attribute'?: string;
'timestamp.us'?: number;
jennypavlova marked this conversation as resolved.
Show resolved Hide resolved
}

export interface OtelDocument extends Fields {
data_stream?: {
dataset: string;
namespace: string;
type: string;
};
attributes?: {
[key: string]: any;
};
resource?: {
attributes?: OtelSharedResourceAttributes;
dropped_attributes_count?: number;
schema_url?: string;
};
scope?: {
attributes?: {
'service.framework.name'?: string;
'service.framework.version'?: string;
};
dropped_attributes_count?: number;
name?: string;
};
name?: string;
trace_id?: string;
trace?: { id: string };
span_id?: string;
span?: { id: string };
dropped_attributes_count?: number;
dropped_events_count?: number;
dropped_links_count?: number;
timestamp_us?: number;
}

class Otel extends Serializable<OtelDocument> {
constructor(fields: OtelDocument) {
super({
...fields,
});
}

error(spanId: string) {
return new OtelError({
...this.fields,
attributes: {
'exception.message': 'boom',
'exception.type': '*errors.errorString',
'error.stack_trace': 'Error: INTERNAL: Boom',
'processor.event': 'error',
'timestamp.us': 1726580752010657,
'event.name': 'exception',
},
data_stream: {
dataset: 'generic.otel',
namespace: 'default',
type: 'logs',
},
'event.name': 'exception',
dropped_attributes_count: 0,
resource: {
attributes: {
'agent.name': 'opentelemetry/go',
'agent.version': '1.28.0',
'service.name': 'sendotlp-synth',
'service.instance.id': '89117ac1-0dbf-4488-9e17-4c2c3b76943a',
'some.resource.attribute': 'resource.attr',
},
dropped_attributes_count: 0,
schema_url: 'https://opentelemetry.io/schemas/1.26.0',
},
scope: {
attributes: {
'service.framework.name': 'sendotlp-synth',
'service.framework.version': '',
},
dropped_attributes_count: 0,
name: 'sendotlp-synth',
},
span_id: spanId,
});
}

metric() {
return new OtelMetric({
...this.fields,
attributes: {
jennypavlova marked this conversation as resolved.
Show resolved Hide resolved
'metricset.name': 'service_destination',
'processor.event': 'metric',
'event.outcome': 'success',
'service.target.name': 'foo_service',
'service.target.type': 'http',
'span.name': 'child1',
},
data_stream: {
dataset: 'service_destination.10m.otel',
namespace: 'default',
type: 'metrics',
},
metrics: {
service_summary: 2,
},
resource: {
attributes: {
'agent.name': 'otlp',
'agent.version': '1.28.0',
'service.instance.id': '89117ac1-0dbf-4488-9e17-4c2c3b76943a',
'service.name': 'sendotlp-synth',
'metricset.interval': '10m',
},
dropped_attributes_count: 0,
},
scope: {
dropped_attributes_count: 0,
name: 'github.com/elastic/opentelemetry-collector-components/connector/spanmetricsconnectorv2',
},
});
}

transaction(id: string) {
return new OtelTransaction({
gregkalapos marked this conversation as resolved.
Show resolved Hide resolved
...this.fields,
attributes: {
'event.outcome': 'success',
'event.success_count': 1,
'processor.event': 'transaction',
'timestamp.us': 1726580752010657,
'transaction.duration.us': 15202,
'transaction.id': id,
'transaction.name': 'parent-synth',
'transaction.representative_count': 1,
'transaction.result': 'Success',
jennypavlova marked this conversation as resolved.
Show resolved Hide resolved
'transaction.root': true,
'transaction.sampled': true,
'transaction.type': 'unknown',
},
data_stream: {
dataset: 'generic.otel',
namespace: 'default',
type: 'traces',
},
duration: 11742370,
kind: 'Internal',
name: 'parent-synth',
resource: {
attributes: {
'agent.name': 'otlp',
'agent.version': '1.28.0',
'service.instance.id': '89117ac1-0dbf-4488-9e17-4c2c3b76943a',
'service.name': 'sendotlp-synth',
},
dropped_attributes_count: 0,
schema_url: 'https://opentelemetry.io/schemas/1.26.0',
},
scope: {
attributes: {
'service.framework.name': 'sendotlp-synth',
'service.framework.version': '',
},
dropped_attributes_count: 0,
name: 'sendotlp-synth',
},
transaction: { id },
jennypavlova marked this conversation as resolved.
Show resolved Hide resolved
span_id: id,
status: {
code: 'Unset',
},
});
}
}

export function create(id: string): Otel {
return new Otel({
trace_id: id,
dropped_attributes_count: 0,
dropped_events_count: 0,
dropped_links_count: 0,
});
}

export const otel = {
create,
};
33 changes: 33 additions & 0 deletions packages/kbn-apm-synthtrace-client/src/lib/otel/metric.ts
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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import { OtelDocument } from '.';
import { Serializable } from '../serializable';

export interface OtelMetricDocument extends OtelDocument {
attributes?: {
'metricset.name'?: string;
'processor.event'?: string;
// service_destination
jennypavlova marked this conversation as resolved.
Show resolved Hide resolved
'event.outcome'?: string;
'service.target.name'?: string;
'service.target.type'?: string;
'span.name'?: string;
};
metrics?: {
service_summary?: number;
};
}
export class OtelMetric extends Serializable<OtelMetricDocument> {
constructor(fields: OtelMetricDocument) {
super({
...fields,
});
}
}
45 changes: 45 additions & 0 deletions packages/kbn-apm-synthtrace-client/src/lib/otel/transaction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import { OtelDocument } from '.';
import { Serializable } from '../serializable';

export interface OtelTransactionDocument extends OtelDocument {
attributes?: {
'event.outcome'?: string;
'event.success_count'?: number;
'processor.event'?: string;
'timestamp.us'?: number;
'transaction.duration.us'?: number;
'transaction.id'?: string;
'transaction.name'?: string;
'transaction.representative_count'?: number;
'transaction.result'?: string;
'transaction.root'?: boolean;
'transaction.sampled'?: boolean;
'transaction.type'?: string;
};
status?: {
code?: string;
};
dropped_events_count?: number;
dropped_links_count?: number;
duration?: number;
kind?: string;
name?: string;
transaction: { id: string };
}

export class OtelTransaction extends Serializable<OtelTransactionDocument> {
constructor(fields: OtelTransactionDocument) {
super({
...fields,
});
}
}
1 change: 1 addition & 0 deletions packages/kbn-apm-synthtrace/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export { MonitoringSynthtraceEsClient } from './src/lib/monitoring/monitoring_sy
export { LogsSynthtraceEsClient } from './src/lib/logs/logs_synthtrace_es_client';
export { AssetsSynthtraceEsClient } from './src/lib/assets/assets_synthtrace_es_client';
export { SyntheticsSynthtraceEsClient } from './src/lib/synthetics/synthetics_synthtrace_es_client';
export { OtelSynthtraceEsClient } from './src/lib/otel/otel_synthtrace_es_client';
export {
addObserverVersionTransform,
deleteSummaryFieldTransform,
Expand Down
2 changes: 2 additions & 0 deletions packages/kbn-apm-synthtrace/src/cli/scenario.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
InfraSynthtraceEsClient,
LogsSynthtraceEsClient,
SyntheticsSynthtraceEsClient,
OtelSynthtraceEsClient,
} from '../..';
import { AssetsSynthtraceEsClient } from '../lib/assets/assets_synthtrace_es_client';
import { Logger } from '../lib/utils/create_logger';
Expand All @@ -25,6 +26,7 @@ interface EsClients {
infraEsClient: InfraSynthtraceEsClient;
assetsEsClient: AssetsSynthtraceEsClient;
syntheticsEsClient: SyntheticsSynthtraceEsClient;
otelEsClient: OtelSynthtraceEsClient;
}

type Generate<TFields> = (options: {
Expand Down
8 changes: 8 additions & 0 deletions packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { getServiceUrls } from './get_service_urls';
import { RunOptions } from './parse_run_cli_flags';
import { getAssetsEsClient } from './get_assets_es_client';
import { getSyntheticsEsClient } from './get_synthetics_es_client';
import { getOtelSynthtraceEsClient } from './get_otel_es_client';

export async function bootstrap(runOptions: RunOptions) {
const logger = createLogger(runOptions.logLevel);
Expand Down Expand Up @@ -68,13 +69,19 @@ export async function bootstrap(runOptions: RunOptions) {
logger,
concurrency: runOptions.concurrency,
});
const otelEsClient = getOtelSynthtraceEsClient({
target: esUrl,
logger,
concurrency: runOptions.concurrency,
});

if (runOptions.clean) {
await apmEsClient.clean();
await logsEsClient.clean();
await infraEsClient.clean();
await assetsEsClient.clean();
await syntheticsEsClient.clean();
await otelEsClient.clean();
}

return {
Expand All @@ -84,6 +91,7 @@ export async function bootstrap(runOptions: RunOptions) {
infraEsClient,
assetsEsClient,
syntheticsEsClient,
otelEsClient,
version,
kibanaUrl,
esUrl,
Expand Down
Loading