asp.net core監視—Prometheusを導入（五）

内容：前のブログで、Prometheusには4種類のメトリクスタイプがあることを説明しました：Counter（カウンタ）、Gauge（ゲージ）、Histogram（ヒストグラム）、Summary（サマリ）。そして、Counterのデモを作成しましたが、次にHistogramについて見てみましょう。
3、Summary：サマリ
サマリはパーセンタイルを収集し表示します。パーセンタイルの定義：数字が小さい順に並んだ一連の中で、特定の数字が90%以上の数字より大きい場合、その数字は90番目のパーセンタイルとなります。
デモを通じて理解してみましょう。たとえば、注文金額の10、30、50、70、90のパーセンタイルを知りたいというビジネス要件がある場合、どのように実現しますか？
MetricsHub.csにSummary型の指標収集集合を追加する必要があります：
```csharp
using Prometheus;
using System.Collections.Generic;

namespace PrometheusSample.Middlewares
{
    public class MetricsHub
    {
        private static Dictionary<string, Counter> _counterDictionary = new Dictionary<string, Counter>();
        private static Dictionary<string, Dictionary<string, Gauge>> _gaugeDictionary = new Dictionary<string, Dictionary<string, Gauge>>();
        private static Dictionary<string, Summary> _summaryDictionary = new Dictionary<string, Summary>();
        private static Dictionary<string, Histogram> _histogramDictionary = new Dictionary<string, Histogram>();

        // 他のメソッドを省略

        public void AddSummary(string key, Summary summary)
        {
            _summaryDictionary.Add(key, summary);
        }
    }
}
```
次に、BusinessMetricsMiddlewareのミドルウェアにSummaryメトリクスを処理するコードを追加します：

```csharp
// 省略

using Microsoft.AspNetCore.Http;
using PrometheusSample.Models;
using System.IO;
using System.Threading.Tasks;

namespace PrometheusSample.Middlewares
{
    /// <summary>
    /// 要求記録中間件
    /// </summary>
    public class BusinessMetricsMiddleware
    {
        private readonly RequestDelegate _next;

        public BusinessMetricsMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        // 省略

        var summary = metricsHub.GetSummary(context.Request.Path);
        if (summary != null)
        {
            var parseResult = int.TryParse(result.Data.ToString(), out int i);
            if (parseResult)
            {
                summary.Observe(i);
            }
        }
    }
}
```
それから、Starsupで対応するurlのSummaryパラメータを設定します：

```csharp
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using Prometheus;
using PrometheusSample.Middlewares;
using PrometheusSample.Services;
using System.Collections.Generic;

namespace PrometheusSample
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // 省略

        void MetricsHandle(IServiceCollection services)
        {
            var metricsHub = new MetricsHub();

            // 省略
            
            //summary
            var orderSummary = Metrics.CreateSummary("business_order_summary", "10分以内の注文数",
            new SummaryConfiguration
            {
                Objectives = new[]
                {
                    new QuantileEpsilonPair(0.1, 0.05),
                    new QuantileEpsilonPair(0.3, 0.05),
                    new QuantileEpsilonPair(0.5, 0.05),
                    new QuantileEpsilonPair(0.7, 0.05),
                    new QuantileEpsilonPair(0.9, 0.05),
                }
            });

            metricsHub.AddSummary("/order", orderSummary);

            // 省略

            services.AddSingleton(metricsHub);
        }
    }
}
```

実は new QuantileEpsilonPair(0.1, 0.05) の第一引数はパーセンタイルで、0.05は誤差で、範囲は10%-5%、10%+5%です。

最後のステップは、Grafanaを開いて表示チャートを設定することです。

![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRAHk0GFVCeROvoBbMPEa1Ldax8GmnlS34Qaabjek9vemia0veTPQl4I7sXT68dOQEQsSp04KWnTN3A/640?wx_fmt=png)

最終的な表示結果：

![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRAHk0GFVCeROvoBbMPEa1LdGPS1a9975zlOYCOGx1uMMFt0ic4dQENOHo0MlsjeJt0aquARMOOttHw/640?wx_fmt=png)

同時に、例では最大値、最小値、平均、総計、現在値を参考にしています。

（Translated by GPT）

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247483788&idx=1&sn=8ab37dbe649bcc095efa6d44792e3d36&chksm=9f005ea6a877d7b0f33cae6063405b6eac812c713a659522f974ddd5c3cabfacdc770ccbd6a0&token=418912929&lang=zh_CN#rd