Skip to content
This repository was archived by the owner on Oct 31, 2024. It is now read-only.

Commit 3afffb9

Browse files
author
Amir Blum
committed
feat(plugin-aws-sdk): bind promise only on incoming operations
1 parent 3501aad commit 3afffb9

File tree

4 files changed

+79
-16
lines changed

4 files changed

+79
-16
lines changed

packages/plugin-aws-sdk/src/aws-sdk.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
callback | 1 | 2
1010
*/
1111
import { BasePlugin } from "@opentelemetry/core";
12-
import { Span, CanonicalCode } from "@opentelemetry/api";
12+
import { Span, CanonicalCode, Attributes } from "@opentelemetry/api";
1313
import * as shimmer from "shimmer";
1414
import AWS from "aws-sdk";
1515
import { AttributeNames } from "./enums";
@@ -69,7 +69,10 @@ class AwsPlugin extends BasePlugin<typeof AWS> {
6969
return target;
7070
}
7171

72-
private _startAwsSpan(request: AWS.Request<any, any>): Span {
72+
private _startAwsSpan(
73+
request: AWS.Request<any, any>,
74+
additionalAttributes?: Attributes
75+
): Span {
7376
const operation = (request as any).operation;
7477
const service = (request as any).service;
7578

@@ -83,7 +86,7 @@ class AwsPlugin extends BasePlugin<typeof AWS> {
8386
[AttributeNames.AWS_SERVICE_API]: service?.api?.className,
8487
[AttributeNames.AWS_SERVICE_IDENTIFIER]: service?.serviceIdentifier,
8588
[AttributeNames.AWS_SERVICE_NAME]: service?.api?.abbreviation,
86-
...getRequestServiceAttributes(request),
89+
...additionalAttributes,
8790
},
8891
});
8992

@@ -138,7 +141,11 @@ class AwsPlugin extends BasePlugin<typeof AWS> {
138141
return original.apply(this, arguments);
139142
}
140143

141-
const span = thisPlugin._startAwsSpan(awsRequest);
144+
const requestMetadata = getRequestServiceAttributes(awsRequest);
145+
const span = thisPlugin._startAwsSpan(
146+
awsRequest,
147+
requestMetadata?.attributes
148+
);
142149
thisPlugin._callPreRequestHooks(span, awsRequest);
143150
thisPlugin._registerCompletedEvent(span, awsRequest);
144151

@@ -164,17 +171,24 @@ class AwsPlugin extends BasePlugin<typeof AWS> {
164171
return original.apply(this, arguments);
165172
}
166173

167-
const span = thisPlugin._startAwsSpan(awsRequest);
174+
const requestMetadata = getRequestServiceAttributes(awsRequest);
175+
const span = thisPlugin._startAwsSpan(
176+
awsRequest,
177+
requestMetadata?.attributes
178+
);
168179
thisPlugin._callPreRequestHooks(span, awsRequest);
169180
thisPlugin._registerCompletedEvent(span, awsRequest);
170181

171-
const promiseToReturn: Promise<any> = thisPlugin._tracer.withSpan(
182+
const origPromise: Promise<any> = thisPlugin._tracer.withSpan(
172183
span,
173184
() => {
174185
return original.apply(awsRequest, arguments);
175186
}
176187
);
177-
return thisPlugin._bindPromise(promiseToReturn, span);
188+
189+
return requestMetadata.isIncoming
190+
? thisPlugin._bindPromise(origPromise, span)
191+
: origPromise;
178192
};
179193
}
180194

packages/plugin-aws-sdk/src/services/s3.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { Attributes } from "@opentelemetry/api";
2+
import { RequestMetadata } from "./service-attributes";
23

34
export function getS3RequestSpanAttributes(
45
request: AWS.Request<any, any>
5-
): Attributes {
6-
return {};
6+
): RequestMetadata {
7+
return {
8+
attributes: {},
9+
isIncoming: false,
10+
};
711
}
812

913
export function getS3ResponseSpanAttributes(

packages/plugin-aws-sdk/src/services/service-attributes.ts

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
import { Attributes } from "@opentelemetry/api";
22
import { getS3RequestSpanAttributes, getS3ResponseSpanAttributes } from "./s3";
3+
import {
4+
getSqsRequestSpanAttributes,
5+
getSqsResponseSpanAttributes,
6+
} from "./sqs";
37

4-
type RequestAttrProcessor = (request: AWS.Request<any, any>) => Attributes;
8+
/*
9+
attributes are additional span attributes that should be added to the span.
10+
isIncoming - if true, then the operation callback / promise should be bind with the operation's span
11+
*/
12+
export interface RequestMetadata {
13+
attributes: Attributes;
14+
isIncoming: boolean;
15+
}
16+
17+
type RequestAttrProcessor = (request: AWS.Request<any, any>) => RequestMetadata;
518
type ResponseAttrProcessor = (response: AWS.Response<any, any>) => Attributes;
619

720
class ServiceAttributes {
@@ -12,7 +25,7 @@ class ServiceAttributes {
1225
};
1326
} = {};
1427

15-
public initAttributeProcessor = (
28+
public addAttributeProcessor = (
1629
serviceId: string,
1730
requestProcessor: RequestAttrProcessor,
1831
responseProcessor: ResponseAttrProcessor
@@ -26,7 +39,7 @@ class ServiceAttributes {
2639

2740
export function getRequestServiceAttributes(
2841
request: AWS.Request<any, any>
29-
): Attributes {
42+
): RequestMetadata {
3043
const serviceId = (request as any)?.service?.serviceIdentifier;
3144
if (serviceId) {
3245
return serviceAttributes.attributeProcessors[serviceId]?.request(request);
@@ -37,15 +50,21 @@ export function getResponseServiceAttributes(
3750
response: AWS.Response<any, any>
3851
): Attributes {
3952
const serviceId = (response as any)?.request?.service?.serviceIdentifier;
40-
if (serviceId) {
41-
return serviceAttributes.attributeProcessors[serviceId]?.response(response);
42-
}
53+
if (!serviceId) return;
54+
55+
return serviceAttributes.attributeProcessors[serviceId]?.response(response);
4356
}
4457

4558
export const serviceAttributes = new ServiceAttributes();
4659

47-
serviceAttributes.initAttributeProcessor(
60+
serviceAttributes.addAttributeProcessor(
4861
"s3",
4962
getS3RequestSpanAttributes,
5063
getS3ResponseSpanAttributes
5164
);
65+
66+
serviceAttributes.addAttributeProcessor(
67+
"sqs",
68+
getSqsRequestSpanAttributes,
69+
getSqsResponseSpanAttributes
70+
);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Attributes } from "@opentelemetry/api";
2+
import { RequestMetadata } from "./service-attributes";
3+
4+
export function getSqsRequestSpanAttributes(
5+
request: AWS.Request<any, any>
6+
): RequestMetadata {
7+
const operation = (request as any)?.operation;
8+
switch (operation) {
9+
case "receiveMessage":
10+
return {
11+
attributes: {},
12+
isIncoming: true,
13+
};
14+
}
15+
16+
return {
17+
attributes: {},
18+
isIncoming: false,
19+
};
20+
}
21+
22+
export function getSqsResponseSpanAttributes(
23+
response: AWS.Response<any, any>
24+
): Attributes {
25+
return {};
26+
}

0 commit comments

Comments
 (0)