UNPKG

@apollo/gateway

Version:
205 lines 10 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDataCollectionExporter = exports.createDataCollectionMeterProvider = exports.recordExceptions = exports.operationContextSpanAttributes = exports.requestContextSpanAttributes = exports.tracer = exports.OpenTelemetryAttributeNames = exports.OpenTelemetrySpanNames = void 0; const api_1 = __importDefault(require("@opentelemetry/api")); const node_cpu_count_1 = require("node-cpu-count"); const os = __importStar(require("node:os")); const incubating_1 = require("@opentelemetry/semantic-conventions/incubating"); const sdk_metrics_1 = require("@opentelemetry/sdk-metrics"); const resource_detector_alibaba_cloud_1 = require("@opentelemetry/resource-detector-alibaba-cloud"); const resource_detector_aws_1 = require("@opentelemetry/resource-detector-aws"); const resource_detector_gcp_1 = require("@opentelemetry/resource-detector-gcp"); const resource_detector_azure_1 = require("@opentelemetry/resource-detector-azure"); const resources_1 = require("@opentelemetry/resources"); const exporter_metrics_otlp_http_1 = require("@opentelemetry/exporter-metrics-otlp-http"); const node_crypto_1 = require("node:crypto"); var OpenTelemetrySpanNames; (function (OpenTelemetrySpanNames) { OpenTelemetrySpanNames["REQUEST"] = "gateway.request"; OpenTelemetrySpanNames["PLAN"] = "gateway.plan"; OpenTelemetrySpanNames["FETCH"] = "gateway.fetch"; OpenTelemetrySpanNames["POST_PROCESSING"] = "gateway.postprocessing"; OpenTelemetrySpanNames["EXECUTE"] = "gateway.execute"; OpenTelemetrySpanNames["VALIDATE"] = "gateway.validate"; })(OpenTelemetrySpanNames || (exports.OpenTelemetrySpanNames = OpenTelemetrySpanNames = {})); var OpenTelemetryAttributeNames; (function (OpenTelemetryAttributeNames) { OpenTelemetryAttributeNames["GRAPHQL_DOCUMENT"] = "graphql.document"; OpenTelemetryAttributeNames["GRAPHQL_OPERATION_NAME"] = "graphql.operation.name"; OpenTelemetryAttributeNames["GRAPHQL_OPERATION_NAME_DEPRECATED"] = "operationName"; OpenTelemetryAttributeNames["GRAPHQL_OPERATION_TYPE"] = "graphql.operation.type"; })(OpenTelemetryAttributeNames || (exports.OpenTelemetryAttributeNames = OpenTelemetryAttributeNames = {})); const APOLLO_OTEL_ENDPOINT = "https://usage-reporting.api.apollographql.com"; const EXPORT_INTERVAL_SECONDS = 60 * 60; const EXPORT_INTERVAL_MILLIS = 1000 * EXPORT_INTERVAL_SECONDS; const NAME = "apollo/gateway-js"; const SI_MEGA = 1000000; const { version } = require('../../package.json'); exports.tracer = api_1.default.trace.getTracer(NAME, version); function requestContextSpanAttributes(requestContext, config) { const spanAttributes = {}; if (requestContext.operationName) { spanAttributes[OpenTelemetryAttributeNames.GRAPHQL_OPERATION_NAME_DEPRECATED] = requestContext.operationName; spanAttributes[OpenTelemetryAttributeNames.GRAPHQL_OPERATION_NAME] = requestContext.operationName; } if ((config === null || config === void 0 ? void 0 : config.includeDocument) && requestContext.source) { spanAttributes[OpenTelemetryAttributeNames.GRAPHQL_DOCUMENT] = requestContext.source; } return spanAttributes; } exports.requestContextSpanAttributes = requestContextSpanAttributes; function operationContextSpanAttributes(operationContext) { const spanAttributes = {}; if (operationContext.operation.operation) { spanAttributes[OpenTelemetryAttributeNames.GRAPHQL_OPERATION_TYPE] = operationContext.operation.operation; } return spanAttributes; } exports.operationContextSpanAttributes = operationContextSpanAttributes; function recordExceptions(span, exceptions, config) { const recordExceptions = config === null || config === void 0 ? void 0 : config.recordExceptions; if (recordExceptions === undefined || recordExceptions === false) { return; } let exceptionsToRecord; if (recordExceptions === true) { exceptionsToRecord = exceptions; } else if (recordExceptions <= 0) { return; } else { exceptionsToRecord = exceptions.slice(0, recordExceptions); } for (const exception of exceptionsToRecord) { span.recordException(exception); } } exports.recordExceptions = recordExceptions; const ALLOWED_CLOUD_RESOURCE_ATTRIBUTES = new Set([ incubating_1.ATTR_CLOUD_PROVIDER, incubating_1.ATTR_CLOUD_PLATFORM, ]); function filterToAllowedCloudAttributes(resource) { var _a; return new resources_1.Resource({}, Promise.resolve((_a = resource.waitForAsyncAttributes) === null || _a === void 0 ? void 0 : _a.call(resource)).then(() => { const filtered = {}; for (const [key, value] of Object.entries(resource.attributes)) { if (ALLOWED_CLOUD_RESOURCE_ATTRIBUTES.has(key)) { filtered[key] = value; } } return filtered; })); } function createDataCollectionMeterProvider(metricExporter) { const detectedResource = (0, resources_1.detectResourcesSync)({ detectors: [ resource_detector_alibaba_cloud_1.alibabaCloudEcsDetector, resource_detector_aws_1.awsEc2Detector, resource_detector_aws_1.awsBeanstalkDetector, resource_detector_aws_1.awsEcsDetector, resource_detector_aws_1.awsEksDetector, resource_detector_aws_1.awsLambdaDetector, resource_detector_gcp_1.gcpDetector, resource_detector_azure_1.azureVmDetector, resource_detector_azure_1.azureFunctionsDetector, resource_detector_azure_1.azureAppServiceDetector ], }); const resource = filterToAllowedCloudAttributes(detectedResource); const meterProvider = new sdk_metrics_1.MeterProvider({ resource: resource.merge(new resources_1.Resource({ [incubating_1.ATTR_SERVICE_NAME]: 'gateway-js', [incubating_1.ATTR_SERVICE_INSTANCE_ID]: (0, node_crypto_1.randomUUID)() })), readers: [ new sdk_metrics_1.PeriodicExportingMetricReader({ exporter: metricExporter, exportIntervalMillis: EXPORT_INTERVAL_MILLIS, }), ], }); const hostAttrs = resources_1.hostDetectorSync.detect().attributes; const osAttrs = resources_1.osDetectorSync.detect().attributes; const osType = osAttrs[incubating_1.ATTR_OS_TYPE]; const hostArch = hostAttrs[incubating_1.ATTR_HOST_ARCH]; const meter = meterProvider.getMeter(NAME, version); const uptimeGauge = meter.createObservableGauge(incubating_1.METRIC_PROCESS_UPTIME, { "description": "The uptime of the JS federation gateway running" }); const instanceAttrs = { [incubating_1.ATTR_OS_TYPE]: osType, [incubating_1.ATTR_HOST_ARCH]: hostArch }; if (osType === incubating_1.OS_TYPE_VALUE_LINUX) { instanceAttrs["linux.distribution"] = osAttrs[incubating_1.ATTR_OS_NAME]; } let uptime = 0; uptimeGauge.addCallback((result) => { result.observe(uptime, instanceAttrs); uptime = uptime + EXPORT_INTERVAL_SECONDS; }); const cpuFreqGauge = meter.createObservableGauge(incubating_1.METRIC_SYSTEM_CPU_FREQUENCY, { "description": "The CPU frequency of the underlying instance the JS federation gateway is deployed to", "unit": "Hz" }); cpuFreqGauge.addCallback((result) => { const cpus = os.cpus(); const average_frequency = os.cpus().map((a) => a.speed * SI_MEGA).reduce((partialSum, a) => partialSum + a, 0) / cpus.length; result.observe(average_frequency); }); const cpuCountGauge = meter.createObservableGauge(incubating_1.METRIC_SYSTEM_CPU_LOGICAL_COUNT, { "description": "The number of CPUs reported by the instance the JS federation gateway is running on" }); cpuCountGauge.addCallback((result) => { result.observe((0, node_cpu_count_1.cpuCountSync)(), { [incubating_1.ATTR_HOST_ARCH]: hostArch, }); }); const totalMemoryGauge = meter.createObservableGauge(incubating_1.METRIC_SYSTEM_MEMORY_LIMIT, { "description": "The amount of memory reported by the instance the JS federation gateway is running on", "unit": "bytes" }); totalMemoryGauge.addCallback((result) => { result.observe(os.totalmem(), { [incubating_1.ATTR_HOST_ARCH]: hostArch, }); }); return meterProvider; } exports.createDataCollectionMeterProvider = createDataCollectionMeterProvider; function createDataCollectionExporter() { return createDataCollectionMeterProvider(new exporter_metrics_otlp_http_1.OTLPMetricExporter({ url: APOLLO_OTEL_ENDPOINT })); } exports.createDataCollectionExporter = createDataCollectionExporter; //# sourceMappingURL=opentelemetry.js.map