You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:06:13