mirror of https://github.com/mongodb/mongo
SERVER-114795 Add a server parameter for compression of OTel Metrics (#44960)
GitOrigin-RevId: 27dcf18987162dea69a0a9a4f83d3a038b3cf2ae
This commit is contained in:
parent
e7bd8b0308
commit
46fd0f67d1
|
|
@ -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
|
||||
void validateOptions() {
|
||||
uassert(
|
||||
ErrorCodes::InvalidOptions,
|
||||
"featureFlagOtelMetrics must be enabled in order to export OpenTelemetry metrics",
|
||||
gFeatureFlagOtelMetrics.isEnabled() ||
|
||||
(gOpenTelemetryMetricsHttpEndpoint.empty() && gOpenTelemetryMetricsDirectory.empty()));
|
||||
|
||||
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()));
|
||||
|
||||
uassert(
|
||||
ErrorCodes::InvalidOptions,
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue