我没有看到我的遥测指标导出到控制台

问题描述 投票:0回答:1

我正在编写一些概念验证代码,这是一个原型,用于熟悉使用开放遥测库导出指标。我一定忽略了一个细节,因为我看到 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);

这是我所看到的:

enter image description here

创建 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();
c# open-telemetry otel meter
1个回答
0
投票

我发现了问题。创建仪表时,仪表的 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.

Console Output

© www.soinside.com 2019 - 2024. All rights reserved.