Skip to content

Commit fcb9565

Browse files
feat(node-sdk): add serviceName config option (#2867)
Co-authored-by: Daniel Dyla <[email protected]>
1 parent 3cc40d7 commit fcb9565

File tree

6 files changed

+105
-13
lines changed

6 files changed

+105
-13
lines changed

experimental/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ All notable changes to experimental packages in this project will be documented
1212

1313
* feat(opentelemetry-instrumentation-fetch): optionally ignore network events #3028 @gregolsen
1414
* feat(http-instrumentation): record exceptions in http instrumentation #3008 @luismiramirez
15+
* feat(node-sdk): add serviceName config option #2867 @naseemkullah
1516
* feat(opentelemetry-exporter-prometheus): export PrometheusSerializer #3034 @matschaffer
1617

1718
### :bug: (Bug Fix)

experimental/packages/opentelemetry-sdk-node/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ Configure a trace exporter. If an exporter OR span processor is not configured,
128128

129129
Configure tracing parameters. These are the same trace parameters used to [configure a tracer](../../../packages/opentelemetry-sdk-trace-base/src/types.ts#L71).
130130

131+
### serviceName
132+
133+
Configure the [service name](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service).
134+
131135
## Useful links
132136

133137
- For more information on OpenTelemetry, visit: <https://opentelemetry.io/>

experimental/packages/opentelemetry-sdk-node/src/sdk.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,26 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { TextMapPropagator } from '@opentelemetry/api';
17+
import { ContextManager, TextMapPropagator } from '@opentelemetry/api';
1818
import { metrics } from '@opentelemetry/api-metrics';
19-
import { ContextManager } from '@opentelemetry/api';
20-
import { MeterProvider, MetricReader } from '@opentelemetry/sdk-metrics-base';
2119
import {
2220
InstrumentationOption,
23-
registerInstrumentations,
21+
registerInstrumentations
2422
} from '@opentelemetry/instrumentation';
25-
import { NodeTracerConfig, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
2623
import {
2724
detectResources,
2825
envDetector,
2926
processDetector,
3027
Resource,
31-
ResourceDetectionConfig,
28+
ResourceDetectionConfig
3229
} from '@opentelemetry/resources';
33-
import { BatchSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base';
30+
import { MeterProvider, MetricReader } from '@opentelemetry/sdk-metrics-base';
31+
import {
32+
BatchSpanProcessor,
33+
SpanProcessor
34+
} from '@opentelemetry/sdk-trace-base';
35+
import { NodeTracerConfig, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
36+
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
3437
import { NodeSDKConfiguration } from './types';
3538

3639
/** This class represents everything needed to register a fully configured OpenTelemetry Node.js SDK */
@@ -50,13 +53,16 @@ export class NodeSDK {
5053

5154
private _tracerProvider?: NodeTracerProvider;
5255
private _meterProvider?: MeterProvider;
56+
private _serviceName?: string;
5357

5458
/**
5559
* Create a new NodeJS SDK instance
5660
*/
5761
public constructor(configuration: Partial<NodeSDKConfiguration> = {}) {
5862
this._resource = configuration.resource ?? new Resource({});
5963

64+
this._serviceName = configuration.serviceName;
65+
6066
this._autoDetectResources = configuration.autoDetectResources ?? true;
6167

6268
if (configuration.spanProcessor || configuration.traceExporter) {
@@ -113,7 +119,9 @@ export class NodeSDK {
113119
}
114120

115121
/** Detect resource attributes */
116-
public async detectResources(config?: ResourceDetectionConfig): Promise<void> {
122+
public async detectResources(
123+
config?: ResourceDetectionConfig
124+
): Promise<void> {
117125
const internalConfig: ResourceDetectionConfig = {
118126
detectors: [ envDetector, processDetector],
119127
...config,
@@ -135,6 +143,12 @@ export class NodeSDK {
135143
await this.detectResources();
136144
}
137145

146+
this._resource = this._serviceName === undefined
147+
? this._resource
148+
: this._resource.merge(new Resource(
149+
{[SemanticResourceAttributes.SERVICE_NAME]: this._serviceName}
150+
));
151+
138152
if (this._tracerProviderConfig) {
139153
const tracerProvider = new NodeTracerProvider({
140154
...this._tracerProviderConfig.tracerConfig,

experimental/packages/opentelemetry-sdk-node/src/types.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { SpanAttributes, TextMapPropagator, Sampler } from '@opentelemetry/api';
18-
import type { ContextManager } from '@opentelemetry/api';
17+
import type { ContextManager, SpanAttributes } from '@opentelemetry/api';
18+
import { Sampler, TextMapPropagator } from '@opentelemetry/api';
1919
import { InstrumentationOption } from '@opentelemetry/instrumentation';
20-
import { MetricReader } from '@opentelemetry/sdk-metrics-base';
2120
import { Resource } from '@opentelemetry/resources';
21+
import { MetricReader } from '@opentelemetry/sdk-metrics-base';
2222
import {
2323
SpanExporter,
24-
SpanProcessor,
2524
SpanLimits,
25+
SpanProcessor
2626
} from '@opentelemetry/sdk-trace-base';
2727

2828
export interface NodeSDKConfiguration {
@@ -34,6 +34,7 @@ export interface NodeSDKConfiguration {
3434
instrumentations: InstrumentationOption[];
3535
resource: Resource;
3636
sampler: Sampler;
37+
serviceName?: string;
3738
spanProcessor: SpanProcessor;
3839
traceExporter: SpanExporter;
3940
spanLimits: SpanLimits;

experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,76 @@ describe('Node SDK', () => {
261261
});
262262
});
263263
});
264+
265+
describe('configureServiceName', async () => {
266+
it('should configure service name via config', async () => {
267+
const sdk = new NodeSDK({
268+
serviceName: 'config-set-name',
269+
});
270+
271+
await sdk.start();
272+
const resource = sdk['_resource'];
273+
274+
assertServiceResource(resource, {
275+
name: 'config-set-name',
276+
});
277+
});
278+
279+
it('should configure service name via OTEL_SERVICE_NAME env var', async () => {
280+
process.env.OTEL_SERVICE_NAME='env-set-name';
281+
const sdk = new NodeSDK();
282+
283+
await sdk.start();
284+
const resource = sdk['_resource'];
285+
286+
assertServiceResource(resource, {
287+
name: 'env-set-name',
288+
});
289+
delete process.env.OTEL_SERVICE_NAME;
290+
});
291+
292+
it('should favor config set service name over OTEL_SERVICE_NAME env set service name', async () => {
293+
process.env.OTEL_SERVICE_NAME='env-set-name';
294+
const sdk = new NodeSDK({
295+
serviceName: 'config-set-name',
296+
});
297+
298+
await sdk.start();
299+
const resource = sdk['_resource'];
300+
301+
assertServiceResource(resource, {
302+
name: 'config-set-name',
303+
});
304+
delete process.env.OTEL_SERVICE_NAME;
305+
});
306+
307+
308+
it('should configure service name via OTEL_RESOURCE_ATTRIBUTES env var', async () => {
309+
process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=resource-env-set-name';
310+
const sdk = new NodeSDK();
311+
312+
await sdk.start();
313+
const resource = sdk['_resource'];
314+
315+
assertServiceResource(resource, {
316+
name: 'resource-env-set-name',
317+
});
318+
delete process.env.OTEL_RESOURCE_ATTRIBUTES;
319+
});
320+
321+
it('should favor config set service name over OTEL_RESOURCE_ATTRIBUTES env set service name', async () => {
322+
process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=resource-env-set-name';
323+
const sdk = new NodeSDK({
324+
serviceName: 'config-set-name',
325+
});
326+
327+
await sdk.start();
328+
const resource = sdk['_resource'];
329+
330+
assertServiceResource(resource, {
331+
name: 'config-set-name',
332+
});
333+
delete process.env.OTEL_RESOURCE_ATTRIBUTES;
334+
});
335+
});
264336
});

experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ export const assertServiceResource = (
232232
resource: Resource,
233233
validations: {
234234
name: string;
235-
instanceId: string;
235+
instanceId?: string;
236236
namespace?: string;
237237
version?: string;
238238
}

0 commit comments

Comments
 (0)