Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2

### :rocket: Features

* feat(otlp-exporter): implement exporter metrics [#6480](https://github.com/open-telemetry/opentelemetry-js/pull/6480) @anuraaga

### :bug: Bug Fixes

* fix(opentelemetry-instrumentation): improve `_warnOnPreloadedModules` function not to show warning logs when the module is not marked as loaded [#6095](https://github.com/open-telemetry/opentelemetry-js/pull/6095) @rlj1202
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ import {
convertLegacyOtlpGrpcOptions,
createOtlpGrpcExportDelegate,
} from '@opentelemetry/otlp-grpc-exporter-base';
import { ProtobufLogsSerializer } from '@opentelemetry/otlp-transformer';
import {
LogsSignal,
ProtobufLogsSerializer,
} from '@opentelemetry/otlp-transformer';
import { OTLPExporterBase } from '@opentelemetry/otlp-exporter-base';
import { OTEL_COMPONENT_TYPE_VALUE_OTLP_GRPC_LOG_EXPORTER } from './semconv';

/**
* OTLP Logs Exporter for Node
Expand All @@ -27,6 +31,9 @@ export class OTLPLogExporter
createOtlpGrpcExportDelegate(
convertLegacyOtlpGrpcOptions(config, 'LOGS'),
ProtobufLogsSerializer,
OTEL_COMPONENT_TYPE_VALUE_OTLP_GRPC_LOG_EXPORTER,
LogsSignal,
config.meterProvider,
'LogsExportService',
'/opentelemetry.proto.collector.logs.v1.LogsService/Export'
)
Expand Down
20 changes: 20 additions & 0 deletions experimental/packages/exporter-logs-otlp-grpc/src/semconv.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

/*
* This file contains a copy of unstable semantic convention definitions
* used by this package.
* @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv
*/

/**
* Enum value "otlp_grpc_log_exporter" for attribute {@link ATTR_OTEL_COMPONENT_TYPE}.
*
* OTLP log record exporter over gRPC with protobuf serialization
*
* @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
*/
export const OTEL_COMPONENT_TYPE_VALUE_OTLP_GRPC_LOG_EXPORTER =
'otlp_grpc_log_exporter' as const;
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import {
LoggerProvider,
SimpleLogRecordProcessor,
} from '@opentelemetry/sdk-logs';
import { MeterProvider } from '@opentelemetry/sdk-metrics';
import { OTLPLogExporter } from '../src';
import type { ServerTestContext } from './utils';
import { startServer } from './utils';
import { startServer, TestMetricReader } from './utils';
import * as assert from 'assert';

const testServiceDefinition = {
Expand Down Expand Up @@ -68,11 +69,16 @@ describe('OTLPLogExporter', function () {

it('successfully exports data', async () => {
// arrange
const metricReader = new TestMetricReader();
const meterProvider = new MeterProvider({
readers: [metricReader],
});
const loggerProvider = new LoggerProvider({
processors: [
new SimpleLogRecordProcessor(
new OTLPLogExporter({
url: 'http://localhost:1503',
meterProvider,
})
),
],
Expand All @@ -86,5 +92,12 @@ describe('OTLPLogExporter', function () {

// assert
assert.strictEqual(serverTestContext.requests.length, 1);

const metrics = await metricReader.collect();
const scopeMetrics = metrics.resourceMetrics.scopeMetrics.find(
sm => sm.scope.name === '@opentelemetry/otlp-exporter'
);
assert.ok(scopeMetrics);
await meterProvider.shutdown();
});
});
10 changes: 10 additions & 0 deletions experimental/packages/exporter-logs-otlp-grpc/test/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import type { Metadata, ServiceDefinition } from '@grpc/grpc-js';
import { Server, ServerCredentials } from '@grpc/grpc-js';
import { MetricReader } from '@opentelemetry/sdk-metrics';

export interface ExportedData {
request: Buffer;
Expand Down Expand Up @@ -55,3 +56,12 @@ export function startServer(
);
});
}

export class TestMetricReader extends MetricReader {
protected override onShutdown(): Promise<void> {
return Promise.resolve();
}
protected override onForceFlush(): Promise<void> {
return Promise.resolve();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,14 @@ import type {
} from '@opentelemetry/sdk-logs';
import type { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base';
import { OTLPExporterBase } from '@opentelemetry/otlp-exporter-base';
import { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';
import {
JsonLogsSerializer,
LogsSignal,
} from '@opentelemetry/otlp-transformer';
import { createLegacyOtlpBrowserExportDelegate } from '@opentelemetry/otlp-exporter-base/browser-http';

import { OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER } from '../../semconv';

/**
* Collector Logs Exporter for Web
*/
Expand All @@ -24,6 +29,9 @@ export class OTLPLogExporter
createLegacyOtlpBrowserExportDelegate(
config,
JsonLogsSerializer,
OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER,
LogsSignal,
config.meterProvider,
'v1/logs',
{ 'Content-Type': 'application/json' }
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,17 @@ import type {
} from '@opentelemetry/sdk-logs';
import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base';
import { OTLPExporterBase } from '@opentelemetry/otlp-exporter-base';
import { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';
import {
JsonLogsSerializer,
LogsSignal,
} from '@opentelemetry/otlp-transformer';
import {
convertLegacyHttpOptions,
createOtlpHttpExportDelegate,
} from '@opentelemetry/otlp-exporter-base/node-http';

import { OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER } from '../../semconv';

/**
* Collector Logs Exporter for Node
*/
Expand All @@ -28,7 +33,10 @@ export class OTLPLogExporter
convertLegacyHttpOptions(config, 'LOGS', 'v1/logs', {
'Content-Type': 'application/json',
}),
JsonLogsSerializer
JsonLogsSerializer,
OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER,
LogsSignal,
config.meterProvider
)
);
}
Expand Down
20 changes: 20 additions & 0 deletions experimental/packages/exporter-logs-otlp-http/src/semconv.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

/*
* This file contains a copy of unstable semantic convention definitions
* used by this package.
* @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv
*/

/**
* Enum value "otlp_http_log_exporter" for attribute {@link ATTR_OTEL_COMPONENT_TYPE}.
*
* OTLP log record exporter over HTTP with protobuf serialization
*
* @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
*/
export const OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER =
'otlp_http_log_exporter' as const;
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import {
LoggerProvider,
SimpleLogRecordProcessor,
} from '@opentelemetry/sdk-logs';
import { MeterProvider } from '@opentelemetry/sdk-metrics';
import { TestMetricReader } from '../utils';

/*
* NOTE: Tests here are not intended to test the underlying components directly. They are intended as a quick
Expand All @@ -29,8 +31,14 @@ describe('OTLPLogExporter', function () {
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const metricReader = new TestMetricReader();
const meterProvider = new MeterProvider({
readers: [metricReader],
});
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
processors: [
new SimpleLogRecordProcessor(new OTLPLogExporter({ meterProvider })),
],
});

// act
Expand All @@ -44,6 +52,13 @@ describe('OTLPLogExporter', function () {
() => JSON.parse(body),
'expected requestBody to be in JSON format, but parsing failed'
);

const metrics = await metricReader.collect();
const scopeMetrics = metrics.resourceMetrics.scopeMetrics.find(
sm => sm.scope.name === '@opentelemetry/otlp-exporter'
);
assert.ok(scopeMetrics);
await meterProvider.shutdown();
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import {
LoggerProvider,
SimpleLogRecordProcessor,
} from '@opentelemetry/sdk-logs';
import { MeterProvider } from '@opentelemetry/sdk-metrics';
import { Stream } from 'stream';
import { TestMetricReader } from '../utils';

/*
* NOTE: Tests here are not intended to test the underlying components directly. They are intended as a quick
Expand All @@ -28,19 +30,31 @@ describe('OTLPLogExporter', () => {
});

it('successfully exports data', done => {
const metricReader = new TestMetricReader();
const meterProvider = new MeterProvider({
readers: [metricReader],
});

const fakeRequest = new Stream.PassThrough();
Object.defineProperty(fakeRequest, 'setTimeout', {
value: function (_timeout: number) {},
});

sinon.stub(http, 'request').returns(fakeRequest as any);
let buff = Buffer.from('');
fakeRequest.on('finish', () => {
fakeRequest.on('finish', async () => {
try {
const requestBody = buff.toString();
assert.doesNotThrow(() => {
JSON.parse(requestBody);
}, 'expected requestBody to be in JSON format, but parsing failed');

const metrics = await metricReader.collect();
const scopeMetrics = metrics.resourceMetrics.scopeMetrics.find(
sm => sm.scope.name === '@opentelemetry/otlp-exporter'
);
assert.ok(scopeMetrics);

done();
} catch (e) {
done(e);
Expand All @@ -52,7 +66,9 @@ describe('OTLPLogExporter', () => {
});

const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
processors: [
new SimpleLogRecordProcessor(new OTLPLogExporter({ meterProvider })),
],
});

loggerProvider.getLogger('test-logger').emit({ body: 'test-body' });
Expand Down
15 changes: 15 additions & 0 deletions experimental/packages/exporter-logs-otlp-http/test/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

import { MetricReader } from '@opentelemetry/sdk-metrics';

export class TestMetricReader extends MetricReader {
protected override onShutdown(): Promise<void> {
return Promise.resolve();
}
protected override onForceFlush(): Promise<void> {
return Promise.resolve();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,19 @@

import type { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base';
import { OTLPExporterBase } from '@opentelemetry/otlp-exporter-base';
import { ProtobufLogsSerializer } from '@opentelemetry/otlp-transformer';
import {
LogsSignal,
ProtobufLogsSerializer,
} from '@opentelemetry/otlp-transformer';

import type {
ReadableLogRecord,
LogRecordExporter,
} from '@opentelemetry/sdk-logs';
import { createLegacyOtlpBrowserExportDelegate } from '@opentelemetry/otlp-exporter-base/browser-http';

import { OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER } from '../../semconv';

/**
* Collector Trace Exporter for Web
*/
Expand All @@ -25,6 +30,9 @@ export class OTLPLogExporter
createLegacyOtlpBrowserExportDelegate(
config,
ProtobufLogsSerializer,
OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER,
LogsSignal,
config.meterProvider,
'v1/logs',
{ 'Content-Type': 'application/x-protobuf' }
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@

import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base';
import { OTLPExporterBase } from '@opentelemetry/otlp-exporter-base';
import { ProtobufLogsSerializer } from '@opentelemetry/otlp-transformer';
import {
LogsSignal,
ProtobufLogsSerializer,
} from '@opentelemetry/otlp-transformer';
import {
convertLegacyHttpOptions,
createOtlpHttpExportDelegate,
Expand All @@ -15,6 +18,8 @@ import type {
LogRecordExporter,
} from '@opentelemetry/sdk-logs';

import { OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER } from '../../semconv';

/**
* OTLP Log Protobuf Exporter for Node.js
*/
Expand All @@ -28,7 +33,10 @@ export class OTLPLogExporter
convertLegacyHttpOptions(config, 'LOGS', 'v1/logs', {
'Content-Type': 'application/x-protobuf',
}),
ProtobufLogsSerializer
ProtobufLogsSerializer,
OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER,
LogsSignal,
config.meterProvider
)
);
}
Expand Down
20 changes: 20 additions & 0 deletions experimental/packages/exporter-logs-otlp-proto/src/semconv.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

/*
* This file contains a copy of unstable semantic convention definitions
* used by this package.
* @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv
*/

/**
* Enum value "otlp_http_log_exporter" for attribute {@link ATTR_OTEL_COMPONENT_TYPE}.
*
* OTLP log record exporter over HTTP with protobuf serialization
*
* @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
*/
export const OTEL_COMPONENT_TYPE_VALUE_OTLP_HTTP_LOG_EXPORTER =
'otlp_http_log_exporter' as const;
Loading
Loading