Skip to content

Commit

Permalink
Add API for adding custom metric attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
klippx committed Sep 1, 2023
1 parent 5b7f619 commit db98bf7
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ Http instrumentation has few options available to choose from. You can set the f
| [`startOutgoingSpanHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L99) | `StartOutgoingSpanCustomAttributeFunction` | Function for adding custom attributes before a span is started in outgoingRequest |
| `ignoreIncomingRequestHook` | `IgnoreIncomingRequestFunction` | Http instrumentation will not trace all incoming requests that matched with custom function |
| `ignoreOutgoingRequestHook` | `IgnoreOutgoingRequestFunction` | Http instrumentation will not trace all outgoing requests that matched with custom function |
| `customMetricAttributes` | `CustomMetricAttributeFunction` | Function for adding custom metric attributes on all recorded metrics |
| [`serverName`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L101) | `string` | The primary server name of the matched virtual host. |
| [`requireParentforOutgoingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L103) | Boolean | Require that is a parent span to create new span for outgoing requests. |
| [`requireParentforIncomingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L105) | Boolean | Require that is a parent span to create new span for incoming requests. |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,10 @@ export class HttpInstrumentation extends InstrumentationBase<Http> {
};

const startTime = hrTime();
const metricAttributes =
utils.getIncomingRequestMetricAttributes(spanAttributes);
const metricAttributes: MetricAttributes = Object.assign(
utils.getIncomingRequestMetricAttributes(spanAttributes),
instrumentation._getConfig().customMetricAttributes?.()
);

const ctx = propagation.extract(ROOT_CONTEXT, headers);
const span = instrumentation._startHttpSpan(method, spanOptions, ctx);
Expand Down Expand Up @@ -658,8 +660,10 @@ export class HttpInstrumentation extends InstrumentationBase<Http> {
});

const startTime = hrTime();
const metricAttributes: MetricAttributes =
utils.getOutgoingRequestMetricAttributes(attributes);
const metricAttributes: MetricAttributes = Object.assign(
utils.getOutgoingRequestMetricAttributes(attributes),
instrumentation._getConfig().customMetricAttributes?.()
);

const spanOptions: SpanOptions = {
kind: SpanKind.CLIENT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Span, SpanAttributes } from '@opentelemetry/api';
import { MetricAttributes, Span, SpanAttributes } from '@opentelemetry/api';
import type * as http from 'http';
import type * as https from 'https';
import {
Expand Down Expand Up @@ -80,6 +80,10 @@ export interface StartOutgoingSpanCustomAttributeFunction {
(request: RequestOptions): SpanAttributes;
}

export interface CustomMetricAttributeFunction {
(): MetricAttributes;
}

/**
* Options available for the HTTP instrumentation (see [documentation](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-http#http-instrumentation-options))
*/
Expand Down Expand Up @@ -108,6 +112,8 @@ export interface HttpInstrumentationConfig extends InstrumentationConfig {
startIncomingSpanHook?: StartIncomingSpanCustomAttributeFunction;
/** Function for adding custom attributes before a span is started in outgoingRequest */
startOutgoingSpanHook?: StartOutgoingSpanCustomAttributeFunction;
/** Function for adding custom metric attributes on all recorded metrics */
customMetricAttributes?: CustomMetricAttributeFunction;
/** The primary server name of the matched virtual host. */
serverName?: string;
/** Require parent to create span for outgoing requests */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ import { HttpInstrumentation } from '../../src/http';
import { httpRequest } from '../utils/httpRequest';
import { TestMetricReader } from '../utils/TestMetricReader';

const instrumentation = new HttpInstrumentation();
const instrumentation = new HttpInstrumentation({
customMetricAttributes: () => {
return {
foo: 'bar',
};
},
});

instrumentation.enable();
instrumentation.disable();

Expand Down Expand Up @@ -115,6 +122,8 @@ describe('metrics', () => {
metrics[0].dataPoints[0].attributes[SemanticAttributes.NET_HOST_PORT],
22346
);
// Custom attributes
assert.strictEqual(metrics[0].dataPoints[0].attributes['foo'], 'bar');

assert.strictEqual(metrics[1].dataPointType, DataPointType.HISTOGRAM);
assert.strictEqual(
Expand Down Expand Up @@ -148,5 +157,7 @@ describe('metrics', () => {
metrics[1].dataPoints[0].attributes[SemanticAttributes.HTTP_FLAVOR],
'1.1'
);
// Custom attributes
assert.strictEqual(metrics[1].dataPoints[0].attributes['foo'], 'bar');
});
});

0 comments on commit db98bf7

Please sign in to comment.