-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[OTel] Experimental API for metrics (grpc#35348)
Provide a public experimental API and bazel compatible build target for OpenTelemetry metrics. Details - * New `OpenTelemetryPluginBuilder` class that provides the API specified in https://github.com/grpc/proposal/blob/master/A66-otel-stats.md * The existing `grpc::internal::OpenTelemetryPluginBuilder` class is moved to `grpc::internal::OpenTelemetryPluginBuilderImpl` for disambiguation. * Renamed `OTel` in some instances to `OpenTelemetry` for consistency. Closes grpc#35348 COPYBARA_INTEGRATE_REVIEW=grpc#35348 from yashykt:OTelPublicApi e323288 PiperOrigin-RevId: 594271246
- Loading branch information
1 parent
f703530
commit c12a564
Showing
18 changed files
with
473 additions
and
264 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
// | ||
// | ||
// Copyright 2023 gRPC 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 | ||
// | ||
// http://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. | ||
// | ||
// | ||
|
||
#ifndef GRPCPP_EXT_OTEL_PLUGIN_H | ||
#define GRPCPP_EXT_OTEL_PLUGIN_H | ||
|
||
#include <grpc/support/port_platform.h> | ||
|
||
#include <stddef.h> | ||
#include <stdint.h> | ||
|
||
#include <memory> | ||
|
||
#include "absl/functional/any_invocable.h" | ||
#include "absl/strings/string_view.h" | ||
#include "opentelemetry/metrics/meter_provider.h" | ||
|
||
namespace grpc { | ||
|
||
namespace internal { | ||
class OpenTelemetryPluginBuilderImpl; | ||
} // namespace internal | ||
|
||
namespace experimental { | ||
|
||
/// The most common way to use this API is - | ||
/// | ||
/// OpenTelemetryPluginBuilder().SetMeterProvider(provider).BuildAndRegister(); | ||
/// | ||
/// The set of instruments available are - | ||
/// grpc.client.attempt.started | ||
/// grpc.client.attempt.duration | ||
/// grpc.client.attempt.sent_total_compressed_message_size | ||
/// grpc.client.attempt.rcvd_total_compressed_message_size | ||
/// grpc.server.call.started | ||
/// grpc.server.call.duration | ||
/// grpc.server.call.sent_total_compressed_message_size | ||
/// grpc.server.call.rcvd_total_compressed_message_size | ||
class OpenTelemetryPluginBuilder { | ||
public: | ||
/// Metrics | ||
static constexpr absl::string_view kClientAttemptStartedInstrumentName = | ||
"grpc.client.attempt.started"; | ||
static constexpr absl::string_view kClientAttemptDurationInstrumentName = | ||
"grpc.client.attempt.duration"; | ||
static constexpr absl::string_view | ||
kClientAttemptSentTotalCompressedMessageSizeInstrumentName = | ||
"grpc.client.attempt.sent_total_compressed_message_size"; | ||
static constexpr absl::string_view | ||
kClientAttemptRcvdTotalCompressedMessageSizeInstrumentName = | ||
"grpc.client.attempt.rcvd_total_compressed_message_size"; | ||
static constexpr absl::string_view kServerCallStartedInstrumentName = | ||
"grpc.server.call.started"; | ||
static constexpr absl::string_view kServerCallDurationInstrumentName = | ||
"grpc.server.call.duration"; | ||
static constexpr absl::string_view | ||
kServerCallSentTotalCompressedMessageSizeInstrumentName = | ||
"grpc.server.call.sent_total_compressed_message_size"; | ||
static constexpr absl::string_view | ||
kServerCallRcvdTotalCompressedMessageSizeInstrumentName = | ||
"grpc.server.call.rcvd_total_compressed_message_size"; | ||
|
||
OpenTelemetryPluginBuilder(); | ||
/// If `SetMeterProvider()` is not called, no metrics are collected. | ||
OpenTelemetryPluginBuilder& SetMeterProvider( | ||
std::shared_ptr<opentelemetry::metrics::MeterProvider> meter_provider); | ||
/// If set, \a target_attribute_filter is called per channel to decide whether | ||
/// to record the target attribute on client or to replace it with "other". | ||
/// This helps reduce the cardinality on metrics in cases where many channels | ||
/// are created with different targets in the same binary (which might happen | ||
/// for example, if the channel target string uses IP addresses directly). | ||
OpenTelemetryPluginBuilder& SetTargetAttributeFilter( | ||
absl::AnyInvocable<bool(absl::string_view /*target*/) const> | ||
target_attribute_filter); | ||
/// If set, \a generic_method_attribute_filter is called per call with a | ||
/// generic method type to decide whether to record the method name or to | ||
/// replace it with "other". Non-generic or pre-registered methods remain | ||
/// unaffected. If not set, by default, generic method names are replaced with | ||
/// "other" when recording metrics. | ||
OpenTelemetryPluginBuilder& SetGenericMethodAttributeFilter( | ||
absl::AnyInvocable<bool(absl::string_view /*generic_method*/) const> | ||
generic_method_attribute_filter); | ||
/// Registers a global plugin that acts on all channels and servers running on | ||
/// the process. | ||
void BuildAndRegisterGlobal(); | ||
|
||
private: | ||
std::unique_ptr<internal::OpenTelemetryPluginBuilderImpl> impl_; | ||
}; | ||
} // namespace experimental | ||
} // namespace grpc | ||
|
||
#endif // GRPCPP_EXT_OTEL_PLUGIN_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.