npm.io
0.76.0 • Published 1 month ago

@opentelemetry/instrumentation-aws-sdk

Licence
Apache-2.0
Version
0.76.0
Deps
3
Size
365 kB
Vulns
0
Weekly
0
Stars
918

OpenTelemetry aws-sdk Instrumentation for Node.js

NPM Published Version Apache License

component owners: @blumamir @jj22ee @trivikr

This module provides automatic instrumentation for the AWS SDK for JavaScript v3 modules.

If total installation size is not constrained, it is recommended to use the @opentelemetry/auto-instrumentations-node bundle with @opentelemetry/sdk-node for the most seamless instrumentation experience.

Compatible with OpenTelemetry JS API and SDK 1.0+.

Installation

npm install --save @opentelemetry/instrumentation-aws-sdk

Supported Versions

  • @aws-sdk/client-* versions >=3.0.0 <4

Usage

To enable a specific instrumentation, pass it to registerInstrumentations(). This is commonly done via NodeSDK for fully setting up all OpenTelemetry SDK components:

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { AwsInstrumentation } = require('@opentelemetry/instrumentation-aws-sdk');

const sdk = new NodeSDK({
  instrumentations: [
    new AwsInstrumentation({
      // see below for available configuration
    }),
  ],
});
sdk.start();
process.once('beforeExit', async () => { await sdk.shutdown(); });
aws-sdk Instrumentation Options

aws-sdk instrumentation has few options available to choose from. You can set the following:

Options Type Description
preRequestHook AwsSdkRequestCustomAttributeFunction Hook called before request send, which allow to add custom attributes to span.
responseHook AwsSdkResponseCustomAttributeFunction Hook for adding custom attributes when response is received from aws.
exceptionHook AwsSdkExceptionCustomAttributeFunction Hook for adding custom attributes when exception is received from aws.
suppressInternalInstrumentation boolean Most aws operation use http requests under the hood. Set this to true to hide all underlying http spans.
sqsExtractContextPropagationFromPayload boolean Will parse and extract context propagation headers from SQS Payload, false by default. When should it be used?
dynamoDBStatementSerializer AwsSdkDynamoDBStatementSerializer AWS SDK instrumentation will serialize DynamoDB commands to the db.statement attribute using the specified function. Defaults to using a serializer that returns undefined.

Span Attributes

The instrumentations are collecting the following attributes:

Attribute Name Type Description Example
rpc.system string Always equals "aws-api"
rpc.method string The name of the operation corresponding to the request, as returned by the AWS SDK. If the SDK does not provide a way to retrieve a name, the name of the command SHOULD be used, removing the suffix Command if present, resulting in a PascalCase name with no spaces. PutObject
rpc.service string The name of the service to which a request is made, as returned by the AWS SDK. If the SDK does not provide a away to retrieve a name, the name of the SDK's client interface for a service SHOULD be used, removing the suffix Client if present, resulting in a PascalCase name with no spaces. S3, DynamoDB, Route53
cloud.region string Region name for the request "eu-west-1"
Custom User Attributes

The instrumentation user can configure a preRequestHook function which will be called before each request, with a normalized request object and the corresponding span. This hook can be used to add custom attributes to the span with any logic. For example, user can add interesting attributes from the request.params, and write custom logic based on the service and operation. Usage example:

awsInstrumentationConfig = {
  preRequestHook: (span, request) => {
    if (span.serviceName === 's3') {
      span.setAttribute('s3.bucket.name', request.commandInput['Bucket']);
    }
  },
};
Specific Service Logic

AWS contains dozens of services accessible with the JS SDK. For many services, the default attributes specified above are enough, but other services have specific trace semantic conventions, or need to inject/extract intra-process context, or set intra-process context correctly.

Specific service logic currently implemented for:

Potential Side Effects

The instrumentation is doing best effort to support the trace specification of OpenTelemetry. For SQS, it involves defining new attributes on the Messages array, as well as on the manipulated types generated from this array (to set correct trace context for a single SQS message operation). Those properties are defined as non-enumerable properties, so they have minimum side effect on the app. They will, however, show when using the Object.getOwnPropertyDescriptors and Reflect.ownKeys functions on SQS Messages array and for each Message in the array.

Semantic Conventions

The instrumentation-aws-sdk versions 0.75.0 and later emit the stable semantic conventions.

Attributes collected (this list is currently not exhaustive):

Attribute Short Description Service
http.response.status_code HTTP response status code.
rpc.method The name of the (logical) method being called.
rpc.service The full (logical) name of the service being called.
rpc.system A string identifying the remoting system.
cloud.region The AWS Region where the requested service is being accessed.
aws.dynamodb.attribute_definitions The JSON-serialized value of each item in the AttributeDefinitions request field. dynamodb
aws.dynamodb.consistent_read The value of the ConsistentRead request parameter. dynamodb
aws.dynamodb.consumed_capacity The JSON-serialized value of each item in the ConsumedCapacity response field. dynamodb
aws.dynamodb.count The value of the Count response parameter. dynamodb
aws.dynamodb.exclusive_start_table The value of the ExclusiveStartTableName request parameter. dynamodb
aws.dynamodb.global_secondary_index_updates The JSON-serialized value of each item in the GlobalSecondaryIndexUpdates request field. dynamodb
aws.dynamodb.global_secondary_indexes The JSON-serialized value of each item of the GlobalSecondaryIndexes request field. dynamodb
aws.dynamodb.index_name The value of the IndexName request parameter. dynamodb
aws.dynamodb.item_collection_metrics The JSON-serialized value of the ItemCollectionMetrics response field. dynamodb
aws.dynamodb.limit The value of the Limit request parameter. dynamodb
aws.dynamodb.local_secondary_indexes The JSON-serialized value of each item of the LocalSecondaryIndexes request field. dynamodb
aws.dynamodb.projection The value of the ProjectionExpression request parameter. dynamodb
aws.dynamodb.provisioned_read_capacity The value of the ProvisionedThroughput.ReadCapacityUnits request parameter. dynamodb
aws.dynamodb.provisioned_write_capacity The value of the ProvisionedThroughput.WriteCapacityUnits request parameter. dynamodb
aws.dynamodb.scan_forward The value of the ScanIndexForward request parameter. dynamodb
aws.dynamodb.scanned_count The value of the ScannedCount response parameter. dynamodb
aws.dynamodb.segment The value of the Segment request parameter. dynamodb
aws.dynamodb.select The value of the Select request parameter. dynamodb
aws.dynamodb.table_count The number of items in the TableNames response parameter. dynamodb
aws.dynamodb.table_names The keys in the RequestItems object field. dynamodb
aws.dynamodb.total_segments The value of the TotalSegments request parameter. dynamodb
db.namespace The name of the database (TableName). dynamodb
db.operation.name The name of the operation. dynamodb
db.query.text The database statement (if serializer configured). dynamodb
db.system.name Database system identifier. dynamodb
faas.execution The execution ID of the current function execution. lambda
faas.invoked_name The name of the invoked function. lambda
faas.invoked_provider The cloud provider of the invoked function. lambda
faas.invoked_region The cloud region of the invoked function. lambda
messaging.destination.name The message destination name. sns, sqs
messaging.system A string identifying the messaging system. sns, sqs
messaging.operation.type A string identifying the kind of message consumption. sqs
messaging.message.id A value used by the messaging system as an identifier for the message. sqs
url.full The connection string. sqs

License

Apache 2.0 - See LICENSE for more information.

Keywords