public void Handle(IHttpRequest request, IHttpResponse response) { // Largely cribbed from https://github.com/prometheus-net/prometheus-net/blob/master/Prometheus.NetStandard/MetricServer.cs MetricFamily[] metrics; try { metrics = _registry.CollectAll().ToArray(); _logger.Trace($"{nameof(MetricsActivityHandler)}.{nameof(Handle)}", new LogItem("Event", "CollectAll result"), new LogItem("MetricsCount", metrics.Length)); var acceptHeader = request.RequestHeader["Accept"]; var acceptHeaders = acceptHeader?.Split(','); var contentType = ScrapeHandler.GetContentType(acceptHeaders); response.HttpStatusCode = HttpStatusCode.OK; response.HttpContent = new MetricsHttpContent(_logger, metrics, contentType); } catch (Exception ex) { _logger.Error($"{nameof(MetricsActivityHandler)}.{nameof(Handle)}", new LogItem("Event", "ScrapeFailed"), new LogItem("Exception", ex.Message), new LogItem("StackTrace", ex.StackTrace)); response.HttpStatusCode = HttpStatusCode.ServiceUnavailable; response.SetStringContent(ex.Message); } }
public IActionResult Index() { try { var metrics = _registry.CollectAll().ToArray(); _logger.Trace($"{nameof(MetricsController)}.{nameof(Handle)}", new LogItem("Event", "CollectAll result"), new LogItem("MetricsCount", metrics.Length)); var acceptHeader = Request.Headers["Accept"]; var acceptHeaders = acceptHeader.ToArray(); var contentType = ScrapeHandler.GetContentType(acceptHeaders); var metricsContent = new MetricsHttpContent(_logger, metrics, contentType); Response.StatusCode = (int)HttpStatusCode.OK; Response.ContentType = contentType; metricsContent.WriteToStream(Response.Body); return(new EmptyResult()); } catch (Exception ex) { _logger.Error($"{nameof(MetricsController)}.{nameof(Handle)}", new LogItem("Event", "ScrapeFailed"), new LogItem("Exception", ex.Message), new LogItem("StackTrace", ex.StackTrace)); return(StatusCode((int)HttpStatusCode.ServiceUnavailable, ex.Message)); } }
private void StartLoop(IScheduler scheduler) { //delegate allocations below - but that's fine as it's not really on the "critical path" (polled relatively infrequently) - and it's much more readable this way scheduler.Schedule(repeatAction => _httpListener.BeginGetContext(ar => { try { var httpListenerContext = _httpListener.EndGetContext(ar); var request = httpListenerContext.Request; var response = httpListenerContext.Response; response.StatusCode = 200; var acceptHeader = request.Headers.Get("Accept"); var acceptHeaders = acceptHeader == null ? null : acceptHeader.Split(','); var contentType = ScrapeHandler.GetContentType(acceptHeaders); response.ContentType = contentType; using (var outputStream = response.OutputStream) { var collected = _registry.CollectAll(); ScrapeHandler.ProcessScrapeRequest(collected, contentType, outputStream); } response.Close(); } catch (Exception e) { Trace.WriteLine(string.Format("Error in MetricsServer: {0}", e)); } repeatAction.Invoke(); }, null)); }
public void Configure(IApplicationBuilder app) { app.Run(context => { if (context.Request.Path == _url) { var response = context.Response; var request = context.Request; response.StatusCode = 200; var acceptHeader = request.Headers["Accept"]; var contentType = ScrapeHandler.GetContentType(acceptHeader); response.ContentType = contentType; using (var outputStream = response.Body) { var collected = _registry.CollectAll(); ScrapeHandler.ProcessScrapeRequest(collected, contentType, outputStream); } return(Task.FromResult(true)); } context.Response.StatusCode = 404; return(Task.FromResult(true)); }); }
protected static Stream CollectionToStreamWriter(ICollectorRegistry registry) { var metrics = registry.CollectAll(); var stream = new MemoryStream(); ScrapeHandler.ProcessScrapeRequest(metrics, ContentType, stream); stream.Position = 0; return(stream); }
public static MemoryStream Process(ICollectorRegistry registry) { // leave open var stream = new MemoryStream(); var collected = registry.CollectAll(); TextFormatter.Format(stream, collected.ToArray()); stream.Position = 0; return(stream); }
public async Task WriteAsync(StreamWriter writer) { if (writer is null) { throw new ArgumentNullException(nameof(writer)); } var collected = _registry.CollectAll(); await Serializer.SerializeAsync(writer, collected).ConfigureAwait(false); }
public async Task Invoke(HttpContext context) { // We just handle the root URL (/metrics or whatnot). if (!string.IsNullOrWhiteSpace(context.Request.Path.Value)) { await _next(context); return; } var request = context.Request; var response = context.Response; var acceptHeaders = request.Headers["Accept"]; var contentType = ScrapeHandler.GetContentType(acceptHeaders); response.ContentType = contentType; IEnumerable <MetricFamily> metrics; try { metrics = _registry.CollectAll(); } catch (ScrapeFailedException ex) { response.StatusCode = 503; if (!string.IsNullOrWhiteSpace(ex.Message)) { using (var writer = new StreamWriter(response.Body)) await writer.WriteAsync(ex.Message); } return; } response.StatusCode = 200; using (var outputStream = response.Body) ScrapeHandler.ProcessScrapeRequest(metrics, contentType, outputStream); }
public static void Process(ICollectorRegistry registry, Stream outputStream) { var collected = registry.CollectAll(); TextFormatter.Format(outputStream, collected.ToArray()); }
public override void Act() { _pushService.PushAsync(_metrics.CollectAll(), "http://localhost:9091", "pushgateway", Environment.MachineName, null).GetAwaiter().GetResult(); }
private Task StartServer(CancellationToken cancel) { _httpListener.Start(); return(Task.Factory.StartNew(delegate { try { while (!cancel.IsCancellationRequested) { var getContext = _httpListener.GetContextAsync(); getContext.Wait(cancel); var context = getContext.Result; var request = context.Request; var response = context.Response; try { if (authMode == "None" || CheckAuthenticate(context)) { IEnumerable <MetricFamily> metrics; metrics = _registry.CollectAll(); var acceptHeader = request.Headers.Get("Accept"); var acceptHeaders = acceptHeader?.Split(','); var contentType = ScrapeHandler.GetContentType(acceptHeaders); response.ContentType = contentType; response.StatusCode = 200; using (var outputStream = response.OutputStream) ScrapeHandler.ProcessScrapeRequest(metrics, contentType, outputStream); } else { throw new InvalidHeader(); } } catch (InvalidHeader ex) { response.StatusCode = 404; //tell something about invalid header } catch (Exception ex) when(!(ex is OperationCanceledException)) { Trace.WriteLine(string.Format("Error in MetricsServer: {0}", ex)); response.StatusCode = 404; } finally { response.Close(); } } } finally { _httpListener.Stop(); _httpListener.Close(); } }, TaskCreationOptions.LongRunning)); }