Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ extensions/filters/common/original_src @klarose @mattklein123
/*/extensions/tracers/skywalking @wbpcode @Shikugawa
# tracers.opentelemetry extension
/*/extensions/tracers/opentelemetry @alexanderellis @yanavlasov
# OpenTelemetry common extensions
/*/extensions/common/opentelemetry @kyessenov @mmorel-35
# tracers.fluentd extension
/*/extensions/common/fluentd @kevintan250 @yanavlasov
/*/extensions/tracers/fluentd @kevintan250 @yanavlasov
Expand Down
4 changes: 4 additions & 0 deletions changelogs/current.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ behavior_changes:
minor_behavior_changes:
# *Changes that may cause incompatibilities for some users, but should not for most*
- area: opentelemetry
change: |
Refactored shared OpenTelemetry OTLP code into ``source/extensions/common/opentelemetry/``,
consolidating exporter utilities, constants, and include paths. No functional behavior changes.
- area: load_balancing
change: |
Changed the default behavior of ``OrcaWeightManager`` to prefer named metrics over application
Expand Down
5 changes: 4 additions & 1 deletion source/extensions/access_loggers/open_telemetry/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ envoy_cc_library(
"//source/common/tracing:custom_tag_lib",
"//source/common/tracing:http_tracer_lib",
"//source/common/tracing:trace_context_lib",
"//source/common/version:version_lib",
"//source/extensions/common/opentelemetry/exporters/otlp:environment_lib",
"//source/extensions/common/opentelemetry/exporters/otlp:populate_attribute_utils_lib",
"@abseil-cpp//absl/strings",
"@envoy_api//envoy/data/accesslog/v3:pkg_cc_proto",
"@envoy_api//envoy/extensions/access_loggers/open_telemetry/v3:pkg_cc_proto",
Expand All @@ -52,6 +53,7 @@ envoy_cc_library(
"//source/common/protobuf",
"//source/extensions/access_loggers/common:grpc_access_logger",
"//source/extensions/access_loggers/common:grpc_access_logger_clients_lib",
"//source/extensions/common/opentelemetry/sdk/logs:constants_lib",
"//source/extensions/tracers/opentelemetry/resource_detectors:resource_detector_lib",
"@envoy_api//envoy/extensions/access_loggers/grpc/v3:pkg_cc_proto",
"@envoy_api//envoy/extensions/access_loggers/open_telemetry/v3:pkg_cc_proto",
Expand Down Expand Up @@ -123,6 +125,7 @@ envoy_cc_library(
deps = [
"//source/common/common:assert_lib",
"//source/common/protobuf",
"//source/extensions/common/opentelemetry/sdk/logs:constants_lib",
],
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
#include "source/common/common/assert.h"
#include "source/common/common/fmt.h"
#include "source/common/protobuf/protobuf.h"
#include "source/extensions/common/opentelemetry/sdk/logs/constants.h"

namespace Envoy {
namespace Extensions {
namespace AccessLoggers {
namespace OpenTelemetry {

void validateProtoDescriptors() {
const auto method = "opentelemetry.proto.collector.logs.v1.LogsService.Export";
const auto method =
std::string(Envoy::Extensions::OpenTelemetry::Sdk::Logs::Constants::kLogsServiceExportMethod);

RELEASE_ASSERT(Protobuf::DescriptorPool::generated_pool()->FindMethodByName(method) != nullptr,
"");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "source/common/protobuf/utility.h"
#include "source/extensions/access_loggers/common/grpc_access_logger_clients.h"
#include "source/extensions/access_loggers/open_telemetry/otlp_log_utils.h"
#include "source/extensions/common/opentelemetry/sdk/logs/constants.h"

#include "opentelemetry/proto/collector/logs/v1/logs_service.pb.h"
#include "opentelemetry/proto/common/v1/common.pb.h"
Expand Down Expand Up @@ -37,7 +38,8 @@ GrpcAccessLoggerImpl::GrpcAccessLoggerImpl(
ExportLogsServiceResponse>>(
client,
*Protobuf::DescriptorPool::generated_pool()->FindMethodByName(
"opentelemetry.proto.collector.logs.v1.LogsService.Export"),
std::string(Envoy::Extensions::OpenTelemetry::Sdk::Logs::Constants::
kLogsServiceExportMethod)),
GrpcCommon::optionalRetryPolicy(config.common_config()), genOTelCallbacksFactory())),
stats_({ALL_GRPC_ACCESS_LOGGER_STATS(POOL_COUNTER_PREFIX(
scope, absl::StrCat(OtlpAccessLogStatsPrefix, config.stat_prefix())))}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ void HttpAccessLoggerImpl::flush() {
message->headers().setReferenceContentType(Http::Headers::get().ContentTypeValues.Protobuf);

// User-Agent header follows the OTLP specification.
message->headers().setReferenceUserAgent(getOtlpUserAgentHeader());
message->headers().setReferenceUserAgent(
Envoy::Extensions::OpenTelemetry::Exporters::Otlp::GetUserAgent());

// Adds all custom headers to the request.
headers_applicator_->apply(message->headers());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,12 @@
#include "source/common/protobuf/utility.h"
#include "source/common/tracing/custom_tag_impl.h"
#include "source/common/tracing/http_tracer_impl.h"
#include "source/common/version/version.h"

namespace Envoy {
namespace Extensions {
namespace AccessLoggers {
namespace OpenTelemetry {

opentelemetry::proto::common::v1::KeyValue getStringKeyValue(const std::string& key,
const std::string& value) {
opentelemetry::proto::common::v1::KeyValue keyValue;
keyValue.set_key(key);
keyValue.mutable_value()->set_string_value(value);
return keyValue;
}

::opentelemetry::proto::common::v1::KeyValueList
packBody(const ::opentelemetry::proto::common::v1::AnyValue& body) {
::opentelemetry::proto::common::v1::KeyValueList output;
Expand All @@ -41,12 +32,6 @@ unpackBody(const ::opentelemetry::proto::common::v1::KeyValueList& value) {
return value.values(0).value();
}

// User-Agent header follows the OTLP specification:
// https://github.com/open-telemetry/opentelemetry-specification/blob/v1.52.0/specification/protocol/exporter.md#user-agent
const std::string& getOtlpUserAgentHeader() {
CONSTRUCT_ON_FIRST_USE(std::string, "OTel-OTLP-Exporter-Envoy/" + VersionInfo::version());
}

void populateTraceContext(opentelemetry::proto::logs::v1::LogRecord& log_entry,
const std::string& trace_id_hex, const std::string& span_id_hex) {
// Sets trace_id if available. OpenTelemetry trace_id is a 16-byte array, and backends
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

#include "source/common/common/hex.h"
#include "source/common/tracing/custom_tag_impl.h"
#include "source/extensions/common/opentelemetry/exporters/otlp/environment.h"
#include "source/extensions/common/opentelemetry/exporters/otlp/populate_attribute_utils.h"

#include "absl/strings/escaping.h"
#include "absl/strings/str_cat.h"
Expand Down Expand Up @@ -50,8 +52,11 @@ struct OtlpAccessLogStats {
};

// Creates a KeyValue protobuf with a string value.
opentelemetry::proto::common::v1::KeyValue getStringKeyValue(const std::string& key,
const std::string& value);
inline opentelemetry::proto::common::v1::KeyValue getStringKeyValue(const std::string& key,
const std::string& value) {
return ::Envoy::Extensions::OpenTelemetry::Exporters::Otlp::PopulateAttributeUtils::makeKeyValue(
key, value);
}

// Packs the body "AnyValue" to a "KeyValueList" with a single key.
::opentelemetry::proto::common::v1::KeyValueList
Expand All @@ -62,7 +67,9 @@ ::opentelemetry::proto::common::v1::AnyValue
unpackBody(const ::opentelemetry::proto::common::v1::KeyValueList& value);

// User-Agent header per OTLP specification.
const std::string& getOtlpUserAgentHeader();
inline const std::string& getOtlpUserAgentHeader() {
return ::Envoy::Extensions::OpenTelemetry::Exporters::Otlp::GetUserAgent();
}

// Populates trace context (trace_id, span_id) on a LogRecord.
// Handles 128-bit (32 hex chars) and 64-bit Zipkin-style (16 hex chars) trace IDs.
Expand Down
24 changes: 24 additions & 0 deletions source/extensions/common/opentelemetry/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_library",
"envoy_extension_package",
)

licenses(["notice"]) # Apache 2

envoy_extension_package()

envoy_cc_library(
name = "types_lib",
hdrs = ["types.h"],
copts = [
# Make sure that headers included from opentelemetry-api use Abseil from Envoy
# https://github.com/open-telemetry/opentelemetry-cpp/blob/v1.14.0/api/BUILD#L32
"-DHAVE_ABSEIL",
],
deps = [
"//source/extensions/common/opentelemetry/sdk/common:sdk_common_types_lib",
"@opentelemetry-proto//:common_proto_cc",
"@opentelemetry-proto//:trace_proto_cc",
],
)
70 changes: 70 additions & 0 deletions source/extensions/common/opentelemetry/exporters/otlp/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_library",
"envoy_extension_package",
)

licenses(["notice"]) # Apache 2

envoy_extension_package()

envoy_cc_library(
name = "environment_lib",
srcs = ["environment.cc"],
hdrs = ["environment.h"],
deps = [
"//source/common/common:macros",
"//source/common/version:version_lib",
],
)

envoy_cc_library(
name = "populate_attribute_utils_lib",
srcs = ["populate_attribute_utils.cc"],
hdrs = ["populate_attribute_utils.h"],
copts = [
# Make sure that headers included from opentelemetry-api use Abseil from Envoy
# https://github.com/open-telemetry/opentelemetry-cpp/blob/v1.14.0/api/BUILD#L32
"-DHAVE_ABSEIL",
],
deps = [
"//source/common/common:assert_lib",
"//source/extensions/common/opentelemetry:types_lib",
"@opentelemetry-cpp//api",
],
)

envoy_cc_library(
name = "trace_exporter_lib",
srcs = [
"grpc_trace_exporter.cc",
"http_trace_exporter.cc",
],
hdrs = [
"grpc_trace_exporter.h",
"http_trace_exporter.h",
"trace_exporter.h",
],
deps = [
"//envoy/grpc:async_client_manager_interface",
"//envoy/server:factory_context_interface",
"//envoy/upstream:cluster_manager_interface",
"//source/common/grpc:typed_async_client_lib",
"//source/common/http:async_client_utility_lib",
"//source/common/http:header_map_lib",
"//source/common/http:http_service_headers_lib",
"//source/common/http:message_lib",
"//source/common/http:utility_lib",
"//source/common/protobuf",
"//source/common/tracing:trace_context_lib",
"//source/common/version:version_lib",
"//source/extensions/common/opentelemetry/exporters/otlp:environment_lib",
"//source/extensions/common/opentelemetry/exporters/otlp:populate_attribute_utils_lib",
"//source/extensions/common/opentelemetry/sdk/trace:constants_lib",
"//source/server:generic_factory_context_lib",
"@envoy_api//envoy/config/core/v3:pkg_cc_proto",
"@opentelemetry-cpp//api",
"@opentelemetry-proto//:trace_proto_cc",
"@opentelemetry-proto//:trace_service_proto_cc",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include "source/extensions/common/opentelemetry/exporters/otlp/environment.h"

#include "source/common/common/macros.h"
#include "source/common/version/version.h"

namespace Envoy {
namespace Extensions {
namespace OpenTelemetry {
namespace Exporters {
namespace Otlp {

const std::string& GetUserAgent() {
CONSTRUCT_ON_FIRST_USE(std::string, "OTel-OTLP-Exporter-Envoy/" + VersionInfo::version());
}

} // namespace Otlp
} // namespace Exporters
} // namespace OpenTelemetry
} // namespace Extensions
} // namespace Envoy
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once

#include <string>

namespace Envoy {
namespace Extensions {
namespace OpenTelemetry {
namespace Exporters {
namespace Otlp {

// Returns the User-Agent header value to use on OTLP exporter requests.
// The value is compliant with the OpenTelemetry specification:
// https://github.com/open-telemetry/opentelemetry-specification/blob/v1.30.0/specification/protocol/exporter.md#user-agent
const std::string& GetUserAgent();

} // namespace Otlp
} // namespace Exporters
} // namespace OpenTelemetry
} // namespace Extensions
} // namespace Envoy
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#include "source/extensions/common/opentelemetry/exporters/otlp/grpc_trace_exporter.h"

#include "source/common/common/logger.h"
#include "source/common/grpc/status.h"
#include "source/extensions/common/opentelemetry/exporters/otlp/environment.h"
#include "source/extensions/common/opentelemetry/sdk/trace/constants.h"

namespace Envoy {
namespace Extensions {
namespace OpenTelemetry {
namespace Exporters {
namespace Otlp {

OtlpGrpcTraceExporter::OtlpGrpcTraceExporter(const Grpc::RawAsyncClientSharedPtr& client)
: client_(client),
service_method_(*Protobuf::DescriptorPool::generated_pool()->FindMethodByName(std::string(
Envoy::Extensions::OpenTelemetry::Sdk::Trace::Constants::kTraceServiceExportMethod))) {}

void OtlpGrpcTraceExporter::onCreateInitialMetadata(Http::RequestHeaderMap& metadata) {
metadata.setReferenceUserAgent(GetUserAgent());
}

void OtlpGrpcTraceExporter::onSuccess(
Grpc::ResponsePtr<opentelemetry::proto::collector::trace::v1::ExportTraceServiceResponse>&&
response,
Tracing::Span&) {
if (response->has_partial_success()) {
auto msg = response->partial_success().error_message();
auto rejected_spans = response->partial_success().rejected_spans();
if (rejected_spans > 0 || !msg.empty()) {
if (msg.empty()) {
msg = "empty message";
}
ENVOY_LOG(debug, "OTLP partial success: {} ({} spans rejected)", msg, rejected_spans);
}
}
}

void OtlpGrpcTraceExporter::onFailure(Grpc::Status::GrpcStatus status, const std::string& message,
Tracing::Span&) {
ENVOY_LOG(debug, "OTLP trace export failed with status: {}, message: {}",
Grpc::Utility::grpcStatusToString(status), message);
}

bool OtlpGrpcTraceExporter::log(
const opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest& request) {
client_->send(service_method_, request, *this, Tracing::NullSpan::instance(),
Http::AsyncClient::RequestOptions());
OtlpTraceExporter::logExportedSpans(request);
return true;
}

} // namespace Otlp
} // namespace Exporters
} // namespace OpenTelemetry
} // namespace Extensions
} // namespace Envoy
Loading
Loading