我正在使用 OpenTelemetry 的指标来获取有关我的环境的信息。
我有几个租户将使用 OpenTelemetry,并将全部引入 Prometheus,然后引入 Grafana。
我想通过添加一些标签/标签/属性来区分每一个。
我正在使用下面的配置,但是当我使用
UseOpenTelemetryPrometheusScrapingEndpoint
扩展方法公开 /metrics 端点时,该属性未显示。
services.AddOpenTelemetry()
.WithMetrics(opts =>
{
opts.ConfigureResource(resourceBuilder =>
{
resourceBuilder.AddTelemetrySdk();
resourceBuilder.AddService(serviceName: "tenant_service_config");
resourceBuilder.AddAttributes(new Dictionary<string, object> { ["tenant_id"] = 2 });
})
.AddMeter(meters.MetricName)
.AddAspNetCoreInstrumentation()
.AddProcessInstrumentation()
.AddRuntimeInstrumentation();
但是,如果我手动创建一个指标并添加标签,它确实会显示在 /metrics 端点中
_userLoginCounter.Add(1, new KeyValuePair<string, object>("tenant.id", tenantId));
检查配置是否正确:所需的 OpenTelemetry、Prometheus 和 ASP.NET Core 包已安装并配置正确。
为每个指标添加标签
使用 MeterProvider 设置默认标签
services.AddOpenTelemetryMetrics(builder =>
{
builder.ConfigureResource(resourceBuilder =>
{
resourceBuilder.AddTelemetrySdk();
resourceBuilder.AddService("tenant_service_config");
})
.AddMeter("YourMeterName")
.AddAspNetCoreInstrumentation()
.AddProcessInstrumentation()
.AddRuntimeInstrumentation()
.AddPrometheusExporter(options =>
{
options.StartHttpListener = true;
options.HttpListenerPrefixes = new string[] { "http://localhost:9464/" };
});
builder.AddView(instrument =>
{
return new MetricStreamConfiguration
{
TagKeys = new string[] { "tenant_id" },
TagValues = new string[] { "2" }
};
});
});
手动为指标添加标签:如果您想在创建指标时手动添加标签,可以这样做:
var counter = meter.CreateCounter<long>("user_login_count");
counter.Add(1, new KeyValuePair<string, object>("tenant_id", 2));
资源属性似乎没有正确附加到指标。
services.AddOpenTelemetry()
.WithMetrics(opts =>
{
opts.ConfigureResource(resourceBuilder =>
{
resourceBuilder.AddTelemetrySdk();
resourceBuilder.AddService(serviceName: "tenant_service_config");
resourceBuilder.AddAttributes(new Dictionary<string, object> { ["tenant_id"] = "2" }); // Make sure the tenant_id is a string
})
.AddMeter(meters.MetricName)
.AddAspNetCoreInstrumentation()
.AddProcessInstrumentation()
.AddRuntimeInstrumentation();
opts.AddPrometheusExporter(); // Ensure Prometheus Exporter is added
});
// Expose the Prometheus metrics endpoint
app.UseOpenTelemetryPrometheusScrapingEndpoint();
在此配置中:
tenant_id
添加为字符串属性。UseOpenTelemetryPrometheusScrapingEndpoint
公开 Prometheus 指标端点。接下来验证您的tenant_id属性是否在自定义指标中正确定义和使用。
var meter = new Meter("MyApp.Metrics", "1.0");
var loginCounter = meter.CreateCounter<int>("user_logins");
loginCounter.Add(1, new KeyValuePair<string, object>("tenant_id", "2"));
此处,
tenant_id
属性直接添加到自定义指标中。我们需要确保tenant_id与您的资源属性中使用的格式匹配。