|
1 | 1 | // Copyright The OpenTelemetry Authors |
2 | 2 | // SPDX-License-Identifier: Apache-2.0 |
3 | 3 |
|
| 4 | +#include <cstddef> |
4 | 5 | #include <cstdint> |
5 | 6 | #include <functional> |
6 | 7 | #include <mutex> |
|
22 | 23 | #include "opentelemetry/sdk/common/global_log_handler.h" |
23 | 24 | #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" |
24 | 25 | #include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" |
| 26 | +#include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h" |
25 | 27 | #include "opentelemetry/sdk/metrics/async_instruments.h" |
26 | 28 | #include "opentelemetry/sdk/metrics/data/metric_data.h" |
27 | 29 | #include "opentelemetry/sdk/metrics/instruments.h" |
@@ -542,14 +544,34 @@ std::unique_ptr<SyncWritableMetricStorage> Meter::RegisterSyncMetricStorage( |
542 | 544 | else |
543 | 545 | { |
544 | 546 | WarnOnDuplicateInstrument(GetInstrumentationScope(), storage_registry_, view_instr_desc); |
| 547 | + |
| 548 | + // Determine effective aggregation config with reader-level fallback |
| 549 | + const AggregationConfig *effective_config = view.GetAggregationConfig(); |
| 550 | + std::shared_ptr<AggregationConfig> reader_config; |
| 551 | + |
| 552 | + // If the view does not specify a cardinality limit, use the MetricReader-level default |
| 553 | + if (!effective_config) |
| 554 | + { |
| 555 | + auto ctx_ptr = meter_context_.lock(); |
| 556 | + if (ctx_ptr) |
| 557 | + { |
| 558 | + size_t reader_limit = ctx_ptr->GetReaderCardinalityLimit(instrument_descriptor.type_); |
| 559 | + if (reader_limit != 0) |
| 560 | + { |
| 561 | + reader_config = std::make_shared<AggregationConfig>(reader_limit); |
| 562 | + effective_config = reader_config.get(); |
| 563 | + } |
| 564 | + } |
| 565 | + } |
| 566 | + |
545 | 567 | sync_storage = std::shared_ptr<SyncMetricStorage>(new SyncMetricStorage( |
546 | 568 | view_instr_desc, view.GetAggregationType(), view.GetAttributesProcessor(), |
547 | 569 | #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW |
548 | 570 | exemplar_filter_type, |
549 | 571 | GetExemplarReservoir(view.GetAggregationType(), view.GetAggregationConfig(), |
550 | 572 | view_instr_desc), |
551 | 573 | #endif |
552 | | - view.GetAggregationConfig())); |
| 574 | + effective_config, std::move(reader_config))); |
553 | 575 | storage_registry_.insert({view_instr_desc, sync_storage}); |
554 | 576 | } |
555 | 577 | auto sync_multi_storage = static_cast<SyncMultiMetricStorage *>(storages.get()); |
@@ -615,14 +637,34 @@ std::unique_ptr<AsyncWritableMetricStorage> Meter::RegisterAsyncMetricStorage( |
615 | 637 | else |
616 | 638 | { |
617 | 639 | WarnOnDuplicateInstrument(GetInstrumentationScope(), storage_registry_, view_instr_desc); |
| 640 | + |
| 641 | + // Determine effective aggregation config with reader-level fallback |
| 642 | + const AggregationConfig *effective_config = view.GetAggregationConfig(); |
| 643 | + std::shared_ptr<AggregationConfig> reader_config; |
| 644 | + |
| 645 | + // If the view does not specify a cardinality limit, use the MetricReader-level default |
| 646 | + if (!effective_config) |
| 647 | + { |
| 648 | + auto ctx_ptr = meter_context_.lock(); |
| 649 | + if (ctx_ptr) |
| 650 | + { |
| 651 | + size_t reader_limit = ctx_ptr->GetReaderCardinalityLimit(instrument_descriptor.type_); |
| 652 | + if (reader_limit != 0) |
| 653 | + { |
| 654 | + reader_config = std::make_shared<AggregationConfig>(reader_limit); |
| 655 | + effective_config = reader_config.get(); |
| 656 | + } |
| 657 | + } |
| 658 | + } |
| 659 | + |
618 | 660 | async_storage = std::shared_ptr<AsyncMetricStorage>(new AsyncMetricStorage( |
619 | 661 | view_instr_desc, view.GetAggregationType(), |
620 | 662 | #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW |
621 | 663 | exemplar_filter_type, |
622 | 664 | GetExemplarReservoir(view.GetAggregationType(), view.GetAggregationConfig(), |
623 | 665 | view_instr_desc), |
624 | 666 | #endif |
625 | | - view.GetAggregationConfig())); |
| 667 | + effective_config, std::move(reader_config))); |
626 | 668 | storage_registry_.insert({view_instr_desc, async_storage}); |
627 | 669 | } |
628 | 670 | auto async_multi_storage = static_cast<AsyncMultiMetricStorage *>(storages.get()); |
|
0 commit comments