Exemplo n.º 1
0
        public void WorkerThread()
        {
            this.httpListener.Start();

            try
            {
                while (!this.token.IsCancellationRequested)
                {
                    var ctxTask = this.httpListener.GetContextAsync();
                    ctxTask.Wait(this.token);

                    var ctx = ctxTask.Result;

                    ctx.Response.StatusCode  = 200;
                    ctx.Response.ContentType = PrometheusMetricBuilder.ContentType;

                    using (var output = ctx.Response.OutputStream)
                    {
                        using (var writer = new StreamWriter(output))
                        {
                            foreach (var metric in this.Metrics)
                            {
                                var labels = metric.Labels;
                                var value  = metric.Value;

                                var builder = new PrometheusMetricBuilder()
                                              .WithName(metric.MetricName)
                                              .WithDescription(metric.MetricDescription);

                                builder = builder.WithType("counter");

                                foreach (var label in labels)
                                {
                                    var metricValueBuilder = builder.AddValue();
                                    metricValueBuilder = metricValueBuilder.WithValue(value);
                                    metricValueBuilder.WithLabel(label.Key, label.Value);
                                }

                                builder.Write(writer);
                            }
                        }
                    }
                }
            }
            catch (OperationCanceledException)
            {
                // this will happen when cancellation will be requested
            }
            catch (Exception)
            {
                // TODO: report error
            }
            finally
            {
                this.httpListener.Stop();
                this.httpListener.Close();
            }
        }
Exemplo n.º 2
0
        public void WorkerThread()
        {
            this.httpListener.Start();

            try
            {
                while (!this.token.IsCancellationRequested)
                {
                    var ctxTask = this.httpListener.GetContextAsync();
                    ctxTask.Wait(this.token);

                    var ctx = ctxTask.Result;

                    ctx.Response.StatusCode  = 200;
                    ctx.Response.ContentType = PrometheusMetricBuilder.ContentType;

                    using (var output = ctx.Response.OutputStream)
                    {
                        using (var writer = new StreamWriter(output))
                        {
                            foreach (var view in this.viewManager.AllExportedViews)
                            {
                                var data = this.viewManager.GetView(view.Name);

                                var builder = new PrometheusMetricBuilder()
                                              .WithName(data.View.Name.AsString)
                                              .WithDescription(data.View.Description);

                                builder = data.View.Aggregation.Match <PrometheusMetricBuilder>(
                                    (agg) => { return(builder.WithType("gauge")); },     // Func<ISum, M> p0
                                    (agg) => { return(builder.WithType("counter")); },   // Func< ICount, M > p1,
                                    (agg) => { return(builder.WithType("histogram")); }, // Func<IMean, M> p2,
                                    (agg) => { return(builder.WithType("histogram")); }, // Func< IDistribution, M > p3,
                                    (agg) => { return(builder.WithType("gauge")); },     // Func<ILastValue, M> p4,
                                    (agg) => { return(builder.WithType("gauge")); });    // Func< IAggregation, M > p6);

                                foreach (var value in data.AggregationMap)
                                {
                                    var metricValueBuilder = builder.AddValue();

                                    // TODO: This is not optimal. Need to refactor to split factory into separate functions
                                    metricValueBuilder = value.Value.Match <PrometheusMetricBuilder.PrometheusMetricValueBuilder>(
                                        metricValueBuilder.WithValue,
                                        metricValueBuilder.WithValue,
                                        metricValueBuilder.WithValue,
                                        metricValueBuilder.WithValue,
                                        metricValueBuilder.WithValue,
                                        metricValueBuilder.WithValue,
                                        metricValueBuilder.WithValue,
                                        metricValueBuilder.WithValue);

                                    for (var i = 0; i < value.Key.Values.Count; i++)
                                    {
                                        metricValueBuilder.WithLabel(data.View.Columns[i], value.Key.Values[i]);
                                    }
                                }

                                builder.Write(writer);
                            }
                        }
                    }
                }
            }
            catch (OperationCanceledException)
            {
                // this will happen when cancellation will be requested
            }
            catch (Exception)
            {
                // TODO: report error
            }
            finally
            {
                this.httpListener.Stop();
                this.httpListener.Close();
            }
        }