Skip to content

AddCallback() for metrics (gauge) causes a pure virtual method called error #3555

@Sowmya-Iyer

Description

@Sowmya-Iyer

The opentelemetry was built through CMake and imported as a cc_library with .so files into my Bazel environment.

  • OpenTelemetry - v1.18.0
  • Openssl - v3.0.15
  • curl -v8.10.1
  • abseil v20240116.1

Steps to reproduce

 void GaugeMetric::gauge_callback(metrics_api::ObserverResult result,
                                    void *state)
   {
      auto *instance = static_cast<GaugeMetric *>(state);
      if (opentelemetry::nostd::holds_alternative<opentelemetry::nostd::shared_ptr<metrics_api::ObserverResultT<double> > >(result))
      {
         auto observer_result = opentelemetry::nostd::get<opentelemetry::nostd::shared_ptr<metrics_api::ObserverResultT<double> > >(result);
         if (!instance->baggage.is_empty())
         {
            MaStr<Str> bag { { "test_baggage", "test_fixture" } };
            std::initializer_list<std::pair<opentelemetry::nostd::string_view, opentelemetry::common::AttributeValue> > attributes = {
               { "key1",     123 },
               { "key2",    45.6 },
               { "key3", "value" },
            };
            
            observer_result->Observe(instance->value.load(), bag);
            std::cout << "after" << std::endl;
         }
         else
         {
            observer_result->Observe(instance->value.load());
         }
      }
   }
void GaugeMetric::set_value(const double& val)
   {
      std::call_once(flag, [&]()
      {
         double_gauge->AddCallback(GaugeMetric::gauge_callback, this);
      });
      value.store(val);
   }

CleanUp code:

 auto meter_provider = dynamic_cast<metric_sdk::MeterProvider *>(metrics_api::Provider::GetMeterProvider().get());

      if (meter_provider)
      {
         meter_provider->ForceFlush();
         GB_DEBUG("Metrics force flushed.");
      }

While program termination, ForceFlush() is invoked which calls the Callback() function for GaueMetrics which ends in

pure virtual method called
terminate called without an active exception

Note: all my bazel tests pass, this is only an error occuring during program termination.

What is the expected behavior?
If the program does not add any baggage to Gauge Callback and uses only

            observer_result->Observe(instance->value.load());

the program terminates normally as expected. But adding baggage (map or std::initializer_list<std::pair<opentelemetry::nostd::string_view, opentelemetry::common::AttributeValue> > ) gives virtual method called error

Additional context
Stacktrace:

Thread 17 "test" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff4dfe640 (LWP 113816)]
__pthread_kill_implementation (no_tid=0, signo=6, threadid=140737301702208) at ./nptl/pthread_kill.c:44
44	./nptl/pthread_kill.c: No such file or directory.
(gdb) bt
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=140737301702208) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=140737301702208) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=140737301702208, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007ffff5c42476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007ffff5c287f3 in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff60a2b9e in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff60ae20c in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff60ae277 in std::terminate() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x00007ffff60aefa5 in __cxa_pure_virtual () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff6ee1ee2 in opentelemetry::v1::sdk::metrics::FilteredOrderedAttributeMap::FilteredOrderedAttributeMap(opentelemetry::v1::common::KeyValueIterable const&, opentelemetry::v1::sdk::metrics::AttributesProcessor const*)::{lambda(opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)#1}::operator()(opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >) const ()
   from /home/siyer/.cache/bazel/_bazel_siyer/3c4caa948cf49a66edd7db3c22f83b3e/execroot/_main/bazel-out/k8-fastbuild/bin/instrumentation_manager/../_solib_k8/_U_A_Aard_Uopentelemetry-cpp_S_S_Card_Uopentelemetry-cpp_Ux86_U64_Ulibs___Uopentelemetry-cpp_Ux86_Slib/libopentelemetry_metrics.so
#10 0x00007ffff6ee2126 in opentelemetry::v1::nostd::function_ref<bool (opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)>::BindTo<opentelemetry::v1::sdk::metrics::FilteredOrderedAttributeMap::FilteredOrderedAttributeMap(opentelemetry::v1::common::KeyValueIterable const&, opentelemetry::v1::sdk::metrics::AttributesProcessor const*)::{lambda(opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)#1}>(opentelemetry::v1::sdk::metrics::FilteredOrderedAttributeMap::FilteredOrderedAttributeMap(opentelemetry::v1::common::KeyValueIterable const&, opentelemetry::v1::sdk::metrics::AttributesProcessor const*)::{lambda(opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)#1}&)::{lambda(void*, opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)#1}::operator()(void*, opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >) const ()
   from /home/siyer/.cache/bazel/_bazel_siyer/3c4caa948cf49a66edd7db3c22f83b3e/execroot/_main/bazel-out/k8-fastbuild/bin/instrumentation_manager/../_solib_k8/_U_A_Aard_Uopentelemetry-cpp_S_S_Card_Uopentelemetry-cpp_Ux86_U64_Ulibs___Uopentelemetry-cpp_Ux86_Slib/libopentelemetry_metrics.so
#11 0x00007ffff6ee2180 in opentelemetry::v1::nostd::function_ref<bool (opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)>::BindTo<opentelemetry::v1::sdk::metrics::FilteredOrderedAttributeMap::FilteredOrderedAttributeMap(opentelemetry::v1::common::KeyValueIterable const&, opentelemetry::v1::sdk::metrics::AttributesProcessor const*)::{lambda(opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)#1}>(opentelemetry::v1::sdk::metrics::FilteredOrderedAttributeMap::FilteredOrderedAttributeMap(opentelemetry::v1::common::KeyValueIterable const&, opentelemetry::v1::sdk::metrics::AttributesProcessor const*)::{lambda(opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)#1}&)::{lambda(void*, opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)#1}::_FUN(void*, opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >) ()
   from /home/siyer/.cache/bazel/_bazel_siyer/3c4caa948cf49a66edd7db3c22f83b3e/execroot/_main/bazel-out/k8-fastbuild/bin/instrumentation_manager/../_solib_k8/_U_A_Aard_Uopentelemetry-cpp_S_S_Card_Uopentelemetry-cpp_Ux86_U64_Ulibs___Uopentelemetry-cpp_Ux86_Slib/libopentelemetry_metrics.so
#12 0x00005555555963b5 in opentelemetry::v1::common::KeyValueIterableView<std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::ForEachKeyValue(opentelemetry::v1::nostd::function_ref<bool (opentelemetry::v1::nostd::string_view, absl::otel_v1::variant<bool, int, long, unsigned int, double, char const*, opentelemetry::v1::nostd::string_view, opentelemetry::v1::nostd::span<bool const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned int const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<double const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<opentelemetry::v1::nostd::string_view const, 18446744073709551615ul>, unsigned long, opentelemetry::v1::nostd::span<unsigned long const, 18446744073709551615ul>, opentelemetry::v1::nostd::span<unsigned char const, 18446744073709551615ul> >)>) const ()
#13 0x00007ffff6ee1f99 in opentelemetry::v1::sdk::metrics::FilteredOrderedAttributeMap::FilteredOrderedAttributeMap(opentelemetry::v1::common::KeyValueIterable const&, opentelemetry::v1::sdk::metrics::AttributesProcessor const*) ()
   from /home/siyer/.cache/bazel/_bazel_siyer/3c4caa948cf49a66edd7db3c22f83b3e/execroot/_main/bazel-out/k8-fastbuild/bin/instrumentation_manager/../_solib_k8/_U_A_Aard_Uopentelemetry-cpp_S_S_Card_Uopentelemetry-cpp_Ux86_U64_Ulibs___Uopentelemetry-cpp_Ux86_Slib/libopentelemetry_metrics.so
#14 0x00007ffff6ee9906 in opentelemetry::v1::sdk::metrics::ObserverResultT<double>::Observe(double, opentelemetry::v1::common::KeyValueIterable const&) ()
   from /home/siyer/.cache/bazel/_bazel_siyer/3c4caa948cf49a66edd7db3c22f83b3e/execroot/_main/bazel-out/k8-fastbuild/bin/instrumentation_manager/../_solib_k8/_U_A_Aard_Uopentelemetry-cpp_S_S_Card_Uopentelemetry-cpp_Ux86_U64_Ulibs___Uopentelemetry-cpp_Ux86_Slib/libopentelemetry_metrics.so
#15 0x000055555559961c in ARD::Foundation::Instrumentation::Metrics::GaugeMetric::gauge_callback(absl::otel_v1::variant<opentelemetry::v1::nostd::shared_ptr<opentelemetry::v1::metrics::ObserverResultT<long> >, opentelemetry::v1::nostd::shared_ptr<opentelemetry::v1::metrics::ObserverResultT<double> > >, void*) ()
#16 0x00007ffff6ee4ed7 in opentelemetry::v1::sdk::metrics::ObservableRegistry::Observe(opentelemetry::v1::common::SystemTimestamp) ()
   from /home/siyer/.cache/bazel/_bazel_siyer/3c4caa948cf49a66edd7db3c22f83b3e/execroot/_main/bazel-out/k8-fastbuild/bin/instrumentation_manager/../_solib_k8/_U_A_Aard_Uopentelemetry-cpp_S_S_Card_Uopentelemetry-cpp_Ux86_U64_Ulibs___Uopentelemetry-cpp_Ux86_Slib/libopentelemetry_metrics.so
#17 0x00007ffff6e9611f in opentelemetry::v1::sdk::metrics::Meter::Collect(opentelemetry::v1::sdk::metrics::CollectorHandle*, opentelemetry::v1::common::SystemTimestamp) ()

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingtriage/acceptedIndicates an issue or PR is ready to be actively worked on.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions