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);
            }
        }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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();
 }
Exemplo n.º 11
0
        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));
        }