在我的 C++ 项目中,我使用 opentelemetry (v1.14.2) 来收集跟踪和日志。现在我想使用仪表仪器(双可观察仪表)和 otlp http/grpc 导出器添加指标集合。我阅读了官方文档和许多其他资源,但没有找到任何仪表使用示例。
我尝试了以下代码:
void InitMetrics(const std::string& name)
{
opentelemetry::exporter::otlp::OtlpHttpMetricExporterOptions opts;
opts.url = "http://ip:port/v1/metrics";
auto exporter = std::make_unique<otlpexportmetrics::OtlpHttpMetricExporter>(opts);
metric_sdk::PeriodicExportingMetricReaderOptions options;
options.export_interval_millis = std::chrono::milliseconds(1000);
options.export_timeout_millis = std::chrono::milliseconds(500);
std::shared_ptr<metric_sdk::MetricReader> reader{
new metric_sdk::PeriodicExportingMetricReader(std::move(exporter),
options)};
auto provider = std::shared_ptr<metrics_api::MeterProvider>(
new metric_sdk::MeterProvider());
auto p = std::static_pointer_cast<metric_sdk::MeterProvider>(provider);
p->AddMetricReader(std::move(reader));
}
void GaugeExample(const std::string& name)
{
std::string gauge_name = name + "_gauge";
auto meter = metrics_api::Provider::GetMeterProvider()->GetMeter(name+"_meter", "1.0.0", "");
auto gauge = meter->CreateDoubleObservableGauge(gauge_name, "pressure", "MPa");
gauge->AddCallback([](opentelemetry::metrics::ObserverResult res, void* state){
nostd::shared_ptr<opentelemetry::metrics::ObserverResultT<double>> obs;
obs->Observe(5.6, {{"service.name", "example"}});
res.emplace<nostd::shared_ptr<opentelemetry::metrics::ObserverResultT<double>>>(obs);
}, nullptr);
}
int main()
{
InitMetrics("example");
GaugeExample("example");
std::this_thread::sleep_for(std::chrono::seconds(20));
std::shared_ptr<metrics_api::MeterProvider> none;
metrics_api::Provider::SetMeterProvider(none);
return 0;
}
我用 otlp 收集器设置了 SigNoz,并希望在那里查看指标(日志和跟踪导出良好,端点 100% 正确),但我的指标甚至没有进入 otlp 收集器,并且在执行我的程序时出现以下警告:
[Warning] File: /home/user/vcpkg/buildtrees/opentelemetry-cpp/src/v1.14.2-8c1c1d9b6b.clean/sdk/src/metrics/metric_reader.cc:37 MetricReader::Collect invoked while Shutdown in progress!
有人能给我任何仪表使用的工作示例吗?
Gauge 指标是可观察指标,它与 ObservableCounter 有点相似,所以这可能会有所帮助(observable_counter_example): https://github.com/open-telemetry/opentelemetry-cpp/blob/main/examples/common/metrics_foo_library/foo_library.cc