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(); } }
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(); } }