Skip to content

Bug: empty segment name when chaining decorators #1093

Closed
@misterjoshua

Description

@misterjoshua

Bug description

I wanted to capture all the retries of a method that uses a decorator to implement async retries. #1084 (comment) However, when the tracer tries to determine the segment name, it doesn't find the name of the original method.

Expected Behavior

I expected the segment name to use the original method name.

Current Behavior

It uses the name of the other decorator's anonymous function instead of the original method's function. An anonymous function's name is empty, so the segment name is empty.

Possible Solution

Use String(_propertyKey) instead of originalMethod.name here: https://github.com/awslabs/aws-lambda-powertools-typescript/blob/06fbaae4db3825557aa84d40372a53422e42840d/packages/tracer/src/Tracer.ts#L437

Steps to Reproduce

const tracer = new Tracer();

function passThrough() {
  // A decorator that calls the original method.
  return (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) => {
    const originalMethod = descriptor.value!;
    descriptor.value = function (...args: unknown[]) {
      return originalMethod.apply(this, [...args]);
    };
  };
}

class MyClass {
  @tracer.captureMethod()
  @passThrough()
  async doSomething(): Promise<string> {
    return 'foo';
  }
}

const myClass = new MyClass();
await myClass.doSomething();

// Segment name will be "### "

Environment

  • Powertools version used: 1.2.1
  • Packaging format (Layers, npm): npm
  • AWS Lambda function runtime: node 16
  • Debugging logs:

Related issues, RFCs

None

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingcompletedThis item is complete and has been merged/shippedtracerThis item relates to the Tracer Utility

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions