opentelemetry-js/packages/sdk-metrics/test/export/MetricReader.test.ts

148 lines
4.7 KiB
TypeScript

/*
* Copyright The OpenTelemetry Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as assert from 'assert';
import * as sinon from 'sinon';
import { MeterProvider } from '../../src/MeterProvider';
import { assertRejects } from '../test-utils';
import { emptyResourceMetrics, TestMetricProducer } from './TestMetricProducer';
import { TestMetricReader } from './TestMetricReader';
import { Aggregation, AggregationTemporality } from '../../src';
import {
DEFAULT_AGGREGATION_SELECTOR,
DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR,
} from '../../src/export/AggregationSelector';
import {
assertAggregationSelector,
assertAggregationTemporalitySelector,
} from './utils';
describe('MetricReader', () => {
describe('setMetricProducer', () => {
it('The SDK MUST NOT allow a MetricReader instance to be registered on more than one MeterProvider instance', () => {
const reader = new TestMetricReader();
const meterProvider1 = new MeterProvider();
const meterProvider2 = new MeterProvider();
meterProvider1.addMetricReader(reader);
assert.throws(
() => meterProvider1.addMetricReader(reader),
/MetricReader can not be bound to a MeterProvider again/
);
assert.throws(
() => meterProvider2.addMetricReader(reader),
/MetricReader can not be bound to a MeterProvider again/
);
});
});
describe('setMetricProducer', () => {
it('should initialize the metric reader', async () => {
const reader = new TestMetricReader();
reader.setMetricProducer(new TestMetricProducer());
const result = await reader.collect();
assert.deepStrictEqual(result, {
resourceMetrics: emptyResourceMetrics,
errors: [],
});
await reader.shutdown();
});
});
describe('collect', () => {
it('should throw on non-initialized instance', async () => {
const reader = new TestMetricReader();
await assertRejects(
() => reader.collect(),
/MetricReader is not bound to a MetricProducer/
);
});
it('should return empty on shut-down instance', async () => {
const reader = new TestMetricReader();
reader.setMetricProducer(new TestMetricProducer());
await reader.shutdown();
assertRejects(reader.collect(), /MetricReader is shutdown/);
});
it('should call MetricProduce.collect with timeout', async () => {
const reader = new TestMetricReader();
const producer = new TestMetricProducer();
reader.setMetricProducer(producer);
const collectStub = sinon.stub(producer, 'collect');
await reader.collect({ timeoutMillis: 20 });
assert(collectStub.calledOnce);
const args = collectStub.args[0];
assert.deepStrictEqual(args, [{ timeoutMillis: 20 }]);
await reader.shutdown();
});
});
describe('selectAggregation', () => {
it('should override default when not provided with a selector', () => {
assertAggregationSelector(
new TestMetricReader(),
DEFAULT_AGGREGATION_SELECTOR
);
assertAggregationSelector(
new TestMetricReader({}),
DEFAULT_AGGREGATION_SELECTOR
);
});
it('should override default when provided with a selector', () => {
const reader = new TestMetricReader({
aggregationSelector: _instrumentType => Aggregation.Sum(),
});
assertAggregationSelector(reader, _instrumentType => Aggregation.Sum());
reader.shutdown();
});
});
describe('selectAggregationTemporality', () => {
it('should override default when not provided with a selector', () => {
assertAggregationTemporalitySelector(
new TestMetricReader(),
DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR
);
assertAggregationTemporalitySelector(
new TestMetricReader({}),
DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR
);
});
it('should override default when provided with a selector', () => {
const reader = new TestMetricReader({
aggregationTemporalitySelector: _instrumentType =>
AggregationTemporality.DELTA,
});
assertAggregationTemporalitySelector(
reader,
_instrumentType => AggregationTemporality.DELTA
);
reader.shutdown();
});
});
});