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