Skip to content

Commit ebcf7e5

Browse files
committed
minimized the grpc/absl hang case, exposed --config=hangbug to demonstrate it in x/hang
1 parent 8a5edc2 commit ebcf7e5

File tree

6 files changed

+86
-109
lines changed

6 files changed

+86
-109
lines changed

dll_deps.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def _filter_libs(deps):
1616
def dll_deps(deps):
1717
""" When building with --//:with_dll=true replaces the references to the api/sdk/exporters/ext static libraries with the single //:dll shared library """
1818
return select({
19-
"//:with_dll_enabled": ["//:dll"] + _filter_libs(deps),
19+
"@otel_sdk//:with_dll_enabled": ["@otel_sdk//:dll"] + _filter_libs(deps),
2020
"//conditions:default": deps,
2121
})
2222

x/.bazelrc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ test:devenv --run_under='"c:/windows/system32/cmd.exe" /c start /wait devenv /de
1414
#common:slrun --run_under='sudo -E --inline q:/superluminal/SuperluminalCmd.exe run windows --symbol-location q:/symbols --resolve --symbol-cache-dir q:/symcache '
1515
#common:test1 --run_under='"c:/windows/system32/cmd.exe" /k set 1>d:\\1.txt 2>d:\\2.txt && echo a '
1616

17-
common --incompatible_disable_target_provider_fields=false
17+
common --incompatible_disable_target_provider_fields=false
18+
19+
# This disables the gprc hanging fix
20+
build:hangbug --copt="-UGRPC_NO_ABSL_SYNC"
21+
build:hangbug --host_copt="-UGRPC_NO_ABSL_SYNC"
22+
build:hangbug --platform_suffix=hangbug

x/hang/BUILD.bazel

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
load("@otel_sdk//:dll_deps.bzl", "dll_deps")
2+
13
cc_test(
24
name = "hang",
3-
srcs = ["hang.cpp", "otel_sdk.cpp", "otel_sdk.h"],
4-
deps = ["@otel_sdk//:dll"],
5+
srcs = ["hang.cpp"],
6+
deps = dll_deps([
7+
"@otel_sdk//exporters/otlp:otlp_grpc_log_record_exporter",
8+
"@otel_sdk//exporters/otlp:otlp_grpc_metric_exporter",
9+
]),
510
size = "enormous",
611
timeout = "eternal",
712
)

x/hang/hang.cpp

Lines changed: 72 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,80 @@
1-
#include "otel_sdk.h"
2-
3-
#include <opentelemetry/version.h>
41
#include <opentelemetry/logs/provider.h>
52
#include <opentelemetry/metrics/provider.h>
63

7-
int main(int argc, const char* argv[])
4+
#include <opentelemetry/sdk/logs/logger_provider_factory.h>
5+
#include <opentelemetry/sdk/metrics/meter_provider_factory.h>
6+
7+
#include <opentelemetry/sdk/logs/batch_log_record_processor_factory.h>
8+
#include <opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h>
9+
10+
#include <opentelemetry/exporters/otlp/otlp_grpc_log_record_exporter_factory.h>
11+
#include <opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_factory.h>
12+
13+
namespace otel_sdk
814
{
9-
using namespace opentelemetry;
15+
using namespace opentelemetry;
16+
17+
struct instance
18+
{
19+
instance();
20+
~instance();
21+
};
22+
23+
static void init_metrics()
24+
{
25+
exporter::otlp::OtlpGrpcMetricExporterOptions exporterOptions;
26+
exporterOptions.endpoint = "localhost:65534";
27+
exporterOptions.max_concurrent_requests = 0;
28+
auto exporter{ exporter::otlp::OtlpGrpcMetricExporterFactory::Create( exporterOptions ) };
29+
sdk::metrics::PeriodicExportingMetricReaderOptions readerOptions;
30+
readerOptions.export_interval_millis = std::chrono::milliseconds(500);
31+
readerOptions.export_timeout_millis = std::chrono::milliseconds(250);
32+
auto reader{ sdk::metrics::PeriodicExportingMetricReaderFactory::Create( std::move( exporter ), readerOptions ) };
33+
auto meterProvider{ sdk::metrics::MeterProviderFactory::Create() };
34+
meterProvider->AddMetricReader( std::move( reader ) );
35+
metrics::Provider::SetMeterProvider( std::move( meterProvider ) );
36+
}
1037

11-
otel_sdk::instance instance;
12-
std::unique_ptr<metrics::Counter<double>> counter;
13-
14-
auto provider = metrics::Provider::GetMeterProvider();
15-
auto meter{ provider->GetMeter("malkia_test_meter", "1.2.0") };
16-
std::vector<std::unique_ptr<metrics::Counter<double>>> counters;
17-
counters.reserve(10);
18-
for(int i=0; i<10; i++)
19-
{
20-
char buf[100];
21-
sprintf(buf,"counter_%d", i);
22-
counters.push_back( std::move( meter->CreateDoubleCounter(buf)));
23-
}
24-
for(int i=0; i<10; i++)
25-
{
26-
counters[i]->Add(1);
27-
}
28-
std::this_thread::sleep_for(std::chrono::seconds(2));
29-
30-
quick_exit(0);
3138

39+
static void init_logs()
40+
{
41+
exporter::otlp::OtlpGrpcLogRecordExporterOptions exporterOptions;
42+
exporterOptions.endpoint = "localhost:65535";
43+
exporterOptions.max_concurrent_requests = 0;
44+
auto exporter = exporter::otlp::OtlpGrpcLogRecordExporterFactory::Create( exporterOptions );
45+
sdk::logs::BatchLogRecordProcessorOptions processorOptions;
46+
processorOptions.max_export_batch_size = 8192;
47+
processorOptions.max_queue_size = 65536;
48+
processorOptions.schedule_delay_millis = std::chrono::milliseconds{ 10000 };
49+
auto processor = sdk::logs::BatchLogRecordProcessorFactory::Create( std::move( exporter ), processorOptions );
50+
std::vector<std::unique_ptr<sdk::logs::LogRecordProcessor>> logRecordProcessors;
51+
logRecordProcessors.emplace_back( std::move( processor ) );
52+
auto loggerProvider( sdk::logs::LoggerProviderFactory::Create( std::move( logRecordProcessors ) ) );
53+
logs::Provider::SetLoggerProvider( std::move( loggerProvider ) );
54+
}
55+
56+
instance::instance()
57+
{
58+
init_metrics();
59+
init_logs();
60+
_Exit(0);
61+
}
62+
63+
instance::~instance()
64+
{
65+
auto meterProvider{ std::dynamic_pointer_cast<sdk::metrics::MeterProvider>( metrics::Provider::GetMeterProvider() ) };
66+
auto logProvider{ std::dynamic_pointer_cast<sdk::logs::LoggerProvider>( logs::Provider::GetLoggerProvider() ) };
67+
if( meterProvider )
68+
meterProvider->Shutdown(std::chrono::seconds(1));
69+
if( logProvider )
70+
logProvider->Shutdown(std::chrono::seconds(1));
71+
metrics::Provider::SetMeterProvider( {} );
72+
logs::Provider::SetLoggerProvider( {} );
73+
}
74+
} // namespace otel_sdk
75+
76+
int main(int argc, const char* argv[])
77+
{
78+
otel_sdk::instance instance;
3279
return 0;
3380
}

x/hang/otel_sdk.cpp

Lines changed: 0 additions & 70 deletions
This file was deleted.

x/hang/otel_sdk.h

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)