1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
5 #ifndef ENABLE_METRICS_PREVIEW
6 # include <unordered_map>
7 # include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h"
8 # include "opentelemetry/sdk/metrics/view/instrument_selector.h"
9 # include "opentelemetry/sdk/metrics/view/meter_selector.h"
10 # include "opentelemetry/sdk/metrics/view/view.h"
12 OPENTELEMETRY_BEGIN_NAMESPACE
20 std::unique_ptr
<opentelemetry::sdk::metrics::InstrumentSelector
> instrument_selector
,
21 std::unique_ptr
<opentelemetry::sdk::metrics::MeterSelector
> meter_selector
,
22 std::unique_ptr
<opentelemetry::sdk::metrics::View
> view
)
23 : instrument_selector_
{std::move(instrument_selector
)},
24 meter_selector_
{std::move(meter_selector
)},
25 view_
{std::move(view
)}
27 std::unique_ptr
<opentelemetry::sdk::metrics::InstrumentSelector
> instrument_selector_
;
28 std::unique_ptr
<opentelemetry::sdk::metrics::MeterSelector
> meter_selector_
;
29 std::unique_ptr
<opentelemetry::sdk::metrics::View
> view_
;
35 void AddView(std::unique_ptr
<opentelemetry::sdk::metrics::InstrumentSelector
> instrument_selector
,
36 std::unique_ptr
<opentelemetry::sdk::metrics::MeterSelector
> meter_selector
,
37 std::unique_ptr
<opentelemetry::sdk::metrics::View
> view
)
39 // TBD - thread-safe ?
41 auto registered_view
= std::unique_ptr
<RegisteredView
>(new RegisteredView
{
42 std::move(instrument_selector
), std::move(meter_selector
), std::move(view
)});
43 registered_views_
.push_back(std::move(registered_view
));
46 bool FindViews(const opentelemetry::sdk::metrics::InstrumentDescriptor
&instrument_descriptor
,
47 const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary
48 &instrumentation_library
,
49 nostd::function_ref
<bool(const View
&)> callback
) const
52 for (auto const ®istered_view
: registered_views_
)
54 if (MatchMeter(registered_view
->meter_selector_
.get(), instrumentation_library
) &&
55 MatchInstrument(registered_view
->instrument_selector_
.get(), instrument_descriptor
))
58 if (!callback(*(registered_view
->view_
.get())))
64 // return default view if none found;
67 static View
view("otel-default-view");
76 ~ViewRegistry() = default;
79 std::vector
<std::unique_ptr
<RegisteredView
>> registered_views_
;
80 static bool MatchMeter(opentelemetry::sdk::metrics::MeterSelector
*selector
,
81 const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary
82 &instrumentation_library
)
84 return selector
->GetNameFilter()->Match(instrumentation_library
.GetName()) &&
85 (instrumentation_library
.GetVersion().size() == 0 ||
86 selector
->GetVersionFilter()->Match(instrumentation_library
.GetVersion())) &&
87 (instrumentation_library
.GetSchemaURL().size() == 0 ||
88 selector
->GetSchemaFilter()->Match(instrumentation_library
.GetSchemaURL()));
91 static bool MatchInstrument(
92 opentelemetry::sdk::metrics::InstrumentSelector
*selector
,
93 const opentelemetry::sdk::metrics::InstrumentDescriptor
&instrument_descriptor
)
95 return selector
->GetNameFilter()->Match(instrument_descriptor
.name_
) &&
96 (selector
->GetInstrumentType() == instrument_descriptor
.type_
);
99 }; // namespace metrics
101 OPENTELEMETRY_END_NAMESPACE