diff --git a/packages/gateway/src/opentelemetry/setup.ts b/packages/gateway/src/opentelemetry/setup.ts index ac5a8e818..0b5e6bf95 100644 --- a/packages/gateway/src/opentelemetry/setup.ts +++ b/packages/gateway/src/opentelemetry/setup.ts @@ -1 +1,42 @@ +import { + hiveTracingSetup as _hiveTracingSetup, + openTelemetrySetup as _openTelemetrySetup, + ATTR_SERVICE_NAME, + ATTR_SERVICE_VERSION, + OpentelemetrySetupOptions, +} from '@graphql-hive/plugin-opentelemetry/setup'; +import { resourceFromAttributes } from '@opentelemetry/resources'; + export * from '@graphql-hive/plugin-opentelemetry/setup'; + +export const openTelemetrySetup: typeof _openTelemetrySetup = (options) => { + return _openTelemetrySetup({ + ...options, + resource: createGatewayResource(options), + }); +}; + +export const hiveTracingSetup: typeof _hiveTracingSetup = (options) => { + return _hiveTracingSetup({ + ...options, + resource: createGatewayResource(options), + }); +}; + +function createGatewayResource( + options: Pick, +): OpentelemetrySetupOptions['resource'] { + if (!options.resource) { + return { + serviceName: 'hive-gateway', + serviceVersion: globalThis.__OTEL_PLUGIN_VERSION__ ?? 'unknown', + }; + } else if (!('serviceName' in options.resource)) { + return resourceFromAttributes({ + [ATTR_SERVICE_NAME]: 'hive-gateway', + [ATTR_SERVICE_VERSION]: globalThis.__OTEL_PLUGIN_VERSION__ ?? 'unknown', + }).merge(options.resource); + } else { + return options.resource; + } +} diff --git a/packages/plugins/opentelemetry/src/setup.ts b/packages/plugins/opentelemetry/src/setup.ts index c39a6421b..cf37bc913 100644 --- a/packages/plugins/opentelemetry/src/setup.ts +++ b/packages/plugins/opentelemetry/src/setup.ts @@ -120,7 +120,7 @@ type SamplingOptions = samplingRate?: number; }; -type OpentelemetrySetupOptions = TracingOptions & +export type OpentelemetrySetupOptions = TracingOptions & SamplingOptions & { /** * The Resource that will be used to create the Trace Provider. @@ -303,6 +303,11 @@ export type HiveTracingOptions = { target?: string } & ( export function hiveTracingSetup( config: HiveTracingOptions & { contextManager: ContextManager | null; + /** + * The Resource that will be used to create the Trace Provider. + * Can be either a Resource instance, or an simple object with service name and version + */ + resource?: Resource | { serviceName: string; serviceVersion: string }; log?: Logger; }, ) { @@ -331,12 +336,27 @@ export function hiveTracingSetup( logAttributes['batching'] = config.batching; } + let resource = resourceFromAttributes({ + 'hive.target_id': config.target, + }); + + if (config.resource) { + if ('serviceName' in config.resource) { + resource = resource.merge( + resourceFromAttributes({ + [ATTR_SERVICE_NAME]: config.resource.serviceName, + [ATTR_SERVICE_VERSION]: config.resource.serviceVersion, + }), + ); + } else { + resource = resource.merge(config.resource); + } + } + openTelemetrySetup({ log, contextManager: config.contextManager, - resource: resourceFromAttributes({ - 'hive.target_id': config.target, - }), + resource, traces: { processors: [ new HiveTracingSpanProcessor(config as HiveTracingSpanProcessorOptions),