Skip to content

Commit

Permalink
feat: allow to add attributes from grpc metadata in the patched server (
Browse files Browse the repository at this point in the history
#3589)

* feat(opentelemetry-instrumentation-grpc): support server calls in metadataToSpanAttributes

Signed-off-by: Xavier Serrano <[email protected]>

* chore(opentelemetry-instrumentation-grpc): update changelog

Signed-off-by: Xavier Serrano <[email protected]>

* chore(opentelemetry-instrumentation-grpc): update changelog

* chore(opentelemetry-instrumentation-grpc): update comments and documentation

Signed-off-by: Xavier Serrano <[email protected]>

---------

Signed-off-by: Xavier Serrano <[email protected]>
Co-authored-by: Daniel Dyla <[email protected]>
  • Loading branch information
zombispormedio and dyladan authored Mar 3, 2023
1 parent cbbdfd3 commit 2f715bd
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 2 deletions.
1 change: 1 addition & 0 deletions experimental/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ All notable changes to experimental packages in this project will be documented

* feat: use HTTP_ROUTE in span name [#3603](https://github.com/open-telemetry/opentelemetry-js/pull/3603) @Flarna
* feat: add HTTP_ROUTE attribute to http incoming metrics if present [#3581](https://github.com/open-telemetry/opentelemetry-js/pull/3581) @hermogenes
* feat(opentelemetry-instrumentation-grpc): allow to add attributes from grpc metadata in the patched server [#3589](https://github.com/open-telemetry/opentelemetry-js/pull/3589) @zombispormedio
* feat(sdk-node): install diag logger with OTEL_LOG_LEVEL [#3627](https://github.com/open-telemetry/opentelemetry-js/pull/3627) @legendecas
* feat(otlp-exporter-base): add retries [#3207](https://github.com/open-telemetry/opentelemetry-js/pull/3207) @svetlanabrennan
* feat(sdk-node): override IdGenerator when using NodeSDK [#3645](https://github.com/open-telemetry/opentelemetry-js/pull/3645) @haddasbronfman
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ gRPC instrumentation accepts the following configuration:
| Options | Type | Description |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [`ignoreGrpcMethods`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-grpc/src/types.ts#L25) | `IgnoreMatcher[]` | gRPC instrumentation will not trace any methods that match anything in this list. You may pass a string (case-insensitive match), a `RegExp` object, or a filter function. |
| [`metadataToSpanAttributes`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-grpc/src/types.ts#L27) | `object` | List of case insensitive metadata to convert to span attributes. Client (outgoing requests, incoming responses) metadata attributes will be converted to span attributes in the form of `rpc.{request\response}.metadata.metadata_key`, e.g. `rpc.response.metadata.date` |
| [`metadataToSpanAttributes`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-grpc/src/types.ts#L27) | `object` | List of case insensitive metadata to convert to span attributes. Client and server (outgoing requests, incoming responses) metadata attributes will be converted to span attributes in the form of `rpc.{request\response}.metadata.metadata_key`, e.g. `rpc.response.metadata.date` |

## Useful links

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,24 @@ export class GrpcJsInstrumentation extends InstrumentationBase {
[SemanticAttributes.RPC_SERVICE]: service,
});

instrumentation._metadataCapture.server.captureRequestMetadata(
span,
call.metadata
);

instrumentation._wrap(
call,
'sendMetadata',
originalSendMetadata =>
(responseMetadata: grpcJs.Metadata) => {
instrumentation._metadataCapture.server.captureResponseMetadata(
span,
responseMetadata
);
originalSendMetadata.call(call, responseMetadata);
}
);

context.with(trace.setSpan(context.active(), span), () => {
handleServerFunction.call(
self,
Expand Down Expand Up @@ -385,6 +403,16 @@ export class GrpcJsInstrumentation extends InstrumentationBase {
config.metadataToSpanAttributes?.client?.responseMetadata ?? []
),
},
server: {
captureRequestMetadata: metadataCapture(
'request',
config.metadataToSpanAttributes?.server?.requestMetadata ?? []
),
captureResponseMetadata: metadataCapture(
'response',
config.metadataToSpanAttributes?.server?.responseMetadata ?? []
),
},
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,24 @@ export class GrpcNativeInstrumentation extends InstrumentationBase<
[SemanticAttributes.RPC_SERVICE]: service,
});

instrumentation._metadataCapture.server.captureRequestMetadata(
span,
call.metadata
);

instrumentation._wrap(
call as any,
'sendMetadata',
originalSendMetadata =>
(responseMetadata: grpcTypes.Metadata) => {
instrumentation._metadataCapture.server.captureResponseMetadata(
span,
responseMetadata
);
originalSendMetadata.call(call, responseMetadata);
}
);

context.with(trace.setSpan(context.active(), span), () => {
switch (type) {
case 'unary':
Expand Down Expand Up @@ -370,6 +388,16 @@ export class GrpcNativeInstrumentation extends InstrumentationBase<
config.metadataToSpanAttributes?.client?.responseMetadata ?? []
),
},
server: {
captureRequestMetadata: metadataCapture(
'request',
config.metadataToSpanAttributes?.server?.requestMetadata ?? []
),
captureResponseMetadata: metadataCapture(
'response',
config.metadataToSpanAttributes?.server?.responseMetadata ?? []
),
},
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,14 @@ export type metadataCaptureType = {
metadata: grpcJsTypes.Metadata | grpcTypes.Metadata
) => void;
};
server: {
captureRequestMetadata: (
span: Span,
metadata: grpcJsTypes.Metadata | grpcTypes.Metadata
) => void;
captureResponseMetadata: (
span: Span,
metadata: grpcJsTypes.Metadata | grpcTypes.Metadata
) => void;
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,9 @@ export interface GrpcInstrumentationConfig extends InstrumentationConfig {
responseMetadata?: string[];
requestMetadata?: string[];
};
server?: {
responseMetadata?: string[];
requestMetadata?: string[];
};
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -978,6 +978,10 @@ export const runTests = (
requestMetadata: ['client_metadata_key'],
responseMetadata: ['server_metadata_key'],
},
server: {
requestMetadata: ['client_metadata_key'],
responseMetadata: ['server_metadata_key'],
},
},
});

Expand All @@ -999,13 +1003,18 @@ export const runTests = (
});
});

describe('Capture request/response metadata in client span', () => {
describe('Capture request/response metadata in client and server spans', () => {
const attributeValidation = {
clientAttributes: {
'rpc.request.metadata.client_metadata_key': 'client_metadata_value',
'rpc.response.metadata.server_metadata_key':
'server_metadata_value',
},
serverAttributes: {
'rpc.request.metadata.client_metadata_key': 'client_metadata_value',
'rpc.response.metadata.server_metadata_key':
'server_metadata_value',
},
};

runTestWithAttributeValidation(
Expand Down

0 comments on commit 2f715bd

Please sign in to comment.