nuget中搜索metrics,如圖:
class Program
{
static void Main(string[] args)
{
Metric.Config
// Web監視儀表板,提供Metrics.NET度量值圖表
.WithHttpEndpoint("http://localhost:1234/metrics/")
// 配置報表輸出
.WithReporting((rc)=>{
// 報表輸出到控制台
rc.WithConsoleReport(TimeSpan.FromSeconds(5));
});
Console.ReadLine();
}
}
static void GaugeTest()
{
Metric.Gauge("test.gauge", () => ran.NextDouble() * 1000, Unit.None);
}
static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);
static void CounterTest()
{
var counter = Metric.Counter("test.counter", Unit.Custom("並發"));
Action doWork = () => { System.Threading.Thread.Sleep(ran.Next(10, 300)); };
Action idlesse = () => { System.Threading.Thread.Sleep(ran.Next(0, 500)); };
for (var i = 0; i < 20; i++)
{
Task.Run(() =>
{
while (true)
{
counter.Increment();
doWork();
counter.Decrement();
idlesse();
}
});
}
}
static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);
static void HistogramTest()
{
var histogram = Metric.Histogram("test.histogram", Unit.Custom("歲"), SamplingType.LongTerm);
Task.Run(() =>
{
while (true)
{
histogram.Update(ran.Next(10, 80), ran.Next(0, 2) > 0 ? "男" : "女");
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
}
});
}
static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);
static void MeterTest()
{
var meter = Metric.Meter("test.meter", Unit.Calls, TimeUnit.Seconds);
Action idlesse = () => { System.Threading.Thread.Sleep(ran.Next(20, 50)); };
Task.Run(() => {
while(true)
{
meter.Mark();
idlesse();
}
});
}
static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);
static void TimerTest()
{
var timer = Metric.Timer("test.meter", Unit.None, SamplingType.FavourRecent, TimeUnit.Seconds, TimeUnit.Microseconds);
Action doWork = () => { System.Threading.Thread.Sleep(ran.Next(10, 300)); };
Action idlesse = () => { System.Threading.Thread.Sleep(ran.Next(0, 500)); };
for (var i = 0; i < 20; i++)
{
Task.Run(() =>
{
while (true)
{
timer.Time(doWork);
idlesse();
}
});
}
}
static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);
static void HealthCheckTest()
{
HealthChecks.RegisterHealthCheck("test.healthcheck", () =>
{
return ran.Next(100) < 5 ? HealthCheckResult.Unhealthy() : HealthCheckResult.Healthy();
});
}
健康狀況檢查很簡單,輸出就兩個值:健康(healthy)、不健康(unhealthy)。
{
"Count" : "long"
"Items" : [{
"Item" : "string",
"Count" : "long",
"Percent" : "double"
}]
}
HistogramValue
{
"Count" : "long",
"LastValue" : "double",
"LastUserValue" : "string",
"Max" : "double",
"MaxUserValue" : "string",
"Mean" : "double",
"Min" : "double";
"MinUserValue" : "string",
"StdDev" : "double",
"Median" : "double",
"Percentile75" : "double",
"Percentile95" : "double",
"Percentile98" : "double",
"Percentile99" : "double",
"Percentile999" : "double",
"SampleSize" : "int"
}
MeterValue
{
"Count" : "long",
"MeanRate" : "double",
"OneMinuteRate" : "double",
"FiveMinuteRate" : "double",
"FifteenMinuteRate" : "double",
"RateUnit" : "TimeUnit",
"Items" : [{
"Item" : "string",
"Percent" : "double",
"Value" : {
"Count" : "long",
"MeanRate" : "double",
"OneMinuteRate" : "double",
"FiveMinuteRate" : "double",
"FifteenMinuteRate" : "double",
"RateUnit" : "TimeUnit"
}
}]
}
TimerValue
{
"Rate" : "MeterValue",
"Histogram" : "HistogramValue",
"ActiveSessions" : "long"
}
使用時讀取,無需額外函數支持
Increase(long value=1, string item=null) : void //增加計數
Decrease(long value=1, string item=null) : void //減少計數
Update(double value, string userValue=null) : void
Mark(long count=1, string item=null) : void
Record(long duration, TimeUnit unit, string userValue=null) : void
Timer(Action action, string userValue=null) : void
Timer<T>(Func<T> action, string userValue=null) : T
MetricsDemo.rar