From 8183f67151e9fd2c611a3b0b3cda35e397102f53 Mon Sep 17 00:00:00 2001 From: "marc.pichler" Date: Mon, 24 Jan 2022 16:42:21 +0100 Subject: [PATCH 1/3] feat(views): add FilteringAttributesProcessor --- .../src/view/AttributesProcessor.ts | 20 ++++++++++++++++ .../test/view/AttributesProcessor.test.ts | 23 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts index 5ed8d2c0ab5..57b3259811d 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts @@ -43,4 +43,24 @@ export class NoopAttributesProcessor extends AttributesProcessor { } } +/** + * {@link AttributesProcessor} that filters by allowed attribute names and drops any names that are not in the + * allow list. + */ +export class FilteringAttributesProcessor extends AttributesProcessor { + constructor(private _allowedAttributeNames: string[]) { + super(); + } + + process(incoming: Attributes, _context:Context): Attributes { + const filteredAttributes: Attributes = {}; + for(const allowedAttributeName of this._allowedAttributeNames){ + if(allowedAttributeName in incoming){ + filteredAttributes[allowedAttributeName] = incoming[allowedAttributeName]; + } + } + return filteredAttributes; + } +} + const NOOP = new NoopAttributesProcessor; diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/test/view/AttributesProcessor.test.ts b/experimental/packages/opentelemetry-sdk-metrics-base/test/view/AttributesProcessor.test.ts index fd7ea105fb8..1a0db429e5f 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/test/view/AttributesProcessor.test.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/test/view/AttributesProcessor.test.ts @@ -17,6 +17,7 @@ import * as assert from 'assert'; import { context } from '@opentelemetry/api'; import { NoopAttributesProcessor } from '../../src/view/AttributesProcessor'; +import { FilteringAttributesProcessor } from '../../src/view/AttributesProcessor'; describe('NoopAttributesProcessor', () => { const processor = new NoopAttributesProcessor(); @@ -30,3 +31,25 @@ describe('NoopAttributesProcessor', () => { ); }); }); + +describe('FilteringAttributesProcessor', () => { + it('should not add keys when attributes do not exist', () => { + const processor = new FilteringAttributesProcessor(['foo', 'bar']); + assert.deepStrictEqual( + processor.process({}, context.active()), {}); + }); + + it('should only keep allowed attributes', () => { + const processor = new FilteringAttributesProcessor(['foo', 'bar']); + assert.deepStrictEqual( + processor.process({ + foo: 'fooValue', + bar: 'barValue', + baz: 'bazValue' + }, context.active()), + { + foo: 'fooValue', + bar: 'barValue' + }); + }); +}); From f40b501717a3c7fc9bf22d560e664b643da712ff Mon Sep 17 00:00:00 2001 From: "marc.pichler" Date: Tue, 25 Jan 2022 17:05:35 +0100 Subject: [PATCH 2/3] fix(views): use hasOwnProperty over 'in' --- .../src/view/AttributesProcessor.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts index 57b3259811d..9ae24b8786e 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts @@ -52,10 +52,10 @@ export class FilteringAttributesProcessor extends AttributesProcessor { super(); } - process(incoming: Attributes, _context:Context): Attributes { + process(incoming: Attributes, _context: Context): Attributes { const filteredAttributes: Attributes = {}; - for(const allowedAttributeName of this._allowedAttributeNames){ - if(allowedAttributeName in incoming){ + for (const allowedAttributeName of this._allowedAttributeNames) { + if (Object.prototype.hasOwnProperty.call(incoming, allowedAttributeName)) { filteredAttributes[allowedAttributeName] = incoming[allowedAttributeName]; } } From 5f5f356f2949c3c0015f063b2f0c883b487c607c Mon Sep 17 00:00:00 2001 From: "marc.pichler" Date: Wed, 26 Jan 2022 10:50:44 +0100 Subject: [PATCH 3/3] fix(views): use Object.keys() and .filter() instead of loop. --- .../src/view/AttributesProcessor.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts index 9ae24b8786e..0a6aa4706eb 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/view/AttributesProcessor.ts @@ -54,11 +54,9 @@ export class FilteringAttributesProcessor extends AttributesProcessor { process(incoming: Attributes, _context: Context): Attributes { const filteredAttributes: Attributes = {}; - for (const allowedAttributeName of this._allowedAttributeNames) { - if (Object.prototype.hasOwnProperty.call(incoming, allowedAttributeName)) { - filteredAttributes[allowedAttributeName] = incoming[allowedAttributeName]; - } - } + Object.keys(incoming) + .filter(attributeName => this._allowedAttributeNames.includes(attributeName)) + .forEach(attributeName => filteredAttributes[attributeName] = incoming[attributeName]); return filteredAttributes; } }