我正在编写一些概念验证代码,这是一个原型,用于熟悉使用开放遥测库导出指标。我一定忽略了一个细节,因为我看到 MeterProvider 的初始化发送到控制台,但随后我没有看到我正在积累的任何指标。
我使用此示例作为指南:https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/examples/Console/TestMetrics.cs
这是我的初始化代码:
public static MeterProvider GetMeterProvider(string service, string version, string meterName, bool consoleExporter, bool OtlpExporter)
{
MeterProviderBuilder mpb = Sdk.CreateMeterProviderBuilder()
.ConfigureResource(r => r.AddService(service, null, version))
.AddMeter(meterName); // All instruments from this meter are enabled.
if (consoleExporter)
{
mpb.AddConsoleExporter((exporterOptions, metricReaderOptions) =>
{
exporterOptions.Targets = ConsoleExporterOutputTargets.Console;
metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
metricReaderOptions.TemporalityPreference = MetricReaderTemporalityPreference.Delta;
});
}
if (OtlpExporter)
{
<...snipped...>
}
return mpb.Build();
}
这是函数调用。返回值 MeterProvider 被分配给类成员变量,以在类实例的持续时间内持续存在。 (在下面的代码中,前缀 m_ 表示类成员变量。)
m_meterProvider = TelemetryUtils.GetMeterProvider(c_Service, c_Version, "Prototype", true, false);
这是我所看到的:
创建 MeterProvider 后,我创建
m_meter = new Meter("Telemetry", "8.1");
m_counter = m_meter.CreateCounter<int>("counter", "things", "A count of things");
m_histogram = m_meter.CreateHistogram<int>("histogram");
我认为这可能是我的问题。我正在创建一个 Meter,但我不明白它与 MeterProvider 有何关联?示例代码中有这样一句话:
using var provider = providerBuilder.Build();
但我不确定这个语句的作用是什么。在我的代码中,MeterProvider(MeterProviderBuilder.Build() 的输出)是 GetMeterProvider() 的功能返回;它被分配给类成员变量 m_meterProvider,该变量在类的持续时间内持续存在。无论如何,继续前进...
以下是在我的处理循环内执行的测量收集语句。我什至在其中添加了 ForceFlush 声明。但没有喜悦。我没有看到任何信息发送到控制台。我缺少什么?谢谢您的建议!
var observableCounter = m_meter.CreateObservableGauge("gauge", () =>
{
return new List<Measurement<int>>()
{
new Measurement<int>(
9999999,
new KeyValuePair<string, object>("tag1", "value1")),
};
});
m_histogram?.Record(Counter);
m_histogram?.Record(
Counter * 100,
new KeyValuePair<string, object>("tag1", "value1"));
m_counter?.Add(Counter);
m_counter?.Add(
Counter * 100,
new KeyValuePair<string, object>("tag2", "value2"));
m_meterProvider.ForceFlush();
我发现了问题。创建仪表时,仪表的 name 必须与构建 MeterProvider 时指定的相同。
我变了
m_meter = new Meter("Telemetry", "8.1");
到
m_meter = new Meter("Prototype", "8.1");
它开始按预期工作!该名称当然是任意的,但它必须与创建 MeterProvider 的 MeterProviderBuilder 上指定的名称相匹配。
MeterProviderBuilder mpb = Sdk.CreateMeterProviderBuilder()
.ConfigureResource(r => r.AddService(service, null, version))
.AddMeter(meterName); // All instruments from this meter are enabled.