UNPKG

nice-grpc-opentelemetry

Version:

OpenTelemetry instrumentation for nice-grpc

70 lines 3.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.openTelemetryServerMiddleware = openTelemetryServerMiddleware; const api_1 = require("@opentelemetry/api"); const semantic_conventions_1 = require("@opentelemetry/semantic-conventions"); const abort_controller_x_1 = require("abort-controller-x"); const nice_grpc_common_1 = require("nice-grpc-common"); const attributes_1 = require("./attributes"); const propagation_1 = require("./propagation"); const traces_1 = require("./traces"); const bindAsyncGenerator_1 = require("./utils/bindAsyncGenerator"); function openTelemetryServerMiddleware() { return (call, context) => traces_1.tracer.startActiveSpan((0, traces_1.getSpanName)(call.method.path), { kind: api_1.SpanKind.SERVER, }, api_1.propagation.extract(api_1.ROOT_CONTEXT, context.metadata, propagation_1.metadataGetter), span => (0, bindAsyncGenerator_1.bindAsyncGenerator)(api_1.context.active(), openTelemetryServerMiddlewareGenerator(span, call, context))); } async function* openTelemetryServerMiddlewareGenerator(span, call, context) { const attributes = { ...(0, attributes_1.getMethodAttributes)(call.method.path), ...(0, attributes_1.getPeerAttributes)(context.peer), }; span.setAttributes(attributes); let status = nice_grpc_common_1.Status.OK; let errorMessage; try { let request; if (!call.requestStream) { request = call.request; } else { request = (0, traces_1.emitSpanEvents)(call.request, span, semantic_conventions_1.MESSAGETYPEVALUES_RECEIVED); } if (!call.responseStream) { return yield* call.next(request, context); } else { yield* (0, traces_1.emitSpanEvents)(call.next(request, context), span, semantic_conventions_1.MESSAGETYPEVALUES_SENT); return; } } catch (err) { if (err instanceof nice_grpc_common_1.ServerError) { status = err.code; errorMessage = err.details; } else if ((0, abort_controller_x_1.isAbortError)(err)) { status = nice_grpc_common_1.Status.CANCELLED; errorMessage = 'The operation was cancelled'; } else { status = nice_grpc_common_1.Status.UNKNOWN; errorMessage = 'Unknown server error occurred'; span.recordException(err); } throw err; } finally { const statusAttributes = (0, attributes_1.getStatusAttributes)(status); span.setAttributes(statusAttributes); // https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/rpc/#grpc-status if (status !== nice_grpc_common_1.Status.OK) { span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: `${nice_grpc_common_1.Status[status]}: ${errorMessage}`, }); } span.end(); } } //# sourceMappingURL=server.js.map