Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SetBaggageItem not working as expected #4707

Open
andrezszambrano opened this issue Sep 19, 2024 · 0 comments
Open

SetBaggageItem not working as expected #4707

andrezszambrano opened this issue Sep 19, 2024 · 0 comments

Comments

@andrezszambrano
Copy link

Hello. I am encountering the following situation.
My company uses nodejs v20.15.1, and ddtrace v4.17.0. I was asked to include data about the user each time I log information. So if I logger.log('message'), in Datadog the content should also have the request's user information.

To do this, I thought about setting up that data in one of the first spans, and then access that data from the logger.
So basically, I have a middleware like this, that is called before a network request:

export const jwtDatadogHook = (req: any, _res: any, next: NextFunction) => {
const scope = datadog.tracer.scope()?.active();
const ctx: SecurityContext = req.securityContext;

if (scope && ctx) {
  scope.setBaggageItem('user.accountId', ctx.accountId);
}

next();
};

...
router.use(jwtDatadogHook);
...
And then, each time I log when processing the request:

private log(level: 'BIZ' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG', payload: any, extraPayload?: any) {
const span = datadog.tracer.scope().active();
const timestamp = new Date().toISOString();
const record = {
... this.defaultPayload,
... (typeof payload === 'string' ? { message: payload } : payload),
timestamp,
level
};

if (span) {
  datadog.tracer.inject(span.context(), formats.LOG, record);
  // Add security context data from span baggage items
  const value = span.getBaggageItem('user.accountId');
  if (value !== undefined) {
    record[item] = value;
  }
}
console.log(safeStringify({ ...record, extraPayload }));
}

}

The problem is that the item is always empty. The data is never saved. Even if I add to the baggage items list, and try to get the item right away, I still get empty data.

There are a few clarifications:

  1. The reason why I am using setBaggageItem instead of setTag, is that I can actually access the baggage item after using the API. I read this issue (Support iterating over baggage items #2409) and apparently one can also access the items via field span.context()._baggageItems but it tells me there is no such attribute. It seems that its not supported in the version that I have, but that is not good practice in the first place.

  2. Another reason is that, setBaggageItem, according to the documentation, actually propagates the data across spans, and with tags that does not happen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant