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

オープン
#3,555 コメント 3 件 リアクション 0 件 担当者 1 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@lalitb がすでに取り組んでいます。

2025年8月25日 から。

評価

この issue はまだ評価されていません。

説明

bug Stale triage/accepted

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) ()
主要言語
C++
スター
1.4k
フォーク
660
平均マージ
1日 12時間
マージ済み PR(30日)
47

環境構築

Codespaces で開く

このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

open-telemetry/opentelemetry-cpp のほかの issue

open-telemetry/opentelemetry-cpp の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。