33using System . Collections . Generic ;
44using System . Net ;
55using Prometheus . Client . Collectors ;
6+ using System . IO ;
7+ using System . Text ;
8+ using System . Diagnostics ;
69
710namespace Prometheus . Client . MetricServer
811{
@@ -12,6 +15,7 @@ namespace Prometheus.Client.MetricServer
1215 public class MetricServer : BaseMetricServer , IMetricServer
1316 {
1417 private readonly HttpListener _httpListener = new HttpListener ( ) ;
18+ private bool _isListening = false ;
1519
1620 /// <summary>
1721 /// Constructor
@@ -51,32 +55,47 @@ public MetricServer(string hostname, int port, string url, IEnumerable<IOnDemand
5155 public void Start ( )
5256 {
5357 _httpListener . Start ( ) ;
54- _httpListener . BeginGetContext ( ar =>
58+ _isListening = true ;
59+
60+ while ( _isListening )
5561 {
56- var httpListenerContext = _httpListener . EndGetContext ( ar ) ;
57- var request = httpListenerContext . Request ;
58- var response = httpListenerContext . Response ;
62+ try
63+ {
64+ HttpListenerContext context = _httpListener . GetContext ( ) ;
65+ HttpListenerRequest request = context . Request ;
66+ HttpListenerResponse response = context . Response ;
5967
60- response . StatusCode = 200 ;
68+ string requestBody ;
69+ Stream inputStream = request . InputStream ;
70+ Encoding encoding = request . ContentEncoding ;
71+ StreamReader reader = new StreamReader ( inputStream , encoding ) ;
72+ requestBody = reader . ReadToEnd ( ) ;
73+ response . StatusCode = 200 ;
6174
62- var acceptHeader = request . Headers . Get ( "Accept" ) ;
63- var acceptHeaders = acceptHeader ? . Split ( ',' ) ;
64- var contentType = ScrapeHandler . GetContentType ( acceptHeaders ) ;
65- response . ContentType = contentType ;
75+ var acceptHeader = request . Headers . Get ( "Accept" ) ;
76+ var acceptHeaders = acceptHeader ? . Split ( ',' ) ;
77+ var contentType = ScrapeHandler . GetContentType ( acceptHeaders ) ;
78+ response . ContentType = contentType ;
79+
80+ using ( Stream outputStream = response . OutputStream )
81+ {
82+ var collected = Registry . CollectAll ( ) ;
83+ ScrapeHandler . ProcessScrapeRequest ( collected , contentType , outputStream ) ;
84+ }
85+ }
6686
67- using ( var outputStream = response . OutputStream )
87+ catch ( HttpListenerException ex )
6888 {
69- var collected = Registry . CollectAll ( ) ;
70- ScrapeHandler . ProcessScrapeRequest ( collected , contentType , outputStream ) ;
89+ Trace . WriteLine ( $ "Error in MetricsServer: { ex } ") ;
7190 }
91+ }
7292
73- response . Close ( ) ;
74- } , null ) ;
7593 }
7694
7795 /// <inheritdoc />
7896 public void Stop ( )
7997 {
98+ _isListening = false ;
8099 _httpListener . Stop ( ) ;
81100 _httpListener . Close ( ) ;
82101 }
0 commit comments