SERVER-114795 Add a server parameter for compression of OTel Metrics (#44960)

GitOrigin-RevId: 27dcf18987162dea69a0a9a4f83d3a038b3cf2ae
This commit is contained in:
Cedric Sirianni 2025-12-09 12:07:26 -05:00 committed by MongoDB Bot
parent e7bd8b0308
commit 46fd0f67d1
3 changed files with 83 additions and 15 deletions

View File

@ -57,7 +57,9 @@ namespace otlp = opentelemetry::exporter::otlp;
namespace metrics_api = opentelemetry::metrics;
namespace metrics_sdk = opentelemetry::sdk::metrics;
Status initializeHttp(const std::string& name, const std::string& endpoint) {
Status initializeHttp(const std::string& name,
const std::string& endpoint,
const std::string& compression) {
LOGV2(10500901,
"Initializing OpenTelemetry metrics using HTTP exporter",
"name"_attr = name,
@ -65,6 +67,7 @@ Status initializeHttp(const std::string& name, const std::string& endpoint) {
opentelemetry::exporter::otlp::OtlpHttpMetricExporterOptions hmeOpts;
hmeOpts.url = endpoint;
hmeOpts.compression = compression;
auto exporter = otlp::OtlpHttpMetricExporterFactory::Create(hmeOpts);
@ -117,24 +120,35 @@ Status initializeFile(const std::string& name, const std::string& directory) {
return Status::OK();
}
} // namespace
Status initialize(const std::string& name) {
try {
uassert(ErrorCodes::InvalidOptions,
"featureFlagOtelMetrics must be enabled in order to export OpenTelemetry metrics",
gFeatureFlagOtelMetrics.isEnabled() ||
(gOpenTelemetryMetricsHttpEndpoint.empty() &&
gOpenTelemetryMetricsDirectory.empty()));
void validateOptions() {
uassert(
ErrorCodes::InvalidOptions,
"featureFlagOtelMetrics must be enabled in order to export OpenTelemetry metrics",
gFeatureFlagOtelMetrics.isEnabled() ||
(gOpenTelemetryMetricsHttpEndpoint.empty() && gOpenTelemetryMetricsDirectory.empty()));
uassert(ErrorCodes::InvalidOptions,
"gOpenTelemetryMetricsHttpEndpoint and gOpenTelemetryMetricsDirectory cannot be set "
"simultaneously",
gOpenTelemetryMetricsHttpEndpoint.empty() || gOpenTelemetryMetricsDirectory.empty());
uassert(ErrorCodes::InvalidOptions,
"gOpenTelemetryMetricsCompression must be either `none` or `gzip`",
gOpenTelemetryMetricsCompression == "none" ||
gOpenTelemetryMetricsCompression == "gzip");
uassert(ErrorCodes::InvalidOptions,
"gOpenTelemetryMetricsCompression must be `none` for metrics file exporter",
gOpenTelemetryMetricsDirectory.empty() || gOpenTelemetryMetricsCompression == "none");
}
} // namespace
Status initialize(const std::string& name) {
try {
validateOptions();
if (!gOpenTelemetryMetricsHttpEndpoint.empty()) {
return initializeHttp(name, gOpenTelemetryMetricsHttpEndpoint);
return initializeHttp(
name, gOpenTelemetryMetricsHttpEndpoint, gOpenTelemetryMetricsCompression);
} else if (!gOpenTelemetryMetricsDirectory.empty()) {
return initializeFile(name, gOpenTelemetryMetricsDirectory);
}

View File

@ -135,6 +135,55 @@ TEST_F(OtelMetricsInitializationTest, FeatureFlagDisabledHttpSet) {
ASSERT_TRUE(isNoop(provider.get()));
}
TEST_F(OtelMetricsInitializationTest, InvalidCompressionParam) {
{
RAIIServerParameterControllerForTest httpParam{"openTelemetryMetricsHttpEndpoint",
"http://localhost:4318/v1/traces"};
RAIIServerParameterControllerForTest compressionParam{"openTelemetryMetricsCompression",
"foo"};
ASSERT_EQ(metrics::initialize("mongod").code(), ErrorCodes::InvalidOptions);
auto provider = opentelemetry::metrics::Provider::GetMeterProvider();
ASSERT_TRUE(isNoop(provider.get()));
}
RAIIServerParameterControllerForTest directoryParam{"openTelemetryMetricsDirectory", "/tmp/"};
for (const auto& value : {"gzip", "foo"}) {
RAIIServerParameterControllerForTest compressionParam{"openTelemetryMetricsCompression",
value};
ASSERT_EQ(metrics::initialize("mongod").code(), ErrorCodes::InvalidOptions);
auto provider = opentelemetry::metrics::Provider::GetMeterProvider();
ASSERT_TRUE(isNoop(provider.get()));
}
}
TEST_F(OtelMetricsInitializationTest, ValidCompressionParam) {
{
RAIIServerParameterControllerForTest httpParam{"openTelemetryMetricsHttpEndpoint",
"http://localhost:4318/v1/traces"};
for (const auto& value : {"gzip", "none"}) {
RAIIServerParameterControllerForTest compressionParam{"openTelemetryMetricsCompression",
value};
ASSERT_OK(metrics::initialize("mongod"));
auto provider = opentelemetry::metrics::Provider::GetMeterProvider();
ASSERT_FALSE(isNoop(provider.get()));
ASSERT_NOT_EQUALS(provider.get(), nullptr);
metrics::shutdown();
}
}
RAIIServerParameterControllerForTest directoryParam{"openTelemetryMetricsDirectory", "/tmp/"};
RAIIServerParameterControllerForTest compressionParam{"openTelemetryMetricsCompression",
"none"};
ASSERT_OK(metrics::initialize("mongod"));
auto provider = opentelemetry::metrics::Provider::GetMeterProvider();
ASSERT_FALSE(isNoop(provider.get()));
ASSERT_NOT_EQUALS(provider.get(), nullptr);
metrics::shutdown();
}
} // namespace
} // namespace otel
} // namespace mongo

View File

@ -46,7 +46,13 @@ server_parameters:
cpp_varname: gOpenTelemetryMetricsHttpEndpoint
cpp_vartype: std::string
redact: false
openTelemetryMetricsCompression:
description: Compression type for exporting OTel metrics. Valid options are ["none", "gzip"]. Default is "none".
set_at: startup
cpp_varname: gOpenTelemetryMetricsCompression
cpp_vartype: std::string
redact: false
default: none
openTelemetryExportIntervalMillis:
description: The time interval between two consecutive exports.
set_at: startup
@ -54,7 +60,6 @@ server_parameters:
cpp_vartype: int
redact: false
default: 1000
openTelemetryExportTimeoutMillis:
description: The timeout of an export.
set_at: startup