|
|
|
@ -86,7 +86,7 @@ absl::flat_hash_set<std::string> BaseMetrics() { |
|
|
|
|
} |
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
class OpenTelemetryPlugin::NPCMetricsKeyValueIterable |
|
|
|
|
class OpenTelemetryPluginImpl::NPCMetricsKeyValueIterable |
|
|
|
|
: public opentelemetry::common::KeyValueIterable { |
|
|
|
|
public: |
|
|
|
|
NPCMetricsKeyValueIterable( |
|
|
|
@ -229,10 +229,11 @@ OpenTelemetryPluginBuilderImpl::SetChannelScopeFilter( |
|
|
|
|
|
|
|
|
|
absl::Status OpenTelemetryPluginBuilderImpl::BuildAndRegisterGlobal() { |
|
|
|
|
if (meter_provider_ == nullptr) { |
|
|
|
|
return absl::OkStatus(); |
|
|
|
|
return absl::InvalidArgumentError( |
|
|
|
|
"Need to configure a valid meter provider."); |
|
|
|
|
} |
|
|
|
|
grpc_core::GlobalStatsPluginRegistry::RegisterStatsPlugin( |
|
|
|
|
std::make_shared<OpenTelemetryPlugin>( |
|
|
|
|
std::make_shared<OpenTelemetryPluginImpl>( |
|
|
|
|
metrics_, meter_provider_, std::move(target_attribute_filter_), |
|
|
|
|
std::move(generic_method_attribute_filter_), |
|
|
|
|
std::move(server_selector_), std::move(plugin_options_), |
|
|
|
@ -240,8 +241,22 @@ absl::Status OpenTelemetryPluginBuilderImpl::BuildAndRegisterGlobal() { |
|
|
|
|
return absl::OkStatus(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
OpenTelemetryPlugin::CallbackMetricReporter::CallbackMetricReporter( |
|
|
|
|
OpenTelemetryPlugin* ot_plugin, grpc_core::RegisteredMetricCallback* key) |
|
|
|
|
absl::StatusOr<std::shared_ptr<grpc::experimental::OpenTelemetryPlugin>> |
|
|
|
|
OpenTelemetryPluginBuilderImpl::Build() { |
|
|
|
|
if (meter_provider_ == nullptr) { |
|
|
|
|
return absl::InvalidArgumentError( |
|
|
|
|
"Need to configure a valid meter provider."); |
|
|
|
|
} |
|
|
|
|
return std::make_shared<OpenTelemetryPluginImpl>( |
|
|
|
|
metrics_, meter_provider_, std::move(target_attribute_filter_), |
|
|
|
|
std::move(generic_method_attribute_filter_), std::move(server_selector_), |
|
|
|
|
std::move(plugin_options_), std::move(optional_label_keys_), |
|
|
|
|
std::move(channel_scope_filter_)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
OpenTelemetryPluginImpl::CallbackMetricReporter::CallbackMetricReporter( |
|
|
|
|
OpenTelemetryPluginImpl* ot_plugin, |
|
|
|
|
grpc_core::RegisteredMetricCallback* key) |
|
|
|
|
: ot_plugin_(ot_plugin), key_(key) { |
|
|
|
|
// Since we are updating the timestamp and updating the cache for all
|
|
|
|
|
// registered instruments in a RegisteredMetricCallback, we will need to
|
|
|
|
@ -275,7 +290,7 @@ OpenTelemetryPlugin::CallbackMetricReporter::CallbackMetricReporter( |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::CallbackMetricReporter::ReportInt64( |
|
|
|
|
void OpenTelemetryPluginImpl::CallbackMetricReporter::ReportInt64( |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, |
|
|
|
|
int64_t value, absl::Span<const absl::string_view> label_values, |
|
|
|
|
absl::Span<const absl::string_view> optional_values) { |
|
|
|
@ -303,7 +318,7 @@ void OpenTelemetryPlugin::CallbackMetricReporter::ReportInt64( |
|
|
|
|
cell.insert_or_assign(std::move(key), value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::CallbackMetricReporter::ReportDouble( |
|
|
|
|
void OpenTelemetryPluginImpl::CallbackMetricReporter::ReportDouble( |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, |
|
|
|
|
double value, absl::Span<const absl::string_view> label_values, |
|
|
|
|
absl::Span<const absl::string_view> optional_values) { |
|
|
|
@ -331,7 +346,12 @@ void OpenTelemetryPlugin::CallbackMetricReporter::ReportDouble( |
|
|
|
|
cell.insert_or_assign(std::move(key), value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
OpenTelemetryPlugin::OpenTelemetryPlugin( |
|
|
|
|
void OpenTelemetryPluginImpl::ServerBuilderOption::UpdateArguments( |
|
|
|
|
grpc::ChannelArguments* args) { |
|
|
|
|
plugin_->AddToChannelArguments(args); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
OpenTelemetryPluginImpl::OpenTelemetryPluginImpl( |
|
|
|
|
const absl::flat_hash_set<std::string>& metrics, |
|
|
|
|
opentelemetry::nostd::shared_ptr<opentelemetry::metrics::MeterProvider> |
|
|
|
|
meter_provider, |
|
|
|
@ -548,7 +568,7 @@ namespace { |
|
|
|
|
constexpr absl::string_view kLocality = "grpc.lb.locality"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
absl::string_view OpenTelemetryPlugin::OptionalLabelKeyToString( |
|
|
|
|
absl::string_view OpenTelemetryPluginImpl::OptionalLabelKeyToString( |
|
|
|
|
grpc_core::ClientCallTracer::CallAttemptTracer::OptionalLabelKey key) { |
|
|
|
|
switch (key) { |
|
|
|
|
case grpc_core::ClientCallTracer::CallAttemptTracer::OptionalLabelKey:: |
|
|
|
@ -560,7 +580,7 @@ absl::string_view OpenTelemetryPlugin::OptionalLabelKeyToString( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
absl::optional<grpc_core::ClientCallTracer::CallAttemptTracer::OptionalLabelKey> |
|
|
|
|
OpenTelemetryPlugin::OptionalLabelStringToKey(absl::string_view key) { |
|
|
|
|
OpenTelemetryPluginImpl::OptionalLabelStringToKey(absl::string_view key) { |
|
|
|
|
if (key == kLocality) { |
|
|
|
|
return grpc_core::ClientCallTracer::CallAttemptTracer::OptionalLabelKey:: |
|
|
|
|
kLocality; |
|
|
|
@ -569,7 +589,7 @@ OpenTelemetryPlugin::OptionalLabelStringToKey(absl::string_view key) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::pair<bool, std::shared_ptr<grpc_core::StatsPlugin::ScopeConfig>> |
|
|
|
|
OpenTelemetryPlugin::IsEnabledForChannel( |
|
|
|
|
OpenTelemetryPluginImpl::IsEnabledForChannel( |
|
|
|
|
const OpenTelemetryPluginBuilder::ChannelScope& scope) const { |
|
|
|
|
if (channel_scope_filter_ == nullptr || channel_scope_filter_(scope)) { |
|
|
|
|
return {true, std::make_shared<ClientScopeConfig>(this, scope)}; |
|
|
|
@ -578,7 +598,7 @@ OpenTelemetryPlugin::IsEnabledForChannel( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::pair<bool, std::shared_ptr<grpc_core::StatsPlugin::ScopeConfig>> |
|
|
|
|
OpenTelemetryPlugin::IsEnabledForServer( |
|
|
|
|
OpenTelemetryPluginImpl::IsEnabledForServer( |
|
|
|
|
const grpc_core::ChannelArgs& args) const { |
|
|
|
|
// Return true only if there is no server selector registered or if the
|
|
|
|
|
// server selector returns true.
|
|
|
|
@ -588,7 +608,21 @@ OpenTelemetryPlugin::IsEnabledForServer( |
|
|
|
|
return {false, nullptr}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::AddCounter( |
|
|
|
|
std::shared_ptr<grpc_core::StatsPlugin::ScopeConfig> |
|
|
|
|
OpenTelemetryPluginImpl::GetChannelScopeConfig( |
|
|
|
|
const OpenTelemetryPluginBuilder::ChannelScope& scope) const { |
|
|
|
|
GPR_ASSERT(channel_scope_filter_ == nullptr || channel_scope_filter_(scope)); |
|
|
|
|
return std::make_shared<ClientScopeConfig>(this, scope); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::shared_ptr<grpc_core::StatsPlugin::ScopeConfig> |
|
|
|
|
OpenTelemetryPluginImpl::GetServerScopeConfig( |
|
|
|
|
const grpc_core::ChannelArgs& args) const { |
|
|
|
|
GPR_ASSERT(server_selector_ == nullptr || server_selector_(args)); |
|
|
|
|
return std::make_shared<ServerScopeConfig>(this, args); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPluginImpl::AddCounter( |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, |
|
|
|
|
uint64_t value, absl::Span<const absl::string_view> label_values, |
|
|
|
|
absl::Span<const absl::string_view> optional_values) { |
|
|
|
@ -612,7 +646,7 @@ void OpenTelemetryPlugin::AddCounter( |
|
|
|
|
instrument_data.optional_labels_bits)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::AddCounter( |
|
|
|
|
void OpenTelemetryPluginImpl::AddCounter( |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, |
|
|
|
|
double value, absl::Span<const absl::string_view> label_values, |
|
|
|
|
absl::Span<const absl::string_view> optional_values) { |
|
|
|
@ -636,7 +670,7 @@ void OpenTelemetryPlugin::AddCounter( |
|
|
|
|
instrument_data.optional_labels_bits)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::RecordHistogram( |
|
|
|
|
void OpenTelemetryPluginImpl::RecordHistogram( |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, |
|
|
|
|
uint64_t value, absl::Span<const absl::string_view> label_values, |
|
|
|
|
absl::Span<const absl::string_view> optional_values) { |
|
|
|
@ -662,7 +696,7 @@ void OpenTelemetryPlugin::RecordHistogram( |
|
|
|
|
opentelemetry::context::Context{}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::RecordHistogram( |
|
|
|
|
void OpenTelemetryPluginImpl::RecordHistogram( |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GlobalInstrumentHandle handle, |
|
|
|
|
double value, absl::Span<const absl::string_view> label_values, |
|
|
|
|
absl::Span<const absl::string_view> optional_values) { |
|
|
|
@ -688,7 +722,7 @@ void OpenTelemetryPlugin::RecordHistogram( |
|
|
|
|
opentelemetry::context::Context{}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::AddCallback( |
|
|
|
|
void OpenTelemetryPluginImpl::AddCallback( |
|
|
|
|
grpc_core::RegisteredMetricCallback* callback) { |
|
|
|
|
std::vector< |
|
|
|
|
absl::variant<CallbackGaugeState<int64_t>*, CallbackGaugeState<double>*>> |
|
|
|
@ -764,7 +798,7 @@ void OpenTelemetryPlugin::AddCallback( |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPlugin::RemoveCallback( |
|
|
|
|
void OpenTelemetryPluginImpl::RemoveCallback( |
|
|
|
|
grpc_core::RegisteredMetricCallback* callback) { |
|
|
|
|
std::vector< |
|
|
|
|
absl::variant<CallbackGaugeState<int64_t>*, CallbackGaugeState<double>*>> |
|
|
|
@ -841,7 +875,7 @@ void OpenTelemetryPlugin::RemoveCallback( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
|
|
void OpenTelemetryPlugin::CallbackGaugeState<ValueType>::Observe( |
|
|
|
|
void OpenTelemetryPluginImpl::CallbackGaugeState<ValueType>::Observe( |
|
|
|
|
opentelemetry::metrics::ObserverResult& result, const Cache& cache) { |
|
|
|
|
const auto& descriptor = |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor({id}); |
|
|
|
@ -868,8 +902,9 @@ void OpenTelemetryPlugin::CallbackGaugeState<ValueType>::Observe( |
|
|
|
|
// OpenTelemetry calls our callback with its observable_registry's lock
|
|
|
|
|
// held.
|
|
|
|
|
template <typename ValueType> |
|
|
|
|
void OpenTelemetryPlugin::CallbackGaugeState<ValueType>::CallbackGaugeCallback( |
|
|
|
|
opentelemetry::metrics::ObserverResult result, void* arg) { |
|
|
|
|
void OpenTelemetryPluginImpl::CallbackGaugeState<ValueType>:: |
|
|
|
|
CallbackGaugeCallback(opentelemetry::metrics::ObserverResult result, |
|
|
|
|
void* arg) { |
|
|
|
|
auto* callback_gauge_state = static_cast<CallbackGaugeState<ValueType>*>(arg); |
|
|
|
|
auto now = grpc_core::Timestamp::Now(); |
|
|
|
|
grpc_core::MutexLock plugin_lock(&callback_gauge_state->ot_plugin->mu_); |
|
|
|
@ -892,32 +927,54 @@ void OpenTelemetryPlugin::CallbackGaugeState<ValueType>::CallbackGaugeCallback( |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_core::ClientCallTracer* OpenTelemetryPlugin::GetClientCallTracer( |
|
|
|
|
grpc_core::ClientCallTracer* OpenTelemetryPluginImpl::GetClientCallTracer( |
|
|
|
|
const grpc_core::Slice& path, bool registered_method, |
|
|
|
|
std::shared_ptr<grpc_core::StatsPlugin::ScopeConfig> scope_config) { |
|
|
|
|
return grpc_core::GetContext<grpc_core::Arena>() |
|
|
|
|
->ManagedNew<ClientCallTracer>( |
|
|
|
|
path, grpc_core::GetContext<grpc_core::Arena>(), registered_method, |
|
|
|
|
this, |
|
|
|
|
std::static_pointer_cast<OpenTelemetryPlugin::ClientScopeConfig>( |
|
|
|
|
std::static_pointer_cast<OpenTelemetryPluginImpl::ClientScopeConfig>( |
|
|
|
|
scope_config)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_core::ServerCallTracer* OpenTelemetryPlugin::GetServerCallTracer( |
|
|
|
|
grpc_core::ServerCallTracer* OpenTelemetryPluginImpl::GetServerCallTracer( |
|
|
|
|
std::shared_ptr<grpc_core::StatsPlugin::ScopeConfig> scope_config) { |
|
|
|
|
return grpc_core::GetContext<grpc_core::Arena>() |
|
|
|
|
->ManagedNew<ServerCallTracer>( |
|
|
|
|
this, |
|
|
|
|
std::static_pointer_cast<OpenTelemetryPlugin::ServerScopeConfig>( |
|
|
|
|
std::static_pointer_cast<OpenTelemetryPluginImpl::ServerScopeConfig>( |
|
|
|
|
scope_config)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool OpenTelemetryPlugin::IsInstrumentEnabled( |
|
|
|
|
bool OpenTelemetryPluginImpl::IsInstrumentEnabled( |
|
|
|
|
grpc_core::GlobalInstrumentsRegistry::GlobalInstrumentHandle handle) const { |
|
|
|
|
return !absl::holds_alternative<Disabled>( |
|
|
|
|
instruments_data_.at(handle.index).instrument); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPluginImpl::AddToChannelArguments( |
|
|
|
|
grpc::ChannelArguments* args) { |
|
|
|
|
const grpc_channel_args c_args = args->c_channel_args(); |
|
|
|
|
auto* stats_plugin_list = grpc_channel_args_find_pointer< |
|
|
|
|
std::shared_ptr<std::vector<std::shared_ptr<grpc_core::StatsPlugin>>>>( |
|
|
|
|
&c_args, GRPC_ARG_EXPERIMENTAL_STATS_PLUGINS); |
|
|
|
|
if (stats_plugin_list != nullptr) { |
|
|
|
|
(*stats_plugin_list)->emplace_back(shared_from_this()); |
|
|
|
|
} else { |
|
|
|
|
auto stats_plugin_list = std::make_shared< |
|
|
|
|
std::vector<std::shared_ptr<grpc_core::StatsPlugin>>>(); |
|
|
|
|
args->SetPointerWithVtable( |
|
|
|
|
GRPC_ARG_EXPERIMENTAL_STATS_PLUGINS, &stats_plugin_list, |
|
|
|
|
grpc_core::ChannelArgTypeTraits<decltype(stats_plugin_list)>::VTable()); |
|
|
|
|
stats_plugin_list->emplace_back(shared_from_this()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OpenTelemetryPluginImpl::AddToServerBuilder(grpc::ServerBuilder* builder) { |
|
|
|
|
builder->SetOption(std::make_unique<ServerBuilderOption>(shared_from_this())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace internal
|
|
|
|
|
|
|
|
|
|
constexpr absl::string_view |
|
|
|
@ -1012,4 +1069,9 @@ absl::Status OpenTelemetryPluginBuilder::BuildAndRegisterGlobal() { |
|
|
|
|
return impl_->BuildAndRegisterGlobal(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
absl::StatusOr<std::shared_ptr<grpc::experimental::OpenTelemetryPlugin>> |
|
|
|
|
OpenTelemetryPluginBuilder::Build() { |
|
|
|
|
return impl_->Build(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace grpc
|
|
|
|
|