Skip to content

Commit 1b62c51

Browse files
feat(meter): allow custom batcher #932 (#933)
Co-authored-by: Mayur Kale <[email protected]>
1 parent 41509f0 commit 1b62c51

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

packages/opentelemetry-metrics/src/Meter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export class Meter implements types.Meter {
4343
*/
4444
constructor(config: MeterConfig = DEFAULT_CONFIG) {
4545
this._logger = config.logger || new ConsoleLogger(config.logLevel);
46-
this._batcher = new UngroupedBatcher();
46+
this._batcher = config.batcher ?? new UngroupedBatcher();
4747
this._resource = config.resource || Resource.createTelemetrySDKResource();
4848
// start the push controller
4949
const exporter = config.exporter || new NoopExporter();

packages/opentelemetry-metrics/src/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { LogLevel } from '@opentelemetry/core';
1818
import { Logger, ValueType } from '@opentelemetry/api';
1919
import { MetricExporter } from './export/types';
2020
import { Resource } from '@opentelemetry/resources';
21+
import { Batcher } from './export/Batcher';
2122

2223
/** Options needed for SDK metric creation. */
2324
export interface MetricOptions {
@@ -68,6 +69,9 @@ export interface MeterConfig {
6869

6970
/** Resource associated with metric telemetry */
7071
resource?: Resource;
72+
73+
/** Metric batcher. */
74+
batcher?: Batcher;
7175
}
7276

7377
/** Default Meter configuration. */

packages/opentelemetry-metrics/test/Meter.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
Distribution,
2727
ObserverMetric,
2828
MetricRecord,
29+
Aggregator,
2930
} from '../src';
3031
import * as types from '@opentelemetry/api';
3132
import { NoopLogger, hrTime, hrTimeToNanoseconds } from '@opentelemetry/core';
@@ -36,6 +37,7 @@ import {
3637
import { ValueType } from '@opentelemetry/api';
3738
import { Resource } from '@opentelemetry/resources';
3839
import { hashLabels } from '../src/Utils';
40+
import { Batcher } from '../src/export/Batcher';
3941

4042
describe('Meter', () => {
4143
let meter: Meter;
@@ -538,8 +540,27 @@ describe('Meter', () => {
538540
assert.strictEqual(value, 10);
539541
});
540542
});
543+
544+
it('should allow custom batcher', () => {
545+
const customMeter = new MeterProvider().getMeter('custom-batcher', '*', {
546+
batcher: new CustomBatcher(),
547+
});
548+
assert.throws(() => {
549+
const measure = customMeter.createMeasure('myMeasure');
550+
measure.bind({}).record(1);
551+
}, /aggregatorFor method not implemented/);
552+
});
541553
});
542554

555+
class CustomBatcher extends Batcher {
556+
process(record: MetricRecord): void {
557+
throw new Error('process method not implemented.');
558+
}
559+
aggregatorFor(metricKind: MetricKind): Aggregator {
560+
throw new Error('aggregatorFor method not implemented.');
561+
}
562+
}
563+
543564
function ensureMetric(metric: MetricRecord) {
544565
assert.ok(metric.aggregator instanceof ObserverAggregator);
545566
assert.ok(

0 commit comments

Comments
 (0)