diff --git a/src/ZB.MOM.WW.ScadaBridge.Host/NodeOptions.cs b/src/ZB.MOM.WW.ScadaBridge.Host/NodeOptions.cs index 8cad6907..bc01cf0c 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Host/NodeOptions.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Host/NodeOptions.cs @@ -20,4 +20,6 @@ public class NodeOptions public int RemotingPort { get; set; } = 8081; /// Gets or sets the gRPC port for the site stream server. public int GrpcPort { get; set; } = 8083; + /// HTTP/1.1 port serving the Prometheus /metrics scrape endpoint on site nodes. + public int MetricsPort { get; set; } = 8082; } diff --git a/src/ZB.MOM.WW.ScadaBridge.Host/Program.cs b/src/ZB.MOM.WW.ScadaBridge.Host/Program.cs index 73f84f7c..c7930a1d 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Host/Program.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Host/Program.cs @@ -293,6 +293,11 @@ try // Read GrpcPort from config (NodeOptions already has default 8083) var grpcPort = configuration.GetValue("ScadaBridge:Node:GrpcPort", 8083); + // Read MetricsPort from config (NodeOptions already has default 8082). + // Separate HTTP/1.1 listener so a standard HTTP/1.1 Prometheus scraper can + // reach /metrics; the gRPC port stays HTTP/2-only below. + var metricsPort = configuration.GetValue("ScadaBridge:Node:MetricsPort", 8082); + // Configure Kestrel for HTTP/2 only on the gRPC port builder.WebHost.ConfigureKestrel(options => { @@ -300,6 +305,13 @@ try { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2; }); + + // Dedicated HTTP/1.1 (and HTTP/2) listener for the Prometheus /metrics + // scrape endpoint, reachable by an HTTP/1.1 scraper. + options.ListenAnyIP(metricsPort, listenOptions => + { + listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2; + }); }); // gRPC server registration