@apollo/gateway
Version:
205 lines • 10 kB
JavaScript
;
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