OpenTelemetry中Prometheus Pushgateway机制的替代方案咨询
OpenTelemetry 类似 Pushgateway 的实现与 Windows 容器指标转发方案
一、OpenTelemetry 中对应 Pushgateway 的机制
OpenTelemetry 本身没有和 Prometheus Pushgateway 完全对等的组件,但可以通过两种方式实现指标主动推送的类似能力:
- 借助 OpenTelemetry Collector 作为中间接收节点,承担类似 Pushgateway 的转发角色
- 直接向自定义 Web 应用推送指标,由 Web 应用完成后续转发逻辑
二、方案1:用 OpenTelemetry Collector 实现推送流程
Collector 可以接收来自应用的 OTLP 格式指标,再转发到 Prometheus,同时还支持指标过滤、聚合等扩展能力,比原生 Pushgateway 功能更灵活。
1. Collector 配置(接收 OTLP 并转发到 Prometheus)
创建 Collector 配置文件 config.yaml:
receivers: otlp: protocols: http: endpoint: "0.0.0.0:4318" # 开放OTLP HTTP接收端口 exporters: prometheus: endpoint: "http://your-prometheus-address:9090" # 目标Prometheus地址 namespace: "windows_container_app" # 为指标添加统一命名空间 service: pipelines: metrics: receivers: [otlp] exporters: [prometheus]
2. Windows 容器应用配置 OTLP 导出器
修改你的示例代码,将指标推送到 Collector:
public class Program { private static readonly ActivitySource MyActivitySource = new("OpenTelemetry.Demo.Exemplar"); private static readonly Meter MyMeter = new("OpenTelemetry.Demo.Exemplar"); private static readonly Counter<int> RequestCounter = MyMeter.CreateCounter<int>("app.requests_total", description: "Total number of requests handled"); public static void Main() { // 追踪配置(不需要可移除) using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource("OpenTelemetry.Demo.Exemplar") .AddOtlpExporter(options => { options.Endpoint = new Uri("http://collector-host:4318/v1/traces"); options.Protocol = OtlpExportProtocol.HttpProtobuf; }) .Build(); // 指标推送配置 using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddMeter("OpenTelemetry.Demo.Exemplar") .AddOtlpExporter((exporterOptions, metricReaderOptions) => { // 指向Collector的OTLP指标接收地址 exporterOptions.Endpoint = new Uri("http://collector-host:4318/v1/metrics"); exporterOptions.Protocol = OtlpExportProtocol.HttpProtobuf; // 设置批量推送间隔,模拟Pushgateway的定时推送逻辑 metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 10000; }) .Build(); // 模拟生成指标 while (true) { RequestCounter.Add(1); Console.WriteLine("Incremented request counter"); Thread.Sleep(1000); } } }
三、方案2:直接推送到自定义 Web 应用
如果不想依赖 Collector,可以让 Windows 容器应用直接向你的 Web 应用推送指标,再由 Web 应用转发到 Prometheus。
1. 应用端推送配置
修改 OTLP 导出器的目标地址为你的 Web 应用接口:
using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddMeter("OpenTelemetry.Demo.Exemplar") .AddOtlpExporter((exporterOptions, metricReaderOptions) => { // 替换为你的Web应用的OTLP指标接收接口 exporterOptions.Endpoint = new Uri("http://your-web-app:8080/api/v1/otlp/metrics"); exporterOptions.Protocol = OtlpExportProtocol.HttpProtobuf; metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 5000; }) .Build();
2. 自定义 Web 应用接收并转发(ASP.NET Core 示例)
[ApiController] [Route("api/v1/otlp")] public class MetricsController : ControllerBase { private readonly HttpClient _prometheusClient; public MetricsController(HttpClient httpClient) { _prometheusClient = httpClient; _prometheusClient.BaseAddress = new Uri("http://your-prometheus:9090/"); } [HttpPost("metrics")] public async Task<IActionResult> ReceiveAndForwardMetrics() { // 读取OTLP格式的请求体 using var stream = new MemoryStream(); await Request.Body.CopyToAsync(stream); stream.Position = 0; // 转发到Prometheus远程写入接口(需提前开启Prometheus的remote_write配置) var response = await _prometheusClient.PostAsync("/api/v1/write", new StreamContent(stream)); response.EnsureSuccessStatusCode(); return Ok(); } }
注:如果需要兼容 Pushgateway,Web 应用也可以将 OTLP 指标转换为 Prometheus 文本格式,再推送到 Pushgateway。
四、关于 OpenTelemetry Collector 的补充
Collector 不止是替代 Pushgateway,还能提供:
- 多数据源兼容(支持 Prometheus、Jaeger 等多种格式)
- 指标过滤、聚合、标签修改等预处理能力
- 集群化部署支持,适配大规模场景
如果后续需要扩展多应用、多类型指标的收集处理,Collector 是更优的长期选择。
内容的提问来源于stack exchange,提问作者Kseniya Yudina
相关产品推荐
相关产品推荐

