Skip to content

Commit 595d0e9

Browse files
authored
Converge sync and async resources (#5350)
1 parent f9fda8b commit 595d0e9

File tree

84 files changed

+990
-1310
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+990
-1310
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ For semantic convention package changes, see the [semconv CHANGELOG](packages/se
5252
* (user-facing): deprecated `AlwaysOffSampler` has moved to `@opentelemetry/sdk-trace-base`
5353
* (user-facing): deprecated `TraceIdRatioSampler` has moved to `@opentelemetry/sdk-trace-base`
5454
* (user-facing): deprecated `TraceIdRatioSampler` has moved to `@opentelemetry/sdk-trace-base`
55+
* feat(resource): Merge sync and async resource interfaces into a single interface [#5350](https://github.com/open-telemetry/opentelemetry-js/pull/5350) @dyladan
56+
* Resource constructor now takes a single argument which contains an optional `attributes` object
57+
* Detected resource attribute values may be a promise or a synchronous value
58+
* Resources are now merged by the order in which their detectors are configured instead of async attributes being last
59+
* Resource detectors now return `DetectedResource` plain objects instead of `new Resource()`
5560
* feat(sdk-trace-base)!: drop ability to instantiate propagators beyond defaults [#5355](https://github.com/open-telemetry/opentelemetry-js/pull/5355) @pichlermarc
5661
* (user-facing): only a non-env-var based default is now used on `BasicTracerProvider#register()`.
5762
* propagators can now not be configured via `OTEL_PROPAGATORS` or `window.OTEL_PROPAGATORS` anymore, please pass the propagator to `NodeTracerProvider#register()` instead.

experimental/packages/opentelemetry-browser-detector/src/BrowserDetector.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
import { Attributes, diag } from '@opentelemetry/api';
1818
import {
19-
Detector,
20-
IResource,
19+
DetectedResource,
20+
ResourceDetector,
2121
Resource,
2222
ResourceDetectionConfig,
2323
} from '@opentelemetry/resources';
@@ -26,11 +26,11 @@ import { BROWSER_ATTRIBUTES, UserAgentData } from './types';
2626
/**
2727
* BrowserDetector will be used to detect the resources related to browser.
2828
*/
29-
class BrowserDetector implements Detector {
30-
async detect(config?: ResourceDetectionConfig): Promise<IResource> {
29+
class BrowserDetector implements ResourceDetector {
30+
detect(config?: ResourceDetectionConfig): DetectedResource {
3131
const isBrowser = typeof navigator !== 'undefined';
3232
if (!isBrowser) {
33-
return Resource.empty();
33+
return Resource.EMPTY;
3434
}
3535
const browserResource: Attributes = getBrowserAttributes();
3636
return this._getResourceAttributes(browserResource, config);
@@ -45,17 +45,17 @@ class BrowserDetector implements Detector {
4545
private _getResourceAttributes(
4646
browserResource: Attributes,
4747
_config?: ResourceDetectionConfig
48-
) {
48+
): DetectedResource {
4949
if (
5050
!browserResource[BROWSER_ATTRIBUTES.USER_AGENT] &&
5151
!browserResource[BROWSER_ATTRIBUTES.PLATFORM]
5252
) {
5353
diag.debug(
5454
'BrowserDetector failed: Unable to find required browser resources. '
5555
);
56-
return Resource.empty();
56+
return Resource.EMPTY;
5757
} else {
58-
return new Resource(browserResource);
58+
return { attributes: browserResource };
5959
}
6060
}
6161
}

experimental/packages/opentelemetry-browser-detector/test/BrowserDetector.test.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
* limitations under the License.
1515
*/
1616
import * as sinon from 'sinon';
17-
import { IResource } from '@opentelemetry/resources';
1817
import { browserDetector } from '../src/BrowserDetector';
19-
import { describeBrowser, assertResource, assertEmptyResource } from './util';
18+
import { assertEmptyResource, assertResource, describeBrowser } from './util';
2019

2120
describeBrowser('browserDetector()', () => {
2221
afterEach(() => {
@@ -47,7 +46,7 @@ describeBrowser('browserDetector()', () => {
4746
},
4847
});
4948

50-
const resource: IResource = await browserDetector.detect();
49+
const resource = browserDetector.detect();
5150
assertResource(resource, {
5251
platform: 'platform',
5352
brands: ['Chromium 106', 'Google Chrome 106', 'Not;A=Brand 99'],
@@ -63,7 +62,7 @@ describeBrowser('browserDetector()', () => {
6362
userAgentData: undefined,
6463
});
6564

66-
const resource: IResource = await browserDetector.detect();
65+
const resource = browserDetector.detect();
6766
assertResource(resource, {
6867
language: 'en-US',
6968
user_agent: 'dddd',
@@ -74,7 +73,7 @@ describeBrowser('browserDetector()', () => {
7473
sinon.stub(globalThis, 'navigator').value({
7574
userAgent: '',
7675
});
77-
const resource: IResource = await browserDetector.detect();
76+
const resource = browserDetector.detect();
7877
assertEmptyResource(resource);
7978
});
8079
});

experimental/packages/opentelemetry-browser-detector/test/util.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import { Suite } from 'mocha';
1717
import * as assert from 'assert';
1818
import { BROWSER_ATTRIBUTES } from '../src/types';
19-
import { IResource } from '@opentelemetry/resources';
19+
import { DetectedResource } from '@opentelemetry/resources';
2020

2121
export function describeBrowser(title: string, fn: (this: Suite) => void) {
2222
title = `Browser: ${title}`;
@@ -27,7 +27,7 @@ export function describeBrowser(title: string, fn: (this: Suite) => void) {
2727
}
2828

2929
export const assertResource = (
30-
resource: IResource,
30+
resource: DetectedResource,
3131
validations: {
3232
platform?: string;
3333
brands?: string[];
@@ -38,32 +38,32 @@ export const assertResource = (
3838
) => {
3939
if (validations.platform) {
4040
assert.strictEqual(
41-
resource.attributes[BROWSER_ATTRIBUTES.PLATFORM],
41+
resource.attributes?.[BROWSER_ATTRIBUTES.PLATFORM],
4242
validations.platform
4343
);
4444
}
4545
if (validations.brands) {
46-
assert.ok(Array.isArray(resource.attributes[BROWSER_ATTRIBUTES.BRANDS]));
46+
assert.ok(Array.isArray(resource.attributes?.[BROWSER_ATTRIBUTES.BRANDS]));
4747
assert.deepStrictEqual(
48-
resource.attributes[BROWSER_ATTRIBUTES.BRANDS] as string[],
48+
resource.attributes?.[BROWSER_ATTRIBUTES.BRANDS] as string[],
4949
validations.brands
5050
);
5151
}
5252
if (validations.mobile) {
5353
assert.strictEqual(
54-
resource.attributes[BROWSER_ATTRIBUTES.MOBILE],
54+
resource.attributes?.[BROWSER_ATTRIBUTES.MOBILE],
5555
validations.mobile
5656
);
5757
}
5858
if (validations.language) {
5959
assert.strictEqual(
60-
resource.attributes[BROWSER_ATTRIBUTES.LANGUAGE],
60+
resource.attributes?.[BROWSER_ATTRIBUTES.LANGUAGE],
6161
validations.language
6262
);
6363
}
6464
if (validations.user_agent) {
6565
assert.strictEqual(
66-
resource.attributes[BROWSER_ATTRIBUTES.USER_AGENT],
66+
resource.attributes?.[BROWSER_ATTRIBUTES.USER_AGENT],
6767
validations.user_agent
6868
);
6969
}
@@ -74,6 +74,6 @@ export const assertResource = (
7474
*
7575
* @param resource the Resource to validate
7676
*/
77-
export const assertEmptyResource = (resource: IResource) => {
78-
assert.strictEqual(Object.keys(resource.attributes).length, 0);
77+
export const assertEmptyResource = (resource: DetectedResource) => {
78+
assert.strictEqual(Object.keys(resource.attributes ?? {}).length, 0);
7979
};

experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -704,11 +704,13 @@ describe('PrometheusSerializer', () => {
704704
const serializer = new PrometheusSerializer(undefined, true);
705705
const result = serializer['_serializeResource'](
706706
new Resource({
707-
env: 'prod',
708-
hostname: 'myhost',
709-
datacenter: 'sdc',
710-
region: 'europe',
711-
owner: 'frontend',
707+
attributes: {
708+
env: 'prod',
709+
hostname: 'myhost',
710+
datacenter: 'sdc',
711+
region: 'europe',
712+
owner: 'frontend',
713+
},
712714
})
713715
);
714716

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@ import {
2727
registerInstrumentations,
2828
} from '@opentelemetry/instrumentation';
2929
import {
30-
Detector,
31-
DetectorSync,
32-
detectResourcesSync,
30+
detectResources,
3331
envDetector,
3432
hostDetector,
3533
IResource,
3634
processDetector,
3735
Resource,
3836
ResourceDetectionConfig,
37+
ResourceDetector,
3938
} from '@opentelemetry/resources';
4039
import {
4140
LogRecordProcessor,
@@ -210,7 +209,7 @@ export class NodeSDK {
210209
private _instrumentations: Instrumentation[];
211210

212211
private _resource: IResource;
213-
private _resourceDetectors: Array<Detector | DetectorSync>;
212+
private _resourceDetectors: Array<ResourceDetector>;
214213

215214
private _autoDetectResources: boolean;
216215

@@ -346,17 +345,17 @@ export class NodeSDK {
346345
detectors: this._resourceDetectors,
347346
};
348347

349-
this._resource = this._resource.merge(
350-
detectResourcesSync(internalConfig)
351-
);
348+
this._resource = this._resource.merge(detectResources(internalConfig));
352349
}
353350

354351
this._resource =
355352
this._serviceName === undefined
356353
? this._resource
357354
: this._resource.merge(
358355
new Resource({
359-
[ATTR_SERVICE_NAME]: this._serviceName,
356+
attributes: {
357+
[ATTR_SERVICE_NAME]: this._serviceName,
358+
},
360359
})
361360
);
362361

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import type { ContextManager } from '@opentelemetry/api';
1818
import { TextMapPropagator } from '@opentelemetry/api';
1919
import { Instrumentation } from '@opentelemetry/instrumentation';
20-
import { Detector, DetectorSync, IResource } from '@opentelemetry/resources';
20+
import { IResource, ResourceDetector } from '@opentelemetry/resources';
2121
import { LogRecordProcessor } from '@opentelemetry/sdk-logs';
2222
import { IMetricReader, ViewOptions } from '@opentelemetry/sdk-metrics';
2323
import {
@@ -39,7 +39,7 @@ export interface NodeSDKConfiguration {
3939
views: ViewOptions[];
4040
instrumentations: (Instrumentation | Instrumentation[])[];
4141
resource: IResource;
42-
resourceDetectors: Array<Detector | DetectorSync>;
42+
resourceDetectors: Array<ResourceDetector>;
4343
sampler: Sampler;
4444
serviceName?: string;
4545
/** @deprecated use spanProcessors instead*/

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ import { OTLPTraceExporter as OTLPHttpTraceExporter } from '@opentelemetry/expor
2626
import { OTLPTraceExporter as OTLPGrpcTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
2727
import { ZipkinExporter } from '@opentelemetry/exporter-zipkin';
2828
import {
29-
DetectorSync,
30-
envDetectorSync,
31-
hostDetectorSync,
32-
osDetectorSync,
33-
processDetectorSync,
34-
serviceInstanceIdDetectorSync,
29+
envDetector,
30+
hostDetector,
31+
osDetector,
32+
processDetector,
33+
ResourceDetector,
34+
serviceInstanceIdDetector,
3535
} from '@opentelemetry/resources';
3636
import {
3737
BatchSpanProcessor,
@@ -49,14 +49,14 @@ const RESOURCE_DETECTOR_OS = 'os';
4949
const RESOURCE_DETECTOR_PROCESS = 'process';
5050
const RESOURCE_DETECTOR_SERVICE_INSTANCE_ID = 'serviceinstance';
5151

52-
export function getResourceDetectorsFromEnv(): Array<DetectorSync> {
52+
export function getResourceDetectorsFromEnv(): Array<ResourceDetector> {
5353
// When updating this list, make sure to also update the section `resourceDetectors` on README.
54-
const resourceDetectors = new Map<string, DetectorSync>([
55-
[RESOURCE_DETECTOR_ENVIRONMENT, envDetectorSync],
56-
[RESOURCE_DETECTOR_HOST, hostDetectorSync],
57-
[RESOURCE_DETECTOR_OS, osDetectorSync],
58-
[RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, serviceInstanceIdDetectorSync],
59-
[RESOURCE_DETECTOR_PROCESS, processDetectorSync],
54+
const resourceDetectors = new Map<string, ResourceDetector>([
55+
[RESOURCE_DETECTOR_ENVIRONMENT, envDetector],
56+
[RESOURCE_DETECTOR_HOST, hostDetector],
57+
[RESOURCE_DETECTOR_OS, osDetector],
58+
[RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, serviceInstanceIdDetector],
59+
[RESOURCE_DETECTOR_PROCESS, processDetector],
6060
]);
6161

6262
const resourceDetectorsFromEnv =

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ import { NodeSDK } from '../src';
6262
import { env } from 'process';
6363
import {
6464
envDetector,
65-
envDetectorSync,
6665
processDetector,
6766
hostDetector,
6867
Resource,
69-
serviceInstanceIdDetectorSync,
68+
serviceInstanceIdDetector,
69+
DetectedResource,
7070
} from '@opentelemetry/resources';
7171
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
7272
import { logs, ProxyLoggerProvider } from '@opentelemetry/api-logs';
@@ -540,8 +540,10 @@ describe('Node SDK', () => {
540540
resourceDetectors: [
541541
processDetector,
542542
{
543-
async detect(): Promise<Resource> {
544-
return new Resource({ customAttr: 'someValue' });
543+
detect(): DetectedResource {
544+
return {
545+
attributes: { customAttr: 'someValue' },
546+
};
545547
},
546548
},
547549
envDetector,
@@ -705,7 +707,7 @@ describe('Node SDK', () => {
705707
await sdk1.shutdown();
706708

707709
const sdk2 = new NodeSDK({
708-
resourceDetectors: [envDetectorSync],
710+
resourceDetectors: [envDetector],
709711
});
710712
sdk2.start();
711713
await sdk2.shutdown();
@@ -870,7 +872,7 @@ describe('Node SDK', () => {
870872
processDetector,
871873
envDetector,
872874
hostDetector,
873-
serviceInstanceIdDetectorSync,
875+
serviceInstanceIdDetector,
874876
],
875877
});
876878

@@ -940,8 +942,10 @@ describe('Node SDK', () => {
940942
resourceDetectors: [
941943
processDetector,
942944
{
943-
async detect(): Promise<Resource> {
944-
return new Resource({ customAttr: 'someValue' });
945+
detect(): DetectedResource {
946+
return {
947+
attributes: { customAttr: 'someValue' },
948+
};
945949
},
946950
},
947951
envDetector,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ const assertHasOneLabel = (prefix: string, resource: Resource): void => {
362362
);
363363
};
364364

365-
export const assertServiceInstanceIdIsUUID = (resource: Resource): void => {
365+
export const assertServiceInstanceIdIsUUID = (resource: IResource): void => {
366366
const UUID_REGEX =
367367
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
368368
assert.equal(

0 commit comments

Comments
 (0)