]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/view/view_registry.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / sdk / include / opentelemetry / sdk / metrics / view / view_registry.h
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3
4 #pragma once
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"
11
12 OPENTELEMETRY_BEGIN_NAMESPACE
13 namespace sdk
14 {
15 namespace metrics
16 {
17 struct RegisteredView
18 {
19 RegisteredView(
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)}
26 {}
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_;
30 };
31
32 class ViewRegistry
33 {
34 public:
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)
38 {
39 // TBD - thread-safe ?
40
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));
44 }
45
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
50 {
51 bool found = false;
52 for (auto const &registered_view : registered_views_)
53 {
54 if (MatchMeter(registered_view->meter_selector_.get(), instrumentation_library) &&
55 MatchInstrument(registered_view->instrument_selector_.get(), instrument_descriptor))
56 {
57 found = true;
58 if (!callback(*(registered_view->view_.get())))
59 {
60 return false;
61 }
62 }
63 }
64 // return default view if none found;
65 if (!found)
66 {
67 static View view("otel-default-view");
68 if (!callback(view))
69 {
70 return false;
71 }
72 }
73 return true;
74 }
75
76 ~ViewRegistry() = default;
77
78 private:
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)
83 {
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()));
89 }
90
91 static bool MatchInstrument(
92 opentelemetry::sdk::metrics::InstrumentSelector *selector,
93 const opentelemetry::sdk::metrics::InstrumentDescriptor &instrument_descriptor)
94 {
95 return selector->GetNameFilter()->Match(instrument_descriptor.name_) &&
96 (selector->GetInstrumentType() == instrument_descriptor.type_);
97 }
98 };
99 }; // namespace metrics
100 } // namespace sdk
101 OPENTELEMETRY_END_NAMESPACE
102 #endif